PipGenerateContainerID
NTSTATUS __stdcall PipGenerateContainerID(
_DEVICE_NODE *DeviceNode,
VOID *DeviceInstanceKey,
UINT8 Removable,
WCHAR *QueriedContainerID,
WCHAR **ContainerID){
int v7;
_GUID *p_ContainerID;
wchar_t *v9;
size_t MaximumLength;
VOID **PoolWithTag;
_ETHREAD *CurrentThread;
wchar_t *Buffer;
NTSTATUS DeviceRegProp;
_DEVICE_NODE *i;
UINT64 Flags;
_UNICODE_STRING GuidString;
UINT64 CmRegPropType;
_GUID Guid;
UINT8 PropertyBuffer[80];
CmRegPropType = 0i64;
*(_QWORD *)&GuidString.Length = 0i64;
*ContainerID = 0i64;
v7 = 0;
GuidString.Buffer = 0i64;
Guid = 0i64;
if( !Removable )
{
p_ContainerID = &DeviceNode->Parent->ContainerID;
goto LABEL_3;
}
if( !QueriedContainerID )
{
if( DeviceInstanceKey )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
Buffer = DeviceNode->InstancePath.Buffer;
LODWORD(Flags) = 0;
LODWORD(CmRegPropType) = 78;
DeviceRegProp = CmGetDeviceRegProp(
*(&stru_140CF2E80 + 607),
Buffer,
DeviceInstanceKey,
37i64,
(UINT64 *)((char *)&CmRegPropType + 4),
PropertyBuffer,
&CmRegPropType,
Flags);
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( DeviceRegProp >= 0
&& HIDWORD(CmRegPropType) == 1
&& RtlCreateUnicodeString((INT64)&GuidString, (INT8 *)PropertyBuffer) )
{
v7 = RtlGUIDFromString(&GuidString, &Guid);
if( v7 >= 0 )
{
for( i = DeviceNode->Parent; i; i = i->Parent )
{
if( &i->ContainerID == &Guid || RtlCompareMemory(&i->ContainerID, &Guid, 16) == (_SIZE_T *)16 )
goto LABEL_27;
}
LABEL_4:
if( v7 < 0 )
return v7;
goto LABEL_5;
}
LABEL_27:
RtlFreeAnsiString(&GuidString);
}
}
v7 = ExUuidCreate(&Guid);
if( v7 < 0 )
return v7;
p_ContainerID = &Guid;
LABEL_3:
v7 = RtlStringFromGUIDEx(p_ContainerID, &GuidString, 1u);
goto LABEL_4;
}
if( !RtlCreateUnicodeString((INT64)&GuidString, (INT8 *)QueriedContainerID) )
return -1073741670;
LABEL_5:
v9 = GuidString.Buffer;
if( GuidString.Buffer )
{
MaximumLength = GuidString.MaximumLength;
PoolWithTag = ExAllocatePoolWithTag(1ui64, GuidString.MaximumLength, 1852141648i64);
*ContainerID = (WCHAR *)PoolWithTag;
if( PoolWithTag )
memmove(PoolWithTag, v9, MaximumLength);
else
v7 = -1073741670;
RtlFreeAnsiString(&GuidString);
}
return v7;
}Referenced by:
PiProcessNewDeviceNode