PspGetContext
INT64 __fastcall PspGetContext(_DEVICE_OBJECT *DeviceObject){
_QWORD **v1;
INT64 v2;
int v3;
INT64 v5;
_QWORD *v6;
__int64 v7;
INT64 result;
char v9;
__int64 v10;
_QWORD *v11;
INT64 v12;
_QWORD *v13;
_QWORD *v14;
v3 = *(_DWORD *)(v2 + 48);
v5 = v2;
v6 = v1;
if( (v3 & 0x100001) == 1048577 )
{
*(_QWORD *)(v2 + 248) = *((_QWORD *)DeviceObject + 45);
*(_WORD *)(v2 + 56) = *((_WORD *)DeviceObject + 184);
*(_WORD *)(v2 + 66) = *((_WORD *)DeviceObject + 196);
*(_QWORD *)(v2 + 152) = *((_QWORD *)DeviceObject + 48);
*(_DWORD *)(v2 + 68) = *((_DWORD *)DeviceObject + 94);
}
if( (v3 & 0x100004) == 1048580 )
{
*(_DWORD *)(v2 + 58) = 2818091;
*(_DWORD *)(v2 + 62) = 2818131;
}
if( (v3 & 0x100002) == 1048578 )
{
*(_QWORD *)(v2 + 120) = *((_QWORD *)DeviceObject + 6);
*(_QWORD *)(v2 + 128) = *((_QWORD *)DeviceObject + 7);
*(_QWORD *)(v2 + 136) = *((_QWORD *)DeviceObject + 8);
*(_QWORD *)(v2 + 184) = *((_QWORD *)DeviceObject + 9);
*(_QWORD *)(v2 + 192) = *((_QWORD *)DeviceObject + 10);
*(_QWORD *)(v2 + 200) = *((_QWORD *)DeviceObject + 11);
*(_QWORD *)(v2 + 208) = *((_QWORD *)DeviceObject + 12);
*(_QWORD *)(v2 + 144) = *v1[19];
*(_QWORD *)(v2 + 160) = *v1[21];
*(_QWORD *)(v2 + 168) = *v1[22];
*(_QWORD *)(v2 + 176) = *v1[23];
*(_QWORD *)(v2 + 216) = *v1[28];
*(_QWORD *)(v2 + 224) = *v1[29];
*(_QWORD *)(v2 + 232) = *v1[30];
*(_QWORD *)(v2 + 240) = *v1[31];
}
v7 = 0i64;
if( (v3 & 0x100040) == 1048640 )
{
if( (*((_BYTE *)DeviceObject + 368) & 1) != 0 )
{
v10 = *(int *)(v2 + 1248);
v11 = (_QWORD *)*((_QWORD *)KeGetCurrentThread() + 51);
if( v11 )
{
v14 = (_QWORD *)*v11;
if( *v11 )
{
do
{
v11 = v14;
v14 = (_QWORD *)*v14;
}
while( v14 );
}
v12 = v11[5];
}
else
{
v12 = 0i64;
}
v13 = (_QWORD *)(v5 + v10 + 720);
if( v12 )
KiCopyXStateArea((INT64)v13, KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64, v12);
else
RtlXSaveS(
v13,
(KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64);
}
*(_DWORD *)(v5 + 52) = *((_DWORD *)DeviceObject + 11);
*(_DWORD *)(v5 + 280) = *((_DWORD *)DeviceObject + 11);
}
if( (v3 & 0x100008) == 1048584 )
{
*(_OWORD *)(v5 + 416) = *((_OWORD *)DeviceObject + 7);
*(_OWORD *)(v5 + 432) = *((_OWORD *)DeviceObject + 8);
*(_OWORD *)(v5 + 448) = *((_OWORD *)DeviceObject + 9);
*(_OWORD *)(v5 + 464) = *((_OWORD *)DeviceObject + 10);
*(_OWORD *)(v5 + 480) = *((_OWORD *)DeviceObject + 11);
*(_OWORD *)(v5 + 496) = *((_OWORD *)DeviceObject + 12);
*(_OWORD *)(v5 + 512) = *(_OWORD *)v6[6];
*(_OWORD *)(v5 + 528) = *(_OWORD *)v6[7];
*(_OWORD *)(v5 + 544) = *(_OWORD *)v6[8];
*(_OWORD *)(v5 + 560) = *(_OWORD *)v6[9];
*(_OWORD *)(v5 + 576) = *(_OWORD *)v6[10];
*(_OWORD *)(v5 + 592) = *(_OWORD *)v6[11];
*(_OWORD *)(v5 + 608) = *(_OWORD *)v6[12];
*(_OWORD *)(v5 + 624) = *(_OWORD *)v6[13];
*(_OWORD *)(v5 + 640) = *(_OWORD *)v6[14];
*(_OWORD *)(v5 + 656) = *(_OWORD *)v6[15];
*(_DWORD *)(v5 + 52) = *((_DWORD *)DeviceObject + 11);
*(_DWORD *)(v5 + 280) = *((_DWORD *)DeviceObject + 11);
}
result = v3 & 0x100010;
if( (_DWORD)result == 1048592 )
{
if( (*((_DWORD *)DeviceObject + 64) & 0x355i64) != 0 )
{
*(_QWORD *)(v5 + 72) = *((_QWORD *)DeviceObject + 27);
*(_QWORD *)(v5 + 80) = *((_QWORD *)DeviceObject + 28);
*(_QWORD *)(v5 + 88) = *((_QWORD *)DeviceObject + 29);
*(_QWORD *)(v5 + 96) = *((_QWORD *)DeviceObject + 30);
*(_QWORD *)(v5 + 104) = *((_QWORD *)DeviceObject + 31);
v7 = *((_QWORD *)DeviceObject + 32);
}
else
{
*(_QWORD *)(v5 + 72) = 0i64;
*(_QWORD *)(v5 + 80) = 0i64;
*(_QWORD *)(v5 + 88) = 0i64;
*(_QWORD *)(v5 + 96) = 0i64;
*(_QWORD *)(v5 + 104) = 0i64;
}
*(_QWORD *)(v5 + 112) = v7;
result = KeCopyLastBranchInformation(v5, (INT64)DeviceObject);
}
if( (v3 & 0x40000000) != 0 )
{
result = *(_DWORD *)(v5 + 48) & 0xE7FFFFFF;
LODWORD(result) = *(_DWORD *)(v5 + 48) & 0x67FFFFFF | 0x80000000;
*(_DWORD *)(v5 + 48) = result;
v9 = *((_BYTE *)DeviceObject + 43);
if( v9 == 1 )
{
LODWORD(result) = result | 0x8000000;
}
else
{
if( v9 != 2 )
return result;
LODWORD(result) = result | 0x10000000;
}
*(_DWORD *)(v5 + 48) = result;
}
return result;
}Referenced by:
PspGetSetContextInternal