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