DWORD64 __fastcall write_device(void
*
Src, size_t Size, DWORD dwMilliseconds)
{
/
/
参数验证
if
(!HidDeviceObject) {
return
WRITE_ERROR;
}
if
(Size > MAX_BUFFER_SIZE) {
return
WRITE_ERROR;
}
/
/
创建事件
HANDLE hEvent
=
CreateEventW(NULL, TRUE, TRUE, NULL);
if
(!hEvent) {
return
WRITE_ERROR;
}
/
/
初始化异步结构
OVERLAPPED Overlapped
=
{
0
};
ResetEvent(hEvent);
Overlapped.hEvent
=
hEvent;
/
/
准备数据缓冲区
char WriteBuffer[
1040
]
=
{
0
};
/
/
报告
ID
+
Data
memcpy(WriteBuffer
+
1
, Src, Size);
/
/
拷贝数据
/
/
写入数据
DWORD NumberOfBytesTransferred;
if
(WriteFile(HidDeviceObject, WriteBuffer, Size
+
1
, NULL, &Overlapped)) {
goto GET_RESULT;
}
/
/
处理异步写入
if
(GetLastError()
=
=
ERROR_IO_PENDING) {
DWORD waitResult
=
WaitForSingleObject(hEvent, dwMilliseconds);
if
(waitResult
=
=
258
) {
/
/
WAIT_TIMEOUT
CancelIo(HidDeviceObject);
return
WRITE_ERROR;
}
if
(waitResult) {
return
WRITE_ERROR;
}
GET_RESULT:
/
/
正确处理
if
(GetOverlappedResult(HidDeviceObject, &Overlapped, &NumberOfBytesTransferred, FALSE)) {
return
NumberOfBytesTransferred;
}
}
return
WRITE_ERROR;
}