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