IopBuildFullDriverPath

NTSTATUS __stdcall IopBuildFullDriverPath(UNICODE_STRING *KeyName, PVOID KeyHandle, UNICODE_STRING *FullPath){
  WCHAR v6; 
  WCHAR v7; 
  WCHAR v8; 
  WCHAR v9; 
  WCHAR v10; 
  int appended; 
  NTSTATUS RegistryValue; 
  WCHAR v13; 
  PVOID v14; 
  unsigned int v15; 
  wchar_t *v16; 
  unsigned __int16 Length; 
  unsigned int v18; 
  CHAR *Pool_1; 
  WCHAR v21; 
  UNICODE_STRING v22; 
  UNICODE_STRING String2; 
  UNICODE_STRING Source; 
  struct _UNICODE_STRING DestinationString; 
  UNICODE_STRING String1; 
  UNICODE_STRING v27; 
  UNICODE_STRING v28; 
  UNICODE_STRING v29; 
  PVOID P; 
  *(_QWORD *)&String1.Length = 1703960i64;
  *(_QWORD *)&v27.Length = 2359330i64;
  String1.Buffer = L"\\SystemRoot\\";
  v27.Buffer = L"System32\\Drivers\\";
  DestinationString = 0i64;
  Source = 0i64;
  v28 = 0i64;
  String2 = 0i64;
  v29 = 0i64;
  RtlInitUnicodeString(FullPath, 0i64, (WCHAR)FullPath);
  RtlInitUnicodeString(&DestinationString, 0i64, v6);
  RtlInitUnicodeString(&Source, 0i64, v7);
  RtlInitUnicodeString(&v28, 0i64, v8);
  RtlInitUnicodeString(&String2, 0i64, v9);
  RtlInitUnicodeString(&v29, 0i64, v10);
  P = 0i64;
  appended = IopQueryRegistryKeySystemPath(KeyHandle, &DestinationString);
  if( appended < 0 )
    goto LABEL_16;
  RegistryValue = IopGetRegistryValue(KeyHandle, (PWCHAR)L"ImagePath", 0x100ui64, (KEY_VALUE_FULL_INFORMATION **)&P);
  v14 = P;
  if( RegistryValue < 0 || (v15 = *((_DWORD *)P + 3), v15 < 2) )
  {
    Source = DestinationString;
    v22 = *KeyName;
    v28 = v27;
    String2 = v22;
    RtlInitUnicodeString(&v29, L".SYS", v13);
    Length = String2.Length;
  }
  else
  {
    if( v15 > 0xFFFF )
      goto LABEL_20;
    v16 = (wchar_t *)((char *)P + *((unsigned int *)P + 2));
    String2.MaximumLength = *((_DWORD *)P + 3);
    Length = v15 - 2;
    String2.Buffer = v16;
    String2.Length = v15 - 2;
    if( *v16 == 92 )
    {
      if( (unsigned __int8)RtlPrefixUnicodeString(&String1, (INT64 *)&String2) )
      {
        Length -= 24;
        Source = DestinationString;
        String2.Length = Length;
        String2.Buffer = v16 + 12;
      }
      else
      {
        RtlInitUnicodeString(&Source, 0i64, v21);
      }
    }
    else
    {
      Source = DestinationString;
    }
  }
  v18 = Source.Length + 2 + v28.Length + v29.Length + Length;
  if( v18 <= 0xFFFF )
  {
    FullPath->MaximumLength = v18;
    FullPath->Length = 0;
    Pool_1 = IopVerifierExAllocatePool_1(PagedPool, (unsigned __int16)v18);
    FullPath->Buffer = (wchar_t *)Pool_1;
    if( Pool_1 )
    {
      appended = RtlAppendUnicodeStringToString(FullPath, &Source);
      if( appended >= 0 )
      {
        appended = RtlAppendUnicodeStringToString(FullPath, &v28);
        if( appended >= 0 )
        {
          appended = RtlAppendUnicodeStringToString(FullPath, &String2);
          if( appended >= 0 )
          {
            appended = RtlAppendUnicodeStringToString(FullPath, &v29);
            if( appended >= 0 )
              FullPath->Buffer[(unsigned __int64)FullPath->Length >> 1] = 0;
          }
        }
      }
    }
    else
    {
      appended = -1073741670;
    }
    goto LABEL_14;
  }
LABEL_20:
  appended = -2147483643;
LABEL_14:
  if( v14 )
    ExFreePoolWithTag(v14, 0);
LABEL_16:
  RtlFreeAnsiString(&DestinationString);
  return appended;
}

Referenced by:

IopLoadDriver
PiNormalizeDeviceText
PpCheckInDriverDatabase