PipMakeGloballyUniqueId
INT64 PipMakeGloballyUniqueId(void){
_BOOL8 v0;
__int64 v1;
__int64 v2;
__int64 v3;
__int64 v4;
_QWORD *v5;
_ETHREAD *CurrentThread;
__int64 v7;
WCHAR *v8;
WCHAR *v9;
WCHAR *v10;
int CachedContextBaseKey;
unsigned int v12;
WCHAR *v13;
__int64 v14;
__int64 v15;
WCHAR *v16;
wchar_t *Buffer;
int v19;
unsigned __int64 v20;
unsigned __int64 v21;
int v22;
WCHAR v23;
int v24;
WCHAR *PoolWithTag;
PULONG ResultLength;
PULONG ResultLengtha;
__int64 v28;
__int64 v29;
ULONG Length;
_QWORD *v31;
int Data;
struct _UNICODE_STRING ValueName;
HANDLE KeyHandle;
int v35;
HANDLE v36;
size_t cbDest;
NTSTRSAFE_PWSTR ppszDestEnd;
__int64 v39;
char KeyValueInformation[4];
int v41;
int v42;
int v43;
v3 = 0i64;
v31 = (_QWORD *)v2;
Data = 0;
KeyHandle = 0i64;
v4 = -1i64;
Length = 0;
v5 = (_QWORD *)v2;
ValueName = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = v1;
v39 = v0;
v8 = 0i64;
v36 = 0i64;
v9 = 0i64;
v10 = 0i64;
--*((_WORD *)CurrentThread + 242);
LOBYTE(v0) = 1;
ExAcquireResourceSharedLite(&PnpRegistryDeviceResource, v0);
if( v7 )
v3 = *(_QWORD *)(*(_QWORD *)(v7 + 312) + 40i64);
CachedContextBaseKey = CmOpenDeviceRegKey(
PiPnpRtlCtx,
*(const wchar_t **)(v3 + 48),
16,
0,
131103,
0,
(__int64)&KeyHandle,
0i64);
if( CachedContextBaseKey >= 0 )
{
ValueName.Buffer = L"UniqueParentID";
*(_DWORD *)&ValueName.Length = 1966108;
CachedContextBaseKey = ZwQueryValueKey(
KeyHandle,
&ValueName,
KeyValuePartialInformation,
KeyValueInformation,
0x10u,
&Length);
if( CachedContextBaseKey >= 0 )
{
if( v41 != 4 || v42 != 4 )
{
CachedContextBaseKey = -1073741811;
goto LABEL_18;
}
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x12ui64, 0x6E657050ui64);
v9 = PoolWithTag;
if( !PoolWithTag )
goto LABEL_47;
RtlStringCbPrintfW(PoolWithTag, 0x12ui64, (WCHAR *)L"%x");
}
else
{
*(_DWORD *)&ValueName.Length = 1966108;
Length = 66;
ValueName.Buffer = (wchar_t *)L"ParentIdPrefix";
v10 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x42ui64, 0x6E657050ui64);
if( !v10 )
goto LABEL_47;
CachedContextBaseKey = ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation, v10, Length, &Length);
if( CachedContextBaseKey >= 0 )
{
if( *((_DWORD *)v10 + 1) == 1 )
{
v12 = *((_DWORD *)v10 + 2);
v13 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, v12, 0x6E657050ui64);
v9 = v13;
if( v13 )
{
RtlStringCbCopyW(v13, v12, v10 + 6);
goto LABEL_10;
}
LABEL_47:
CachedContextBaseKey = -1073741670;
goto LABEL_17;
}
CachedContextBaseKey = -1073741811;
LABEL_17:
v5 = v31;
LABEL_18:
ZwClose(KeyHandle);
goto LABEL_19;
}
Length = 31;
CachedContextBaseKey = RtlUpcaseUnicodeString(&ValueName, (UNICODE_STRING *)(v3 + 40), 1u);
if( CachedContextBaseKey < 0 )
goto LABEL_17;
Buffer = ValueName.Buffer;
v19 = 0;
v20 = 0i64;
v21 = (unsigned __int64)ValueName.Length >> 1;
if( ValueName.Buffer > &ValueName.Buffer[v21] )
v21 = 0i64;
if( v21 )
{
do
{
v22 = *Buffer;
++v20;
++Buffer;
v19 = v22 + 37 * v19;
}
while( v20 < v21 );
}
v35 = (int)abs32(314159269 * v19) % 1000000007;
RtlFreeAnsiString(&ValueName);
cbDest = 2 * Length;
v9 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, cbDest, 0x6E657050ui64);
if( !v9 )
goto LABEL_47;
RtlStringCbPrintfW(v9, cbDest, (WCHAR *)L"%s.%x.%x");
CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(PiPnpRtlCtx, 5, (__int64 *)&v36);
if( CachedContextBaseKey < 0 )
goto LABEL_17;
RtlInitUnicodeString(&ValueName, v9, v23);
if( ZwQueryValueKey(v36, &ValueName, KeyValuePartialInformation, KeyValueInformation, 0x10u, &Length) < 0
|| v41 != 4
|| (v24 = v43, v42 != 4) )
{
v24 = 0;
}
LODWORD(ResultLength) = 4;
Data = v24 + 1;
CachedContextBaseKey = ZwSetValueKey(v36, &ValueName, 0i64, 4ui64, &Data, (UINT64)ResultLength);
if( CachedContextBaseKey < 0 )
goto LABEL_17;
ValueName.Buffer = (wchar_t *)L"ParentIdPrefix";
--Data;
LODWORD(v29) = v35;
*(_DWORD *)&ValueName.Length = 1966108;
LODWORD(v28) = *(_DWORD *)(v3 + 152);
ppszDestEnd = v9;
RtlStringCchPrintfExW(v9, cbDest >> 1, &ppszDestEnd, 0i64, 0i64, L"%x&%x&%x", v28, v29, Data);
Length = ppszDestEnd - v9 + 1;
LODWORD(ResultLengtha) = 2 * Length;
CachedContextBaseKey = ZwSetValueKey(KeyHandle, &ValueName, 0i64, 1ui64, v9, (UINT64)ResultLengtha);
if( CachedContextBaseKey < 0 )
goto LABEL_17;
}
LABEL_10:
v14 = v39;
if( v39 )
{
v15 = -1i64;
do
++v15;
while( *(_WORD *)(v39 + 2 * v15) );
}
else
{
LODWORD(v15) = 0;
}
do
++v4;
while( v9[v4] );
Length = v4 + v15 + 2;
v16 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 2i64 * Length, 0x6E657050ui64);
v8 = v16;
if( v16 )
{
if( v14 )
RtlStringCchPrintfW(v16, Length, (WCHAR *)L"%s&%s");
else
RtlStringCchCopyW(v16, Length, v9);
goto LABEL_17;
}
goto LABEL_47;
}
LABEL_19:
ExReleaseResourceLite(&PnpRegistryDeviceResource);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v10 )
ExFreePoolWithTag(v10, 0);
if( v9 )
ExFreePoolWithTag(v9, 0);
*v5 = v8;
return(unsigned int)CachedContextBaseKey;
}Referenced by:
PiCreateDriverSwDeviceCallback
PiProcessNewDeviceNode