KiCallUserMode
VOID __stdcall KiCallUserMode(PVOID *OutputBuffer, UINT64 *OutputLength, PVOID NewInitialStack, PVOID NewStackBase){
__int64 v4;
__int64 v5;
__int64 v6;
__int64 v7;
__int64 v8;
__int64 v9;
__int64 v10;
__int64 v11;
__int128 v12;
__int128 v13;
__int128 v14;
__int128 v15;
__int128 v16;
__int128 v17;
__int128 v18;
__int128 v19;
__int128 v20;
__int128 v21;
_ETHREAD *CurrentThread;
char *v23;
char *v24;
char *v25;
void *v26;
unsigned __int8 v27;
unsigned __int8 v28;
_KTRAP_FRAME *__shifted(_KTRAP_FRAME,0x80) TrapFrame;
__int64 v32;
__int128 v33;
__int128 v34;
__int128 v35;
__int128 v36;
__int128 v37;
__int128 v38;
__int128 v39;
__int128 v40;
__int128 v41;
__int128 v42;
char *v43;
PVOID *v44;
UINT64 *v45;
__int64 v46;
__int64 v47;
__int64 v48;
__int64 v49;
__int64 v50;
__int64 v51;
__int64 v52;
__int64 v53;
void *retaddr;
v33 = v12;
v34 = v13;
v35 = v14;
v36 = v15;
v37 = v16;
v38 = v17;
v39 = v18;
v40 = v19;
v41 = v20;
v42 = v21;
v46 = v5;
v47 = v4;
v48 = v6;
v49 = v7;
v50 = v8;
v51 = v9;
v52 = v10;
v53 = v11;
v44 = OutputBuffer;
v45 = OutputLength;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*((_QWORD *)NewInitialStack + 4) = &v32;
v23 = (char *)*((_QWORD *)CurrentThread + 18);
v43 = v23;
_disable();
*((_QWORD *)CurrentThread + 5) = NewInitialStack;
*((_QWORD *)CurrentThread + 7) = NewStackBase;
if( (KiKvaShadow & 1) != 0 )
__writegsqword(0x9008u, (unsigned __int64)NewInitialStack);
else
*(_QWORD *)(*((_QWORD *)KeGetPcr() + 1) + 4i64) = NewInitialStack;
v24 = (char *)NewStackBase - (unsigned int)KeKernelStackSize;
__writegsqword(0x1A8u, (unsigned __int64)NewInitialStack);
*((_QWORD *)CurrentThread + 6) = v24;
qmemcpy(&retaddr, v23, 0x190ui64);
v25 = v23 + 400;
if( (*((_BYTE *)CurrentThread + 194) & 3) != 0
|| (*(_DWORD *)CurrentThread & 0x48010000) != 0
|| (*((_BYTE *)KeGetPcr() + 638) & 2) != 0 )
{
TrapFrame = KeGetTrapFrame();
ADJ(TrapFrame)->SegCs = 51;
ADJ(TrapFrame)->Rip = (unsigned __int64)KeUserCallbackDispatcher;
JUMPOUT(0x14040D900i64);
}
_mm_setcsr(*((_DWORD *)v25 - 89));
if( (*((_BYTE *)CurrentThread + 3) & 3) != 0 )
{
KiRestoreDebugRegisterState();
v26 = *(void **)(*((_QWORD *)CurrentThread + 23) + 984i64);
if( !v26 )
v26 = KeUserCallbackDispatcher;
}
else
{
v26 = KeUserCallbackDispatcher;
}
__writegsbyte(0x853u, 0);
v27 = *((_BYTE *)KeGetPcr() + 637);
if( *((_BYTE *)KeGetPcr() + 634) != v27 )
{
__writegsbyte(0x27Au, v27);
__writemsr(0x48u, v27);
}
v28 = _bittestandreset16(MK_FP(__GS__, 632i64), 2u);
if( v28 )
__writemsr(0x49u, 1ui64);
v28 = _bittestandreset16(MK_FP(__GS__, 632i64), 5u);
if( v28 )
__flush_rsb();
if( (KiKvaShadow & 1) == 0 )
{
__swapgs();
__sysretq(v26, *((_QWORD *)v25 - 3));
}
KiKernelSysretExit(v26);
}Referenced by:
KeUserModeCallback