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