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