NtRemoveIoCompletion
NTSTATUS __stdcall NtRemoveIoCompletion(
VOID *IoCompletionHandle,
VOID **KeyContext,
VOID **ApcContext,
_IO_STATUS_BLOCK *IoStatusBlock,
_LARGE_INTEGER *Timeout){
char PreviousMode;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
_LARGE_INTEGER *v14;
NTSTATUS result;
NTSTATUS v16;
char NumEntriesRemoved[12];
LONGLONG v18;
PVOID IoCompletionPtr;
__int128 IoCompletionInformation;
_IO_STATUS_BLOCK v21;
_LIST_ENTRY *EntryArray;
EntryArray = 0i64;
IoCompletionInformation = 0i64;
v21 = 0i64;
memset(NumEntriesRemoved, 0, sizeof(NumEntriesRemoved));
v18 = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
v10 = (__int64)ApcContext;
if( (unsigned __int64)ApcContext >= 0x7FFFFFFF0000i64 )
v10 = 0x7FFFFFFF0000i64;
*(_QWORD *)v10 = *(_QWORD *)v10;
v11 = (__int64)KeyContext;
if( (unsigned __int64)KeyContext >= 0x7FFFFFFF0000i64 )
v11 = 0x7FFFFFFF0000i64;
*(_QWORD *)v11 = *(_QWORD *)v11;
v12 = (__int64)IoStatusBlock;
if( (unsigned __int64)IoStatusBlock >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
*(_DWORD *)v12 = *(_DWORD *)v12;
v13 = (__int64)Timeout;
if( Timeout )
{
*(_QWORD *)&NumEntriesRemoved[4] = &v18;
if( (unsigned __int64)Timeout >= 0x7FFFFFFF0000i64 )
v13 = 0x7FFFFFFF0000i64;
v18 = *(_QWORD *)v13;
}
v14 = *(_LARGE_INTEGER **)&NumEntriesRemoved[4];
}
else
{
v14 = *(_LARGE_INTEGER **)&NumEntriesRemoved[4];
if( Timeout )
v14 = Timeout;
}
IoCompletionPtr = 0i64;
result = ObReferenceObjectByHandle(
IoCompletionHandle,
2ui64,
IoCompletionObjectType,
PreviousMode,
&IoCompletionPtr,
0i64);
if( result >= 0 )
{
v16 = IoRemoveIoCompletion(
(UINT64)IoCompletionPtr,
(INT64)&IoCompletionInformation,
(INT64 *)&EntryArray,
1ui64,
(UINT64 *)NumEntriesRemoved,
PreviousMode,
(INT64)v14,
0);
HalPutDmaAdapter((PADAPTER_OBJECT)IoCompletionPtr);
if( !v16 )
{
*KeyContext = (VOID *)IoCompletionInformation;
*ApcContext = (VOID *)*((_QWORD *)&IoCompletionInformation + 1);
*IoStatusBlock = v21;
}
return v16;
}
return result;
}Referenced by:
No references.