PiDmaGuardProcessNewDeviceNode

NTSTATUS __fastcall PiDmaGuardProcessNewDeviceNode(PVOID BugCheckParameter2){
  NTSTATUS Extension; 
  __int64 v4; 
  __int64 v5[10]; 

  memset(v5, 0i64, sizeof(v5));
  PipDmgDestroyIommuExtension((INT64)BugCheckParameter2);
  Extension = 0;
  if( PiIommuGetInterface(*((_QWORD *)BugCheckParameter2 + 4)) >= 0 )
  {
    if( *((_QWORD *)BugCheckParameter2 + 90) )
    {
      IoAddTriageDumpDataBlock(BugCheckParameter2, (_BYTE *)0x310);
      if( *((_WORD *)BugCheckParameter2 + 20) )
      {
        IoAddTriageDumpDataBlock((char *)BugCheckParameter2 + 40, (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          *((VOID **)BugCheckParameter2 + 6),
          (_BYTE *)*((unsigned __int16 *)BugCheckParameter2 + 20));
      }
      if( *((_WORD *)BugCheckParameter2 + 28) )
      {
        IoAddTriageDumpDataBlock((char *)BugCheckParameter2 + 56, (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          *((VOID **)BugCheckParameter2 + 8),
          (_BYTE *)*((unsigned __int16 *)BugCheckParameter2 + 28));
      }
      v4 = *((_QWORD *)BugCheckParameter2 + 2);
      if( v4 && *(_WORD *)(v4 + 56) )
      {
        IoAddTriageDumpDataBlock((VOID *)(v4 + 56), (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          *(VOID **)(*((_QWORD *)BugCheckParameter2 + 2) + 64i64),
          (_BYTE *)*(unsigned __int16 *)(*((_QWORD *)BugCheckParameter2 + 2) + 56i64));
      }
      KeBugCheckEx(
        0xCAu,
        (PVOID)0x11,
        BugCheckParameter2,
        *((PVOID *)BugCheckParameter2 + 90),
        (PVOID)*((unsigned int *)BugCheckParameter2 + 176));
    }
    Extension = PiIommuAllocateExtension((__int64)BugCheckParameter2, v5, (_QWORD *)BugCheckParameter2 + 90);
    PiIommuPutInterface((__int64)v5);
  }
  return Extension;
}

Referenced by:

PiProcessNewDeviceNode