PipGetDeviceObjectLocation

NTSTATUS __stdcall PipGetDeviceObjectLocation(ULONG_PTR BugCheckParameter2){
  _DWORD *v1; 
  VOID ***v2; 
  VOID ***v3; 
  _DWORD *v4; 
  _QWORD *v5; 
  __int64 v6; 
  VOID **PoolWithTag; 
  int ObjectProperty; 
  __int16 *v10; 
  _WORD *v11; 
  VOID **v12; 
  VOID **v13; 
  __int64 v14; 
  _WORD *v15; 
  __int64 v16; 
  _WORD *v17; 
  __int64 v18; 
  INT64 v19; 

  v3 = v2;
  LODWORD(v19) = 0;
  v4 = v1;
  v5 = *(_QWORD **)&BugCheckParameter2;
  if( !*(_QWORD *)&BugCheckParameter2 )
    goto LABEL_26;
  v6 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)&BugCheckParameter2 + 312i64) + 40i64);
  if( !v6 || (*(_DWORD *)(v6 + 396) & 0x20000) != 0 )
  {
    IoAddTriageDumpDataBlock(
      *(VOID **)&BugCheckParameter2,
      (_BYTE *)*(unsigned __int16 *)(*(_QWORD *)&BugCheckParameter2 + 2i64));
    v10 = (__int16 *)v5[1];
    if( v10 )
    {
      IoAddTriageDumpDataBlock(v10, (_BYTE *)(unsigned int)v10[1]);
      v11 = (_WORD *)(v5[1] + 56i64);
      if( *v11 )
      {
        IoAddTriageDumpDataBlock(v11, (_BYTE *)2);
        IoAddTriageDumpDataBlock(*(VOID **)(v5[1] + 64i64), (_BYTE *)*(unsigned __int16 *)(v5[1] + 56i64));
      }
    }
    v12 = *(VOID ***)(v5[39] + 40i64);
    if( v12 )
    {
      v13 = v12 + 5;
      IoAddTriageDumpDataBlock(v12, (_BYTE *)0x310);
      if( *(_WORD *)v13 )
      {
        IoAddTriageDumpDataBlock(v13, (_BYTE *)2);
        IoAddTriageDumpDataBlock(v13[1], (_BYTE *)*(unsigned __int16 *)v13);
      }
      v14 = v5[39];
      v15 = (_WORD *)(*(_QWORD *)(v14 + 40) + 56i64);
      if( *v15 )
      {
        IoAddTriageDumpDataBlock(v15, (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          *(VOID **)(*(_QWORD *)(v5[39] + 40i64) + 64i64),
          (_BYTE *)*(unsigned __int16 *)(*(_QWORD *)(v5[39] + 40i64) + 56i64));
        v14 = v5[39];
      }
      v16 = *(_QWORD *)(*(_QWORD *)(v14 + 40) + 16i64);
      if( v16 )
      {
        v17 = (_WORD *)(v16 + 56);
        if( *v17 )
        {
          IoAddTriageDumpDataBlock(v17, (_BYTE *)2);
          v18 = *(_QWORD *)(*(_QWORD *)(v5[39] + 40i64) + 16i64);
          IoAddTriageDumpDataBlock(*(VOID **)(v18 + 64), (_BYTE *)*(unsigned __int16 *)(v18 + 56));
        }
      }
    }
LABEL_26:
    KeBugCheckEx(0xCAu, (PVOID)2, v5, 0i64, 0i64);
  }
  PoolWithTag = 0i64;
  while( 1 )
  {
    ObjectProperty = PnpGetObjectProperty(
                       *(&stru_140CF2E80 + 1214),
                       *(_QWORD *)(v6 + 48),
                       1i64,
                       0i64,
                       0i64,
                       (INT64)&DEVPKEY_Device_LocationPaths,
                       (INT64)&v19,
                       (INT64)PoolWithTag);
    if( ObjectProperty != -1073741789 )
      break;
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0x61706E50u);
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0i64, 1634758224i64);
    if( !PoolWithTag )
    {
      ObjectProperty = -1073741670;
      break;
    }
  }
  if( ObjectProperty < 0 )
  {
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0x61706E50u);
  }
  else
  {
    *v4 = 0;
    *v3 = PoolWithTag;
  }
  return ObjectProperty;
}

Referenced by:

IoReserveKsrPersistentMemory
PipGetPersistentMemory