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