KiUmsFastReturnToUser
VOID __fastcall KiUmsFastReturnToUser(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
_ETHREAD *CurrentThread;
__int64 v5;
__int64 v6;
ULONG v7;
ULONG_PTR v8;
ULONG_PTR CurrentIrql;
_ETHREAD *v10;
_KTHREAD *v11;
__int64 v12;
unsigned __int8 v13;
unsigned __int8 v14;
void *v17;
CHAR v18;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = *((_QWORD *)CurrentThread + 18) + 128i64;
v6 = *((_DWORD *)CurrentThread + 121) | (unsigned int)(unsigned __int8)(*((_BYTE *)CurrentThread + 586) | KeGetCurrentIrql());
if( (_DWORD)v6 )
{
v7 = 74;
v8 = 0i64;
CurrentIrql = KeGetCurrentIrql();
if( !(_DWORD)CurrentIrql )
{
v7 = 1;
CurrentIrql = *((unsigned __int8 *)CurrentThread + 586);
v8 = *((unsigned int *)CurrentThread + 121);
}
KiBugCheckDispatch(v7, *(_QWORD *)(*((_QWORD *)CurrentThread + 18) + 360i64), CurrentIrql, v8);
}
_disable();
while( (*((_BYTE *)KeGetCurrentThread() + 194) & 3) != 0 )
{
*(_QWORD *)(v5 - 80) = v6;
*(_QWORD *)(v5 - 72) = 0i64;
*(_QWORD *)(v5 - 64) = 0i64;
*(_QWORD *)(v5 - 56) = 0i64;
*(_QWORD *)(v5 - 48) = 0i64;
*(_QWORD *)(v5 - 40) = 0i64;
*(_QWORD *)(v5 - 32) = 0i64;
*(_OWORD *)(v5 - 16) = 0i64;
*(_OWORD *)v5 = 0i64;
*(_OWORD *)(v5 + 16) = 0i64;
*(_OWORD *)(v5 + 32) = 0i64;
*(_OWORD *)(v5 + 48) = 0i64;
*(_OWORD *)(v5 + 64) = 0i64;
__writecr8(1ui64);
_enable();
KiInitiateUserApc((_KTRAP_FRAME *)1);
_disable();
__writecr8(0i64);
v6 = *(_QWORD *)(v5 - 80);
}
if( (*((_BYTE *)KeGetPcr() + 638) & 2) != 0 )
{
*(_QWORD *)(v5 - 80) = v6;
KiUpdateStibpPairing(0i64);
v6 = *(_QWORD *)(v5 - 80);
}
v10 = (_ETHREAD *)KeGetCurrentThread();
if( (*(_DWORD *)v10 & 0x8000000) != 0 )
{
*(_QWORD *)(v5 - 80) = v6;
*(_QWORD *)(v5 - 72) = 0i64;
*(_QWORD *)(v5 - 64) = 0i64;
*(_QWORD *)(v5 - 56) = 0i64;
*(_QWORD *)(v5 - 48) = 0i64;
*(_QWORD *)(v5 - 40) = 0i64;
*(_QWORD *)(v5 - 32) = 0i64;
*(_OWORD *)(v5 - 16) = 0i64;
*(_OWORD *)v5 = 0i64;
*(_OWORD *)(v5 + 16) = 0i64;
*(_OWORD *)(v5 + 32) = 0i64;
*(_OWORD *)(v5 + 48) = 0i64;
*(_OWORD *)(v5 + 64) = 0i64;
KiRestoreSetContextState((INT64)v10, a2, a3, a4, v18);
}
v11 = (_ETHREAD *)KeGetCurrentThread();
if( (*(_DWORD *)v11 & 0x40010000) != 0 )
{
*(_QWORD *)(v5 - 80) = v6;
if( (*((_BYTE *)v11 + 2) & 1) != 0 )
{
KiCopyCounters((_KTHREAD *)v11);
v11 = (_ETHREAD *)KeGetCurrentThread();
}
if( (*((_BYTE *)v11 + 3) & 0x40) != 0 )
KiUmsExit(0);
v6 = *(_QWORD *)(v5 - 80);
}
_mm_setcsr(*(_DWORD *)(v5 - 84));
if( *(_WORD *)(v5 + 128) )
{
*(_QWORD *)(v5 - 80) = v6;
KiRestoreDebugRegisterState();
v12 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 984i64);
if( v12 && *(_WORD *)(v5 + 240) == 51 )
*(_QWORD *)(v5 + 232) = v12;
v6 = *(_QWORD *)(v5 - 80);
}
*(_QWORD *)(v5 - 80) = v6;
__writegsbyte(0x853u, 0);
v13 = *((_BYTE *)KeGetPcr() + 637);
if( *((_BYTE *)KeGetPcr() + 634) != v13 )
{
__writegsbyte(0x27Au, v13);
__writemsr(0x48u, v13);
}
v14 = _bittestandreset16(MK_FP(__GS__, 632i64), 2u);
if( v14 )
__writemsr(0x49u, 1ui64);
v14 = _bittestandreset16(MK_FP(__GS__, 632i64), 5u);
if( v14 )
__flush_rsb();
v17 = *(void **)(v5 + 232);
if( (KiKvaShadow & 1) == 0 )
{
__swapgs();
__sysretq(v17, *(_QWORD *)(v5 + 248));
}
KiKernelSysretExit(v17);
}Referenced by:
KiUmsCallEntry
KiUmsExceptionEntry
KiUmsTrapEntry