KiOpDecode

INT64 __stdcall KiOpDecode(INT64 rcx0, INT64 rdx0, INT8 r8, INT64 a4){
  int v4; 
  INT64 v8; 
  __int64 v9; 
  INT64 NextByte; 
  unsigned int v11; 
  __int64 v12; 
  __int64 v13; 
  BYTE v14[4]; 
  BYTE v15[52]; 
  BYTE v16; 
  BYTE v17; 
  CHAR v18; 
  INT64 result; 
  v4 = a4;
  v16 = 0;
  v18 = 0;
  *(_DWORD *)v15 = 0;
  v17 = 0;
  *(_WORD *)v14 = 0;
  v8 = result;
  memset(result, 0i64);
  *(_DWORD *)(v8 + 60) = v4;
  v9 = *(_QWORD *)(rdx0 + 248);
  *(_QWORD *)v8 = v9;
  *(_QWORD *)(v8 + 16) = v9;
  *(_QWORD *)(v8 + 8) = v9 + 16;
  *(_QWORD *)(v8 + 32) = rcx0;
  *(_QWORD *)(v8 + 24) = rdx0;
  *(_BYTE *)(v8 + 81) = r8;
  *(_BYTE *)(v8 + 97) = 0;
  if( *(_WORD *)(rdx0 + 56) == 35 )
    *(_BYTE *)(v8 + 58) = 1;
  do
  {
    NextByte = KiOpFetchNextByte(v8, &v17);
    if( (int)NextByte >= 0 )
    {
      NextByte = KiOpIsPrefix(v8, v17, &v18);
      v11 = NextByte;
      if( (int)NextByte >= 0 )
        continue;
    }
    return NextByte;
  }
  while( v18 );
  if( v17 != 15
    || (*(_BYTE *)(v8 + 57) = 1, NextByte = KiOpFetchNextByte(v8, &v17), v11 = NextByte, (int)NextByte >= 0) )
  {
    *(_QWORD *)(v8 + 40) = *(_QWORD *)(v8 + 16) - 1i64;
    *(_BYTE *)(v8 + 56) = v17;
    if( (v4 & 0x8000000) != 0 )
    {
      *(_QWORD *)(v8 + 88) = 0i64;
    }
    else
    {
      NextByte = KiOpLocateDecodeEntry(v8);
      v11 = NextByte;
      if( (int)NextByte < 0 )
        return NextByte;
    }
    v12 = *(_QWORD *)(v8 + 88);
    if( !v12 )
      return 0i64;
    if( (*(_DWORD *)(v12 + 12) & 4) == 0
      || (NextByte = KiOpDecodeModRM((BYTE *)v8), v11 = NextByte, (int)NextByte >= 0) )
    {
      if( (*(_DWORD *)(v12 + 12) & 1) != 0 )
      {
        NextByte = KiOpFetchBytes(v8, 1i64, &v16);
        v11 = NextByte;
        if( (int)NextByte >= 0 )
        {
          v13 = (char)v16;
LABEL_27:
          *(_QWORD *)(v8 + 72) = v13;
          return v11;
        }
      }
      else
      {
        if( (*(_DWORD *)(*(_QWORD *)(v8 + 88) + 12i64) & 2) == 0 )
          return v11;
        if( (*(_DWORD *)(v8 + 48) & 0x40) != 0 )
        {
          NextByte = KiOpFetchBytes(v8, 2i64, v14);
          v11 = NextByte;
          if( (int)NextByte >= 0 )
          {
            v13 = *(__int16 *)v14;
            goto LABEL_27;
          }
        }
        else
        {
          NextByte = KiOpFetchBytes(v8, 4i64, v15);
          v11 = NextByte;
          if( (int)NextByte >= 0 )
          {
            v13 = *(int *)v15;
            goto LABEL_27;
          }
        }
      }
    }
  }
  return NextByte;
}

Referenced by:

KiPreprocessFault