PiProcessCanceledRemoveForReset
INT64 __fastcall PiProcessCanceledRemoveForReset(INT64 a1, INT64 rdx0, UINT64 **r8_0, INT64 *r9_0){
unsigned int v4;
ULONG_PTR v5;
__int64 v9;
__int64 v10;
__int64 v11;
DEVICE_OBJECT *v12;
__int64 v13;
_QWORD a3[2];
int a4;
__int64 a2;
v4 = 0;
v5 = (int)a1;
a3[0] = 0i64;
a4 = 0;
a2 = 1i64;
while( IopEnumerateRelations((unsigned int **)r8_0, (int *)&a2, a3, 0i64, 0i64) )
{
if( a3[0] )
v9 = *(_QWORD *)(*(_QWORD *)(a3[0] + 312i64) + 40i64);
else
v9 = 0i64;
if( v9 )
*(_DWORD *)(v9 + 704) &= ~2u;
}
if( *(_DWORD *)*r8_0 == 1 )
{
v10 = *(_QWORD *)(rdx0 + 152);
if( v10 )
v11 = *(_QWORD *)(*(_QWORD *)(v10 + 312) + 40i64);
else
v11 = 0i64;
if( *(_DWORD *)(v11 + 300) == 788 )
KeBugCheckEx(0xCAu, 0xEui64, v5, *(int *)r9_0, (ULONG_PTR)r8_0);
*(_DWORD *)(v10 + 48) |= 0x4000000u;
IopQueryDeviceState((DEVICE_OBJECT *)v10, 0i64);
}
else if( (*(_BYTE *)(*(_QWORD *)(rdx0 + 40) + 216i64) & 1) != 0 && *(_DWORD *)r9_0 == 5
|| (*(_DWORD *)(*(_QWORD *)(rdx0 + 40) + 216i64) & 2) != 0 )
{
a2 = 1i64;
while( IopEnumerateRelations((unsigned int **)r8_0, (int *)&a2, a3, &a4, 0i64) )
{
v12 = (DEVICE_OBJECT *)a3[0];
if( a3[0] )
v13 = *(_QWORD *)(*(_QWORD *)(a3[0] + 312i64) + 40i64);
else
v13 = 0i64;
if( a4 != 1 && *(_DWORD *)(v13 + 300) != 788 )
{
*(_DWORD *)(a3[0] + 48i64) |= 0x4000000u;
IopQueryDeviceState(v12, 0i64);
}
}
}
else
{
return(unsigned int)-2147483608;
}
return v4;
}Referenced by:
PnpProcessQueryRemoveAndEject