PipDmgRequestRestartOnBlockedDevice
INT64 __stdcall PipDmgRequestRestartOnBlockedDevice(PVOID Object){
__int16 *v2;
_WORD *v3;
PVOID *v4;
PVOID *v5;
__int64 v6;
_WORD *v7;
__int64 v8;
_WORD *v9;
__int64 v10;
__int64 v11;
INT64 result;
__int16 *v13;
_WORD *v14;
PVOID *v15;
PVOID *v16;
__int64 v17;
_WORD *v18;
__int64 v19;
_WORD *v20;
__int64 v21;
if( PipDmaGuardPolicy == 3 )
{
if( Object )
{
IoAddTriageDumpDataBlock(Object, *((unsigned __int16 *)Object + 1));
v2 = (__int16 *)*((_QWORD *)Object + 1);
if( v2 )
{
IoAddTriageDumpDataBlock(v2, (unsigned int)v2[1]);
v3 = (_WORD *)(*((_QWORD *)Object + 1) + 56i64);
if( *v3 )
{
IoAddTriageDumpDataBlock(v3, 2ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*((_QWORD *)Object + 1) + 64i64),
*(unsigned __int16 *)(*((_QWORD *)Object + 1) + 56i64));
}
}
v4 = *(PVOID **)(*((_QWORD *)Object + 39) + 40i64);
if( v4 )
{
v5 = v4 + 5;
IoAddTriageDumpDataBlock(v4, 0x310ui64);
if( *(_WORD *)v5 )
{
IoAddTriageDumpDataBlock(v5, 2ui64);
IoAddTriageDumpDataBlock(v5[1], *(unsigned __int16 *)v5);
}
v6 = *((_QWORD *)Object + 39);
v7 = (_WORD *)(*(_QWORD *)(v6 + 40) + 56i64);
if( *v7 )
{
IoAddTriageDumpDataBlock(v7, 2ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*(_QWORD *)(*((_QWORD *)Object + 39) + 40i64) + 64i64),
*(unsigned __int16 *)(*(_QWORD *)(*((_QWORD *)Object + 39) + 40i64) + 56i64));
v6 = *((_QWORD *)Object + 39);
}
v8 = *(_QWORD *)(*(_QWORD *)(v6 + 40) + 16i64);
if( v8 )
{
v9 = (_WORD *)(v8 + 56);
if( *v9 )
{
IoAddTriageDumpDataBlock(v9, 2ui64);
v10 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)Object + 39) + 40i64) + 16i64);
IoAddTriageDumpDataBlock(*(PVOID *)(v10 + 64), *(unsigned __int16 *)(v10 + 56));
}
}
}
}
KeBugCheckEx(0xCAu, 0x11ui64, (ULONG_PTR)Object, 0i64, 0i64);
}
if( !Object )
LABEL_32:
KeBugCheckEx(0xCAu, 2ui64, (ULONG_PTR)Object, 0i64, 0i64);
v11 = *(_QWORD *)(*((_QWORD *)Object + 39) + 40i64);
if( !v11 || (*(_DWORD *)(v11 + 396) & 0x20000) != 0 )
{
IoAddTriageDumpDataBlock(Object, *((unsigned __int16 *)Object + 1));
v13 = (__int16 *)*((_QWORD *)Object + 1);
if( v13 )
{
IoAddTriageDumpDataBlock(v13, (unsigned int)v13[1]);
v14 = (_WORD *)(*((_QWORD *)Object + 1) + 56i64);
if( *v14 )
{
IoAddTriageDumpDataBlock(v14, 2ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*((_QWORD *)Object + 1) + 64i64),
*(unsigned __int16 *)(*((_QWORD *)Object + 1) + 56i64));
}
}
v15 = *(PVOID **)(*((_QWORD *)Object + 39) + 40i64);
if( v15 )
{
v16 = v15 + 5;
IoAddTriageDumpDataBlock(v15, 0x310ui64);
if( *(_WORD *)v16 )
{
IoAddTriageDumpDataBlock(v16, 2ui64);
IoAddTriageDumpDataBlock(v16[1], *(unsigned __int16 *)v16);
}
v17 = *((_QWORD *)Object + 39);
v18 = (_WORD *)(*(_QWORD *)(v17 + 40) + 56i64);
if( *v18 )
{
IoAddTriageDumpDataBlock(v18, 2ui64);
IoAddTriageDumpDataBlock(
*(PVOID *)(*(_QWORD *)(*((_QWORD *)Object + 39) + 40i64) + 64i64),
*(unsigned __int16 *)(*(_QWORD *)(*((_QWORD *)Object + 39) + 40i64) + 56i64));
v17 = *((_QWORD *)Object + 39);
}
v19 = *(_QWORD *)(*(_QWORD *)(v17 + 40) + 16i64);
if( v19 )
{
v20 = (_WORD *)(v19 + 56);
if( *v20 )
{
IoAddTriageDumpDataBlock(v20, 2ui64);
v21 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)Object + 39) + 40i64) + 16i64);
IoAddTriageDumpDataBlock(*(PVOID *)(v21 + 64), *(unsigned __int16 *)(v21 + 56));
}
}
}
goto LABEL_32;
}
result = PnpRequestDeviceAction((_DEVICE_OBJECT *)Object, ClearDmaGuardProblem, 1u, 0i64, 0i64, 0i64);
if( (int)result >= 0 )
return PnpRequestDeviceAction((_DEVICE_OBJECT *)Object, StartDevice, 0, 0i64, 0i64, 0i64);
return result;
}Referenced by:
PipDmgFlushQueueAndRestartDevices