KiOpDecode

NTSTATUS __stdcall KiOpDecode(INT64 a1, INT64 a2, INT64 a3, INT64 a4, VOID *a5){
  int v5; 
  char v6; 
  _DWORD *v9; 
  __int64 v10; 
  NTSTATUS result; 
  NTSTATUS v12; 
  __int64 v13; 
  __int64 v14; 
  __int16 v15[2]; 
  int v16[13]; 
  char v17; 
  CHAR v18; 
  CHAR v19; 

  v5 = a4;
  v6 = a3;
  v17 = 0;
  v19 = 0;
  v16[0] = 0;
  v18 = 0;
  v15[0] = 0;
  v9 = a5;
  memset(a5, 0i64, 0x68u);
  v9[15] = v5;
  v10 = *(_QWORD *)(a2 + 248);
  *(_QWORD *)v9 = v10;
  *((_QWORD *)v9 + 2) = v10;
  *((_QWORD *)v9 + 1) = v10 + 16;
  *((_QWORD *)v9 + 4) = a1;
  *((_QWORD *)v9 + 3) = a2;
  *((_BYTE *)v9 + 81) = v6;
  *((_BYTE *)v9 + 97) = 0;
  if( *(_WORD *)(a2 + 56) == 35 )
    *((_BYTE *)v9 + 58) = 1;
  do
  {
    result = KiOpFetchNextByte((INT64)v9, &v18);
    if( result >= 0 )
    {
      result = KiOpIsPrefix((INT64)v9, v18, &v19);
      v12 = result;
      if( result >= 0 )
        continue;
    }
    return result;
  }
  while( v19 );
  if( v18 != 15 || (*((_BYTE *)v9 + 57) = 1, result = KiOpFetchNextByte((INT64)v9, &v18), v12 = result, result >= 0) )
  {
    *((_QWORD *)v9 + 5) = *((_QWORD *)v9 + 2) - 1i64;
    *((_BYTE *)v9 + 56) = v18;
    if( (v5 & 0x8000000) != 0 )
    {
      *((_QWORD *)v9 + 11) = 0i64;
    }
    else
    {
      result = KiOpLocateDecodeEntry((INT64)v9);
      v12 = result;
      if( result < 0 )
        return result;
    }
    v13 = *((_QWORD *)v9 + 11);
    if( !v13 )
      return 0;
    if( (*(_DWORD *)(v13 + 12) & 4) == 0 || (result = KiOpDecodeModRM(v9), v12 = result, result >= 0) )
    {
      if( (*(_DWORD *)(v13 + 12) & 1) != 0 )
      {
        result = KiOpFetchBytes((INT64)v9, 1i64, &v17);
        v12 = result;
        if( result >= 0 )
        {
          v14 = v17;
LABEL_27:
          *((_QWORD *)v9 + 9) = v14;
          return v12;
        }
      }
      else
      {
        if( (*(_DWORD *)(*((_QWORD *)v9 + 11) + 12i64) & 2) == 0 )
          return v12;
        if( (v9[12] & 0x40) != 0 )
        {
          result = KiOpFetchBytes((INT64)v9, 2i64, v15);
          v12 = result;
          if( result >= 0 )
          {
            v14 = v15[0];
            goto LABEL_27;
          }
        }
        else
        {
          result = KiOpFetchBytes((INT64)v9, 4i64, v16);
          v12 = result;
          if( result >= 0 )
          {
            v14 = v16[0];
            goto LABEL_27;
          }
        }
      }
    }
  }
  return result;
}

Referenced by:

KiPreprocessFault