PiDmaGuardProcessPostRemove
VOID __fastcall PiDmaGuardProcessPostRemove(PVOID BugCheckParameter4, INT64 a2, INT64 a3){
INT64 v4;
char v5;
int v6;
NTSTATUS v7;
void *v8;
__int64 v9;
void *v10;
v4 = *((_QWORD *)BugCheckParameter4 + 90);
v5 = a3;
v6 = a2;
if( v4 )
{
if( PipHalIommuSecurityEnabled )
{
v7 = PiIommuBlockDevice(v4);
v8 = (void *)v7;
if( v7 < 0 )
{
IoAddTriageDumpDataBlock(BugCheckParameter4, (_BYTE *)0x310);
if( *((_WORD *)BugCheckParameter4 + 20) )
{
IoAddTriageDumpDataBlock((char *)BugCheckParameter4 + 40, (_BYTE *)2);
IoAddTriageDumpDataBlock(
*((VOID **)BugCheckParameter4 + 6),
(_BYTE *)*((unsigned __int16 *)BugCheckParameter4 + 20));
}
if( *((_WORD *)BugCheckParameter4 + 28) )
{
IoAddTriageDumpDataBlock((char *)BugCheckParameter4 + 56, (_BYTE *)2);
IoAddTriageDumpDataBlock(
*((VOID **)BugCheckParameter4 + 8),
(_BYTE *)*((unsigned __int16 *)BugCheckParameter4 + 28));
}
v9 = *((_QWORD *)BugCheckParameter4 + 2);
if( v9 && *(_WORD *)(v9 + 56) )
{
IoAddTriageDumpDataBlock((VOID *)(v9 + 56), (_BYTE *)2);
IoAddTriageDumpDataBlock(
*(VOID **)(*((_QWORD *)BugCheckParameter4 + 2) + 64i64),
(_BYTE *)*(unsigned __int16 *)(*((_QWORD *)BugCheckParameter4 + 2) + 56i64));
}
KeBugCheckEx(0xCAu, (PVOID)0x13, (PVOID)0x1001, v8, BugCheckParameter4);
}
}
PipDmgDestroyIommuExtension((INT64)BugCheckParameter4);
}
if( v5 && PipDmaGuardPolicy )
{
v10 = (void *)*((_QWORD *)BugCheckParameter4 + 4);
if( v6 == 55 )
{
PiDmaGuardQueueInsertEntry(v10);
PipDmgReevaluateQueue();
}
else
{
PiDmaGuardQueueRemoveEntry((__int64)v10, a2, a3);
}
}
}Referenced by:
PnpRemoveLockedDeviceNode
PnpSurpriseRemoveLockedDeviceNode