KiTpDecodeModRm
NTSTATUS __stdcall KiTpDecodeModRm(UINT8 *a1, INT64 a2, INT64 *a3){
int v3;
UINT8 *v5;
NTSTATUS result;
_DWORD *v7;
char v8;
v3 = *(_DWORD *)a3;
if( a2 )
{
*(_DWORD *)a3 = v3 + a1[22];
return 0;
}
v5 = a1 + 26;
result = KiTpFetchInstructionBytes((__int64)a1, a1 + 26, 1, a3);
if( result >= 0 )
{
if( (*v5 & 0xC0) == 0xC0
|| (*v5 & 7) != 4
|| (result = KiTpFetchInstructionBytes((__int64)a1, a1 + 27, 1, v7), result >= 0) )
{
v8 = *v5 >> 6;
if( !v8 && ((*v5 & 7) == 5 || (a1[27] & 7) == 5) || v8 == 2 )
{
result = KiTpFetchInstructionBytes((__int64)a1, a1 + 28, 4, v7);
if( result < 0 )
return result;
}
else if( v8 == 1 )
{
result = KiTpFetchInstructionBytes((__int64)a1, a1 + 28, 1, v7);
if( result < 0 )
return result;
*((_DWORD *)a1 + 7) = (char)a1[28];
}
a1[22] = *(_BYTE *)v7 - v3;
return 0;
}
}
return result;
}Referenced by:
KiTpEmulateGroup0Instruction
KiTpEmulateGroup11Instruction
KiTpEmulateGroup1Instruction
KiTpEmulateInstruction
KiTpEmulateMovzx