PipMakeGloballyUniqueId
NTSTATUS __stdcall PipMakeGloballyUniqueId(
PDEVICE_OBJECT ParentDeviceObject,
WCHAR *UniqueId,
WCHAR **GloballyUniqueId){
char *DeviceNode;
__int64 v4;
WCHAR **v5;
_ETHREAD *CurrentThread;
VOID **v8;
VOID **v9;
VOID **v10;
int CachedContextBaseKey;
unsigned int v12;
VOID **v13;
WCHAR *v14;
__int64 v15;
VOID **v16;
wchar_t *Buffer;
int v19;
unsigned __int64 v20;
unsigned __int64 v21;
int v22;
int v23;
VOID **PoolWithTag;
UINT64 DesiredAccess;
UINT64 DesiredAccessa;
UINT64 DesiredAccessb;
UINT64 DesiredAccessc;
UINT64 Create;
UINT64 Createa;
UINT64 ResultLength;
WCHAR **v32;
int Data;
_UNICODE_STRING ValueName;
VOID *KeyHandle;
int v36;
INT64 v37;
UINT64 cbDest;
_NTSTRSAFE_PWSTR ppszDestEnd[2];
WCHAR *v40;
char KeyValueInformation[4];
int v42;
int v43;
int v44;
DeviceNode = 0i64;
v32 = GloballyUniqueId;
Data = 0;
KeyHandle = 0i64;
v4 = -1i64;
LODWORD(ResultLength) = 0;
v5 = GloballyUniqueId;
ValueName = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v40 = UniqueId;
v8 = 0i64;
v37 = 0i64;
v9 = 0i64;
v10 = 0i64;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
if( ParentDeviceObject )
DeviceNode = (char *)ParentDeviceObject->DeviceObjectExtension->DeviceNode;
LODWORD(DesiredAccess) = 131103;
CachedContextBaseKey = CmOpenDeviceRegKey(
*(&stru_140CF2E80 + 607),
*((WCHAR **)DeviceNode + 6),
CM_KEY_TYPE_DEVICE_INSTANCE,
0i64,
DesiredAccess,
0,
&KeyHandle,
0i64);
if( CachedContextBaseKey >= 0 )
{
ValueName.Buffer = L"UniqueParentID";
*(_DWORD *)&ValueName.Length = 1966108;
LODWORD(DesiredAccessa) = 16;
CachedContextBaseKey = ZwQueryValueKey(
KeyHandle,
&ValueName,
KeyValuePartialInformation,
KeyValueInformation,
DesiredAccessa,
&ResultLength);
if( CachedContextBaseKey >= 0 )
{
if( v42 != 4 || v43 != 4 )
{
CachedContextBaseKey = -1073741811;
goto LABEL_18;
}
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x12ui64, 1852141648i64);
v9 = PoolWithTag;
if( !PoolWithTag )
goto LABEL_47;
RtlStringCbPrintfW((WCHAR *)PoolWithTag, 0x12ui64, (WCHAR *)L"%x");
}
else
{
*(_DWORD *)&ValueName.Length = 1966108;
LODWORD(ResultLength) = 66;
ValueName.Buffer = (wchar_t *)L"ParentIdPrefix";
v10 = ExAllocatePoolWithTag(1ui64, 0x42ui64, 1852141648i64);
if( !v10 )
goto LABEL_47;
LODWORD(DesiredAccessb) = ResultLength;
CachedContextBaseKey = ZwQueryValueKey(
KeyHandle,
&ValueName,
KeyValuePartialInformation,
v10,
DesiredAccessb,
&ResultLength);
if( CachedContextBaseKey >= 0 )
{
if( *((_DWORD *)v10 + 1) == 1 )
{
v12 = *((_DWORD *)v10 + 2);
v13 = ExAllocatePoolWithTag(1ui64, v12, 1852141648i64);
v9 = v13;
if( v13 )
{
RtlStringCbCopyW((WCHAR *)v13, v12, (WCHAR *)v10 + 6);
goto LABEL_10;
}
LABEL_47:
CachedContextBaseKey = -1073741670;
goto LABEL_17;
}
CachedContextBaseKey = -1073741811;
LABEL_17:
v5 = v32;
LABEL_18:
ZwClose((_HANDLE)KeyHandle);
goto LABEL_19;
}
LODWORD(ResultLength) = 31;
CachedContextBaseKey = RtlUpcaseUnicodeString(&ValueName, (_UNICODE_STRING *)(DeviceNode + 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 );
}
v36 = (int)abs32(314159269 * v19) % 1000000007;
RtlFreeAnsiString(&ValueName);
cbDest = (unsigned int)(2 * ResultLength);
v9 = ExAllocatePoolWithTag(1ui64, cbDest, 1852141648i64);
if( !v9 )
goto LABEL_47;
RtlStringCbPrintfW((WCHAR *)v9, cbDest, (WCHAR *)L"%s.%x.%x");
CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(
*(&stru_140CF2E80 + 607),
PNPCTX_BASE_KEY_TYPE_ENUM,
(VOID **)&v37);
if( CachedContextBaseKey < 0 )
goto LABEL_17;
RtlInitUnicodeString(&ValueName, (PCWSTR)v9);
LODWORD(DesiredAccessc) = 16;
if( ZwQueryValueKey(
(VOID *)v37,
&ValueName,
KeyValuePartialInformation,
KeyValueInformation,
DesiredAccessc,
&ResultLength) < 0
|| v42 != 4
|| (v23 = v44, v43 != 4) )
{
v23 = 0;
}
LODWORD(Create) = 4;
Data = v23 + 1;
CachedContextBaseKey = ZwSetValueKey((VOID *)v37, &ValueName, 0i64, 4ui64, &Data, Create);
if( CachedContextBaseKey < 0 )
goto LABEL_17;
ValueName.Buffer = (wchar_t *)L"ParentIdPrefix";
--Data;
*(_DWORD *)&ValueName.Length = 1966108;
*(_QWORD *)ppszDestEnd = v9;
RtlStringCchPrintfExW((WCHAR *)v9, cbDest >> 1, (WCHAR **)ppszDestEnd, 0i64, 0i64, (WCHAR *)L"%x&%x&%x");
LODWORD(ResultLength) = ((__int64)(*(_QWORD *)ppszDestEnd - (_QWORD)v9) >> 1) + 1;
LODWORD(Createa) = 2 * ResultLength;
CachedContextBaseKey = ZwSetValueKey(KeyHandle, &ValueName, 0i64, 1ui64, v9, Createa);
if( CachedContextBaseKey < 0 )
goto LABEL_17;
}
LABEL_10:
v14 = v40;
if( v40 )
{
v15 = -1i64;
do
++v15;
while( v40[v15] );
}
else
{
LODWORD(v15) = 0;
}
do
++v4;
while( *((_WORD *)v9 + v4) );
LODWORD(ResultLength) = v4 + v15 + 2;
v16 = ExAllocatePoolWithTag(1ui64, 2i64 * (unsigned int)ResultLength, 1852141648i64);
v8 = v16;
if( v16 )
{
if( v14 )
RtlStringCchPrintfW((WCHAR *)v16, (unsigned int)ResultLength, (WCHAR *)L"%s&%s");
else
RtlStringCchCopyW((WCHAR *)v16, (unsigned int)ResultLength, (WCHAR *)v9);
goto LABEL_17;
}
goto LABEL_47;
}
LABEL_19:
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v10 )
ExFreePoolWithTag(v10, 0);
if( v9 )
ExFreePoolWithTag(v9, 0);
*v5 = (WCHAR *)v8;
return CachedContextBaseKey;
}Referenced by:
PiCreateDriverSwDeviceCallback
PiProcessNewDeviceNode