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