PipGenerateContainerID
__int64 __fastcall PipGenerateContainerID(__int64 a1, __int64 a2, char a3, const WCHAR *a4, _QWORD *a5){
__int64 v5;
int v7;
GUID *p_Guid;
wchar_t *Buffer;
unsigned int MaximumLength;
UINT8 *PoolWithTag;
_ETHREAD *CurrentThread;
const wchar_t *v14;
int DeviceRegProp;
__int64 i;
struct _UNICODE_STRING UnicodeString;
int v18;
int v19;
GUID Guid;
WCHAR SourceString[40];
v18 = 0;
v19 = 0;
v5 = a2;
*(_QWORD *)&UnicodeString.Length = 0i64;
*a5 = 0i64;
v7 = 0;
UnicodeString.Buffer = 0i64;
Guid = 0i64;
if( !a3 )
{
p_Guid = (GUID *)(*(_QWORD *)(a1 + 16) + 664i64);
goto LABEL_3;
}
if( !a4 )
{
if( a2 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
LOBYTE(a2) = 1;
ExAcquireResourceSharedLite(&PnpRegistryDeviceResource, a2);
v14 = *(const wchar_t **)(a1 + 48);
v18 = 78;
DeviceRegProp = CmGetDeviceRegProp(
PiPnpRtlCtx,
v14,
v5,
37,
(__int64)&v19,
(__int64)SourceString,
(__int64)&v18,
0);
ExReleaseResourceLite(&PnpRegistryDeviceResource);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( DeviceRegProp >= 0 && v19 == 1 && RtlCreateUnicodeString(&UnicodeString, SourceString) )
{
v7 = RtlGUIDFromString(&UnicodeString, &Guid);
if( v7 >= 0 )
{
for( i = *(_QWORD *)(a1 + 16); i; i = *(_QWORD *)(i + 16) )
{
if( (GUID *)(i + 664) == &Guid || RtlCompareMemory((VOID *)(i + 664), &Guid, 0x10ui64) == 16 )
goto LABEL_27;
}
LABEL_4:
if( v7 < 0 )
return(unsigned int)v7;
goto LABEL_5;
}
LABEL_27:
RtlFreeAnsiString(&UnicodeString);
}
}
v7 = ExUuidCreate(&Guid);
if( v7 < 0 )
return(unsigned int)v7;
p_Guid = &Guid;
LABEL_3:
v7 = RtlStringFromGUIDEx(p_Guid, &UnicodeString, 1u);
goto LABEL_4;
}
if( !RtlCreateUnicodeString(&UnicodeString, (PWCHAR)a4) )
return(unsigned int)-1073741670;
LABEL_5:
Buffer = UnicodeString.Buffer;
if( UnicodeString.Buffer )
{
MaximumLength = UnicodeString.MaximumLength;
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, UnicodeString.MaximumLength, 0x6E657050ui64);
*a5 = PoolWithTag;
if( PoolWithTag )
memmove(PoolWithTag, (UINT8 *)Buffer, MaximumLength);
else
v7 = -1073741670;
RtlFreeAnsiString(&UnicodeString);
}
return(unsigned int)v7;
}Referenced by:
PiProcessNewDeviceNode