IopGetDriverNameFromKeyNode

NTSTATUS __stdcall IopGetDriverNameFromKeyNode(PVOID KeyHandle, UNICODE_STRING *DriverName){
  wchar_t *v4; 
  WCHAR *v5; 
  int v6; 
  unsigned int v7; 
  unsigned __int16 *Pool_1; 
  NTSTATUS v9; 
  int v10; 
  unsigned int v11; 
  CHAR *v12; 
  _WORD *v14; 
  unsigned int v15; 
  __int16 *v16; 
  unsigned int i; 
  __int16 v18; 
  UNICODE_STRING Source; 
  UINT64 Length; 
  PVOID P; 
  P = 0i64;
  if( IopGetRegistryValue(KeyHandle, (PWCHAR)L"ObjectName", 0x40ui64, (KEY_VALUE_FULL_INFORMATION **)&P) >= 0 )
  {
    v4 = (wchar_t *)P;
    if( *((_DWORD *)P + 3) > 2u && *((_DWORD *)P + 1) == 1 )
    {
      v14 = P;
      v15 = (unsigned __int16)(*((_WORD *)P + 6) - 2);
      DriverName->Length = v15;
      DriverName->MaximumLength = v4[6];
      v16 = (__int16 *)((char *)v4 + *((unsigned int *)v4 + 2));
      for( i = v15 >> 1; i; --i )
      {
        v18 = *v16++;
        *v14++ = v18;
      }
      DriverName->Buffer = v4;
      return 0;
    }
    v10 = -1073741472;
    goto LABEL_27;
  }
  Source = 0i64;
  if( IopGetRegistryValue(KeyHandle, (PWCHAR)L"Type", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) >= 0 )
  {
    v4 = (wchar_t *)P;
    if( *((_DWORD *)P + 3) )
    {
      v5 = (WCHAR *)L"\\Driver\\";
      v6 = *(_DWORD *)((char *)P + *((unsigned int *)P + 2));
      if( v6 == 2 || (v7 = 16, v6 == 8) )
      {
        v5 = L"\\FileSystem\\";
        v7 = 24;
      }
      LODWORD(Length) = 164;
      Pool_1 = (unsigned __int16 *)IopVerifierExAllocatePool_1(NonPagedPoolNx, 0xA4ui64);
      if( !Pool_1 )
        goto LABEL_22;
      v9 = ZwQueryKey(KeyHandle, KeyBasicInformation, Pool_1, (unsigned int)Length, &Length);
      v10 = v9;
      if( v9 == -2147483643 || v9 == -1073741789 )
      {
        ExFreePoolWithTag(Pool_1, 0);
        Pool_1 = (unsigned __int16 *)IopVerifierExAllocatePool_1(NonPagedPoolNx, (unsigned int)Length);
        if( !Pool_1 )
          goto LABEL_22;
        v10 = ZwQueryKey(KeyHandle, KeyBasicInformation, Pool_1, (unsigned int)Length, &Length);
      }
      if( v10 < 0 )
      {
        ExFreePoolWithTag(Pool_1, 0);
        goto LABEL_27;
      }
      v11 = v7 + *((_DWORD *)Pool_1 + 3);
      if( v11 < v7 )
      {
        ExFreePoolWithTag(Pool_1, 0);
        v10 = -1073741675;
        goto LABEL_27;
      }
      v12 = IopVerifierExAllocatePool_1(NonPagedPoolNx, (unsigned __int16)(v7 + Pool_1[6]));
      DriverName->Buffer = (wchar_t *)v12;
      if( v12 )
      {
        DriverName->Length = 0;
        DriverName->MaximumLength = v11;
        RtlAppendUnicodeToString(DriverName, v5);
        Source.Length = Pool_1[6];
        Source.MaximumLength = Source.Length;
        Source.Buffer = Pool_1 + 8;
        RtlAppendUnicodeStringToString(DriverName, &Source);
        ExFreePoolWithTag(Pool_1, 0);
        ExFreePoolWithTag(v4, 0);
        return 0;
      }
      ExFreePoolWithTag(Pool_1, 0);
LABEL_22:
      v10 = -1073741670;
LABEL_27:
      ExFreePoolWithTag(v4, 0);
      return v10;
    }
    ExFreePoolWithTag(P, 0);
  }
  return -1073741472;
}

Referenced by:

IopInitializeBootDrivers
IopInitializeSystemDrivers
IopLoadDriver
IopUnloadDriver
PiGetDefaultMessageString
PipCallDriverAddDeviceQueryRoutine
PipInitializeCoreDriversByGroup
PipInitializeEarlyLaunchDrivers
PnpLoadBootFilterDriver