NtRemoveIoCompletionEx
NTSTATUS __stdcall NtRemoveIoCompletionEx(
VOID *IoCompletionHandle,
_FILE_IO_COMPLETION_INFORMATION *IoCompletionInformation,
UINT64 Count,
UINT64 *NumEntriesRemoved,
_LARGE_INTEGER *Timeout,
UINT8 Alertable){
__int64 v7;
INT64 v10;
char PreviousMode;
INT64 *Pool_2;
int v13;
__int64 v15;
char NumEntriesRemoveda[12];
__int64 v17;
PVOID IoCompletionPtr;
_LIST_ENTRY *EntryArray[16];
v7 = (unsigned int)Count;
v10 = (INT64)Timeout;
memset(EntryArray, 0i64, sizeof(EntryArray));
v17 = 0i64;
*(_DWORD *)NumEntriesRemoveda = 0;
if( (unsigned int)(v7 - 1) > 0x7FFFFFE )
return -1073741811;
*(_QWORD *)&NumEntriesRemoveda[4] = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
ProbeForWrite((UINT64)IoCompletionInformation, 32 * v7, 8i64);
v15 = (__int64)NumEntriesRemoved;
if( (unsigned __int64)NumEntriesRemoved >= 0x7FFFFFFF0000i64 )
v15 = 0x7FFFFFFF0000i64;
*(_DWORD *)v15 = *(_DWORD *)v15;
if( Timeout )
{
*(_QWORD *)&NumEntriesRemoveda[4] = &v17;
if( (unsigned __int64)Timeout >= 0x7FFFFFFF0000i64 )
v10 = 0x7FFFFFFF0000i64;
v17 = *(_QWORD *)v10;
}
v10 = *(_QWORD *)&NumEntriesRemoveda[4];
}
else if( !Timeout )
{
v10 = *(_QWORD *)&NumEntriesRemoveda[4];
}
if( (unsigned int)v7 > 0x10 )
{
Pool_2 = (INT64 *)IopVerifierExAllocatePool_2(0i64, 8 * v7);
if( Pool_2 )
goto LABEL_7;
LODWORD(v7) = 16;
}
Pool_2 = (INT64 *)EntryArray;
LABEL_7:
IoCompletionPtr = 0i64;
v13 = ObReferenceObjectByHandle(
IoCompletionHandle,
2ui64,
IoCompletionObjectType,
PreviousMode,
&IoCompletionPtr,
0i64);
if( v13 >= 0 )
{
v13 = IoRemoveIoCompletion(
(UINT64)IoCompletionPtr,
(INT64)IoCompletionInformation,
Pool_2,
(unsigned int)v7,
(UINT64 *)NumEntriesRemoveda,
PreviousMode,
v10,
Alertable);
HalPutDmaAdapter((PADAPTER_OBJECT)IoCompletionPtr);
}
if( Pool_2 != (INT64 *)EntryArray )
ExFreePoolWithTag(Pool_2, 0);
if( v13 >= 0 )
*(_DWORD *)NumEntriesRemoved = *(_DWORD *)NumEntriesRemoveda;
return v13;
}Referenced by:
No references.