PipMakeGloballyUniqueId

INT64 PipMakeGloballyUniqueId(void){
  _BOOL8 v0; 
  __int64 v1; 
  __int64 v2; 
  __int64 v3; 
  __int64 v4; 
  _QWORD *v5; 
  _ETHREAD *CurrentThread; 
  __int64 v7; 
  WCHAR *v8; 
  WCHAR *v9; 
  WCHAR *v10; 
  int CachedContextBaseKey; 
  unsigned int v12; 
  WCHAR *v13; 
  __int64 v14; 
  __int64 v15; 
  WCHAR *v16; 
  wchar_t *Buffer; 
  int v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  int v22; 
  WCHAR v23; 
  int v24; 
  WCHAR *PoolWithTag; 
  PULONG ResultLength; 
  PULONG ResultLengtha; 
  __int64 v28; 
  __int64 v29; 
  ULONG Length; 
  _QWORD *v31; 
  int Data; 
  struct _UNICODE_STRING ValueName; 
  HANDLE KeyHandle; 
  int v35; 
  HANDLE v36; 
  size_t cbDest; 
  NTSTRSAFE_PWSTR ppszDestEnd; 
  __int64 v39; 
  char KeyValueInformation[4]; 
  int v41; 
  int v42; 
  int v43; 
  v3 = 0i64;
  v31 = (_QWORD *)v2;
  Data = 0;
  KeyHandle = 0i64;
  v4 = -1i64;
  Length = 0;
  v5 = (_QWORD *)v2;
  ValueName = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = v1;
  v39 = v0;
  v8 = 0i64;
  v36 = 0i64;
  v9 = 0i64;
  v10 = 0i64;
  --*((_WORD *)CurrentThread + 242);
  LOBYTE(v0) = 1;
  ExAcquireResourceSharedLite(&PnpRegistryDeviceResource, v0);
  if( v7 )
    v3 = *(_QWORD *)(*(_QWORD *)(v7 + 312) + 40i64);
  CachedContextBaseKey = CmOpenDeviceRegKey(
                           PiPnpRtlCtx,
                           *(const wchar_t **)(v3 + 48),
                           16,
                           0,
                           131103,
                           0,
                           (__int64)&KeyHandle,
                           0i64);
  if( CachedContextBaseKey >= 0 )
  {
    ValueName.Buffer = L"UniqueParentID";
    *(_DWORD *)&ValueName.Length = 1966108;
    CachedContextBaseKey = ZwQueryValueKey(
                             KeyHandle,
                             &ValueName,
                             KeyValuePartialInformation,
                             KeyValueInformation,
                             0x10u,
                             &Length);
    if( CachedContextBaseKey >= 0 )
    {
      if( v41 != 4 || v42 != 4 )
      {
        CachedContextBaseKey = -1073741811;
        goto LABEL_18;
      }
      PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x12ui64, 0x6E657050ui64);
      v9 = PoolWithTag;
      if( !PoolWithTag )
        goto LABEL_47;
      RtlStringCbPrintfW(PoolWithTag, 0x12ui64, (WCHAR *)L"%x");
    }
    else
    {
      *(_DWORD *)&ValueName.Length = 1966108;
      Length = 66;
      ValueName.Buffer = (wchar_t *)L"ParentIdPrefix";
      v10 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x42ui64, 0x6E657050ui64);
      if( !v10 )
        goto LABEL_47;
      CachedContextBaseKey = ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation, v10, Length, &Length);
      if( CachedContextBaseKey >= 0 )
      {
        if( *((_DWORD *)v10 + 1) == 1 )
        {
          v12 = *((_DWORD *)v10 + 2);
          v13 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, v12, 0x6E657050ui64);
          v9 = v13;
          if( v13 )
          {
            RtlStringCbCopyW(v13, v12, v10 + 6);
            goto LABEL_10;
          }
LABEL_47:
          CachedContextBaseKey = -1073741670;
          goto LABEL_17;
        }
        CachedContextBaseKey = -1073741811;
LABEL_17:
        v5 = v31;
LABEL_18:
        ZwClose(KeyHandle);
        goto LABEL_19;
      }
      Length = 31;
      CachedContextBaseKey = RtlUpcaseUnicodeString(&ValueName, (UNICODE_STRING *)(v3 + 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 );
      }
      v35 = (int)abs32(314159269 * v19) % 1000000007;
      RtlFreeAnsiString(&ValueName);
      cbDest = 2 * Length;
      v9 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, cbDest, 0x6E657050ui64);
      if( !v9 )
        goto LABEL_47;
      RtlStringCbPrintfW(v9, cbDest, (WCHAR *)L"%s.%x.%x");
      CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(PiPnpRtlCtx, 5, (__int64 *)&v36);
      if( CachedContextBaseKey < 0 )
        goto LABEL_17;
      RtlInitUnicodeString(&ValueName, v9, v23);
      if( ZwQueryValueKey(v36, &ValueName, KeyValuePartialInformation, KeyValueInformation, 0x10u, &Length) < 0
        || v41 != 4
        || (v24 = v43, v42 != 4) )
      {
        v24 = 0;
      }
      LODWORD(ResultLength) = 4;
      Data = v24 + 1;
      CachedContextBaseKey = ZwSetValueKey(v36, &ValueName, 0i64, 4ui64, &Data, (UINT64)ResultLength);
      if( CachedContextBaseKey < 0 )
        goto LABEL_17;
      ValueName.Buffer = (wchar_t *)L"ParentIdPrefix";
      --Data;
      LODWORD(v29) = v35;
      *(_DWORD *)&ValueName.Length = 1966108;
      LODWORD(v28) = *(_DWORD *)(v3 + 152);
      ppszDestEnd = v9;
      RtlStringCchPrintfExW(v9, cbDest >> 1, &ppszDestEnd, 0i64, 0i64, L"%x&%x&%x", v28, v29, Data);
      Length = ppszDestEnd - v9 + 1;
      LODWORD(ResultLengtha) = 2 * Length;
      CachedContextBaseKey = ZwSetValueKey(KeyHandle, &ValueName, 0i64, 1ui64, v9, (UINT64)ResultLengtha);
      if( CachedContextBaseKey < 0 )
        goto LABEL_17;
    }
LABEL_10:
    v14 = v39;
    if( v39 )
    {
      v15 = -1i64;
      do
        ++v15;
      while( *(_WORD *)(v39 + 2 * v15) );
    }
    else
    {
      LODWORD(v15) = 0;
    }
    do
      ++v4;
    while( v9[v4] );
    Length = v4 + v15 + 2;
    v16 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 2i64 * Length, 0x6E657050ui64);
    v8 = v16;
    if( v16 )
    {
      if( v14 )
        RtlStringCchPrintfW(v16, Length, (WCHAR *)L"%s&%s");
      else
        RtlStringCchCopyW(v16, Length, v9);
      goto LABEL_17;
    }
    goto LABEL_47;
  }
LABEL_19:
  ExReleaseResourceLite(&PnpRegistryDeviceResource);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( v10 )
    ExFreePoolWithTag(v10, 0);
  if( v9 )
    ExFreePoolWithTag(v9, 0);
  *v5 = v8;
  return(unsigned int)CachedContextBaseKey;
}

Referenced by:

PiCreateDriverSwDeviceCallback
PiProcessNewDeviceNode