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