PiBuildDeviceNodeInstancePath
__int64 __fastcall PiBuildDeviceNodeInstancePath(__int64 a1, __int64 a2, __int64 a3, __int64 a4){
WCHAR *v8;
__int64 v9;
__int64 v10;
__int64 v11;
int v12;
UINT64 v13;
WCHAR *PoolWithTag;
int v15;
const wchar_t *v16;
WCHAR v17;
v8 = 0i64;
if( a2 && a3 && a4 )
{
if( *(_QWORD *)(a1 + 48) && ((*(_DWORD *)(a1 + 396) & 0x2000) == 0 || *(_DWORD *)(a1 + 404) != 42) )
PnpCleanupDeviceRegistryValues((UNICODE_STRING *)(a1 + 40));
v9 = -1i64;
v10 = -1i64;
do
++v10;
while( *(_WORD *)(a2 + 2 * v10) );
v11 = -1i64;
do
++v11;
while( *(_WORD *)(a3 + 2 * v11) );
v12 = v11 + v10;
do
++v9;
while( *(_WORD *)(a4 + 2 * v9) );
v13 = (unsigned int)(2 * (v9 + v12) + 6);
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, v13, 0x49706E50ui64);
v8 = PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741670;
v15 = RtlStringCbPrintfW(PoolWithTag, (unsigned int)v13, (WCHAR *)L"%s\\%s\\%s");
if( v15 >= 0 )
{
v16 = *(const wchar_t **)(a1 + 48);
if( !v16 || wcsicmp(v16, v8) )
{
PnpFreeDeviceInstancePath(a1);
RtlInitUnicodeString((PUNICODE_STRING)(a1 + 40), v8, v17);
return(unsigned int)v15;
}
}
}
else
{
v15 = -1073741823;
}
if( v8 )
ExFreePoolWithTag(v8, 0x49706E50u);
return(unsigned int)v15;
}Referenced by:
PiProcessNewDeviceNode