KiEmulateAtlThunk
UINT64 __stdcall KiEmulateAtlThunk(
UINT64 *InstructionPointer,
UINT64 *StackPointer,
UINT64 *Eax,
UINT64 *Ecx,
UINT64 *Edx){
_DWORD *v10;
_WORD *v11;
char v12;
unsigned int v13;
__int64 v14;
char v15;
unsigned int v16;
unsigned int v17;
_DWORD *v18;
__int64 v19;
VOID *v20;
unsigned int v21;
_DWORD *StackPointera;
if( (KeGetCurrentThread()->ApcState.Process->Pcb.Flags._bf_0 & 4) != 0 )
return 0i64;
v10 = (_DWORD *)*(unsigned int *)InstructionPointer;
StackPointera = (_DWORD *)*(unsigned int *)StackPointer;
v21 = 0;
v11 = (_WORD *)&KeGetPcr()->NtTib.$8E581AA5F14182E3A9376D7C6777905F::$DDD217EC770DED536E77C25F6874D4CC::Self[218].SubSystemTib
+ 1;
if( (*v11 & 1) != 0 )
{
v12 = 1;
*v11 &= ~1u;
}
else
{
v12 = 0;
}
if( *v10 == 69485767 && *((_BYTE *)v10 + 8) == 0xE9 )
{
v13 = *(_DWORD *)((char *)v10 + 9) + (_DWORD)v10 + 13;
if( !MmCheckForSafeExecution(v10, StackPointera, (VOID *)v13, 1u) || !v12 )
return v21;
v14 = (__int64)(StackPointera + 1);
if( (unsigned __int64)(StackPointera + 1) >= 0x7FFFFFFF0000i64 )
v14 = 0x7FFFFFFF0000i64;
*(_DWORD *)v14 = v10[1];
*(_DWORD *)InstructionPointer = v13;
return 1;
}
v15 = *(_BYTE *)v10;
if( *(_BYTE *)v10 == 0xB9 && *((_BYTE *)v10 + 5) == 0xE9 )
{
v16 = *(_DWORD *)((char *)v10 + 6) + (_DWORD)v10 + 10;
if( !MmCheckForSafeExecution(v10, StackPointera, (VOID *)v16, 1u) || !v12 )
return v21;
*(_DWORD *)Ecx = *(_DWORD *)((char *)v10 + 1);
goto LABEL_31;
}
if( v15 == -70 && *((_BYTE *)v10 + 5) == 0xB9 && *((_WORD *)v10 + 5) == 0xE1FF )
{
v17 = *(_DWORD *)((char *)v10 + 6);
if( MmCheckForSafeExecution(v10, StackPointera, (VOID *)v17, 0) )
{
*(_DWORD *)Edx = *(_DWORD *)((char *)v10 + 1);
*(_DWORD *)Ecx = v17;
*(_DWORD *)InstructionPointer = v17;
return 1;
}
}
else
{
if( v15 != -71 || *((_BYTE *)v10 + 5) != 0xB8 || *((_WORD *)v10 + 5) != 0xE0FF )
{
if( v15 == 89
&& *((_BYTE *)v10 + 1) == 88
&& *((_BYTE *)v10 + 2) == 81
&& *((_BYTE *)v10 + 3) == 0xFF
&& *((_BYTE *)v10 + 4) == 96
&& *((_BYTE *)v10 + 5) == 4 )
{
v18 = StackPointera + 1;
v19 = (__int64)(StackPointera + 1);
if( (unsigned __int64)(StackPointera + 1) >= 0x7FFFFFFF0000i64 )
v19 = 0x7FFFFFFF0000i64;
v20 = (VOID *)*(unsigned int *)(unsigned int)(*(_DWORD *)v19 + 4);
if( MmCheckForSafeExecution(v10, StackPointera, v20, 0) )
{
*(_DWORD *)Ecx = *StackPointera;
*(_DWORD *)Eax = *v18;
*v18 = *(_DWORD *)Ecx;
*(_DWORD *)InstructionPointer = (_DWORD)v20;
*(_DWORD *)StackPointer = (_DWORD)v18;
return 1;
}
}
return v21;
}
v16 = *(_DWORD *)((char *)v10 + 6);
if( MmCheckForSafeExecution(v10, StackPointera, (VOID *)v16, 1u) && v12 )
{
*(_DWORD *)Ecx = *(_DWORD *)((char *)v10 + 1);
*(_DWORD *)Eax = v16;
LABEL_31:
*(_DWORD *)InstructionPointer = v16;
return 1;
}
}
return v21;
}Referenced by:
KiCheckForAtlThunk