NtCallbackReturn
NTSTATUS __stdcall NtCallbackReturn(PVOID OutputBuffer, UINT64 OutputLength, INT64 Status){
_ETHREAD *CurrentThread;
_QWORD *v4;
__int64 v5;
NTSTATUS result;
__int64 v7;
_QWORD *v8;
bool v9;
__int64 v10;
__int64 v11;
__int64 v12;
unsigned __int64 v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = (_QWORD *)*((_QWORD *)CurrentThread + 5);
v5 = v4[4];
if( v5 >= 0 )
{
if( v5 > 0 )
KeBugCheckEx(0x1CDu, (ULONG_PTR)CurrentThread, v4[4], 0i64, 0i64);
return -1073741224;
}
else
{
result = Status;
**(_QWORD **)(v5 + 216) = OutputBuffer;
**(_DWORD **)(v5 + 224) = OutputLength;
_disable();
v7 = *(_QWORD *)(v5 + 208);
v8 = (_QWORD *)*((_QWORD *)CurrentThread + 18);
*((_QWORD *)CurrentThread + 18) = v7;
v9 = (*((_BYTE *)CurrentThread + 3) & 3) == 0;
*(_WORD *)(v7 + 256) = 0;
if( !v9 )
{
v10 = v8[28];
*(_QWORD *)(v7 + 216) = v8[27];
*(_QWORD *)(v7 + 224) = v10;
v11 = v8[30];
*(_QWORD *)(v7 + 232) = v8[29];
*(_QWORD *)(v7 + 240) = v11;
*(_QWORD *)(v7 + 256) = v8[32];
}
v12 = v4[2];
*((_QWORD *)CurrentThread + 7) = v12;
*((_QWORD *)CurrentThread + 6) = v12 - (unsigned int)KeKernelStackSize;
v13 = v4[5];
*((_QWORD *)CurrentThread + 5) = v13;
if( (KiKvaShadow & 1) != 0 )
__writegsqword(0x9008u, v13);
else
*(_QWORD *)(*((_QWORD *)KeGetPcr() + 1) + 4i64) = v13;
__writegsqword(0x1A8u, v13);
_enable();
}
return result;
}Referenced by:
No references.