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