In GetQueuedCompletionStatus function:

- change order of arguments of NtRemoveIoCompletion function,
- check maybe it returns STATUS_TIMEOUT.

svn path=/trunk/; revision=38141
This commit is contained in:
Dmitry Gorbachev 2008-12-17 05:50:20 +00:00
parent 52eab0439a
commit 466378bd87

View file

@ -99,6 +99,7 @@ GetQueuedCompletionStatus(
{ {
NTSTATUS errCode; NTSTATUS errCode;
IO_STATUS_BLOCK IoStatus; IO_STATUS_BLOCK IoStatus;
ULONG_PTR CompletionKey;
LARGE_INTEGER Interval; LARGE_INTEGER Interval;
if (!lpNumberOfBytesTransferred || !lpCompletionKey || !lpOverlapped) if (!lpNumberOfBytesTransferred || !lpCompletionKey || !lpOverlapped)
@ -113,18 +114,19 @@ GetQueuedCompletionStatus(
} }
errCode = NtRemoveIoCompletion(CompletionHandle, errCode = NtRemoveIoCompletion(CompletionHandle,
(PVOID*)lpCompletionKey, (PVOID*)&CompletionKey,
(PVOID*)lpNumberOfBytesTransferred, (PVOID*)lpOverlapped,
&IoStatus, &IoStatus,
dwMilliseconds == INFINITE ? NULL : &Interval); dwMilliseconds == INFINITE ? NULL : &Interval);
if (!NT_SUCCESS(errCode)) { if (!NT_SUCCESS(errCode) || errCode == STATUS_TIMEOUT) {
*lpOverlapped = NULL; *lpOverlapped = NULL;
SetLastErrorByStatus(errCode); SetLastErrorByStatus(errCode);
return FALSE; return FALSE;
} }
*lpOverlapped = (LPOVERLAPPED)IoStatus.Information; *lpCompletionKey = CompletionKey;
*lpNumberOfBytesTransferred = IoStatus.Information;
if (!NT_SUCCESS(IoStatus.Status)){ if (!NT_SUCCESS(IoStatus.Status)){
//failed io operation //failed io operation
@ -133,7 +135,6 @@ GetQueuedCompletionStatus(
} }
return TRUE; return TRUE;
} }
@ -152,8 +153,8 @@ PostQueuedCompletionStatus(
NTSTATUS errCode; NTSTATUS errCode;
errCode = NtSetIoCompletion(CompletionHandle, errCode = NtSetIoCompletion(CompletionHandle,
(PVOID)dwCompletionKey, (PVOID)dwCompletionKey, // KeyContext
(PVOID)lpOverlapped,//CompletionValue (PVOID)lpOverlapped, // ApcContext
STATUS_SUCCESS, // IoStatusBlock->Status STATUS_SUCCESS, // IoStatusBlock->Status
dwNumberOfBytesTransferred); // IoStatusBlock->Information dwNumberOfBytesTransferred); // IoStatusBlock->Information