PiDrvDbRegisterNode

INT64 __stdcall PiDrvDbRegisterNode(WCHAR *Name, UINT64 Flags){
  WCHAR v2; 
  const WCHAR *v3; 
  unsigned int v4; 
  const WCHAR *v6; 
  WCHAR *PoolWithTag; 
  char v8; 
  INT64 v9; 
  int Node; 
  unsigned __int16 *v11; 
  int v12; 
  UINT64 v13; 
  WCHAR *v14; 
  UINT8 v15; 
  int v16; 
  int v17; 
  INT64 v18; 
  WCHAR v20; 
  wchar_t *v21; 
  CHAR *UnicodeSubstring; 
  unsigned __int16 i; 
  UNICODE_STRING String2; 
  struct _UNICODE_STRING DestinationString; 
  struct _UNICODE_STRING v26; 
  PVOID P; 
  P = 0i64;
  v4 = Flags;
  v6 = v3;
  String2 = 0i64;
  PoolWithTag = 0i64;
  v8 = 0;
  DestinationString = 0i64;
  v26 = 0i64;
  RtlInitUnicodeString(&DestinationString, 0i64, v2);
  Node = PiDrvDbCreateNode(Name, v4, v9, v6, (INT64 *)&P);
  v11 = (unsigned __int16 *)P;
  v12 = Node;
  if( Node < 0 )
    goto LABEL_9;
  if( (*((_DWORD *)P + 16) & 1) != 0 )
  {
    v17 = v4 & 8;
  }
  else
  {
    v13 = *((unsigned __int16 *)P + 16) + 32i64;
    PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, v13, 0x62647050ui64);
    if( !PoolWithTag )
    {
      v12 = -1073741670;
      goto LABEL_9;
    }
    RtlStringCchPrintfW(PoolWithTag, v13 >> 1, (WCHAR *)L"%wZ\\%ws");
    v12 = v16;
    if( v16 < 0 )
      goto LABEL_9;
    v17 = v4 & 8;
    v12 = DrvDbRegisterDatabase(v14, Name, v15, PoolWithTag);
    if( v12 < 0 )
      goto LABEL_9;
    v8 = 1;
  }
  if( !v17 )
  {
LABEL_8:
    v11 = 0i64;
    goto LABEL_9;
  }
  v12 = PnpSetObjectProperty(
          PiPnpRtlCtx,
          *((_QWORD *)v11 + 3),
          7u,
          *((_QWORD *)v11 + 9),
          0i64,
          (__int64)DEVPKEY_DriverDatabase_FilePath,
          18,
          *((_QWORD *)v11 + 7),
          (unsigned int)v11[24] + 2,
          0);
  if( v12 >= 0 )
  {
    v21 = (wchar_t *)*((_QWORD *)v11 + 7);
    String2.Buffer = v21;
    RtlInitUnicodeString(&v26, L"\\System32\\config\\", v20);
    UnicodeSubstring = RtlFindUnicodeSubstring(v11 + 24, &v26.Length, 1);
    if( UnicodeSubstring )
    {
      i = 2 * ((__int64)(unsigned int)((_DWORD)UnicodeSubstring - *((_DWORD *)v11 + 14)) >> 1);
    }
    else
    {
      String2.Length = v11[24];
      for( i = String2.Length; i > 2u; String2.Length = i )
      {
        if( v21[((unsigned __int64)i >> 1) - 1] == 92 )
          break;
        i -= 2;
      }
      if( i <= 2u || v21[((unsigned __int64)i >> 1) - 1] != 92 )
        goto LABEL_25;
      i -= 2;
    }
    String2.Length = i;
LABEL_25:
    String2.MaximumLength = i;
    if( (int)PiDrvDbQuerySystemPathWin32(&String2, &DestinationString) < 0 )
    {
      v12 = 0;
      goto LABEL_8;
    }
    v12 = PnpSetObjectProperty(
            PiPnpRtlCtx,
            *((_QWORD *)v11 + 3),
            7u,
            *((_QWORD *)v11 + 9),
            0i64,
            (__int64)DEVPKEY_DriverDatabase_SystemPath,
            18,
            (__int64)DestinationString.Buffer,
            (unsigned int)DestinationString.Length + 2,
            0);
    if( v12 >= 0 )
      goto LABEL_8;
  }
LABEL_9:
  RtlFreeAnsiString(&DestinationString);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  if( v11 )
  {
    if( v8 )
      DrvDbUnregisterDatabase(v18, Name);
    PiDrvDbDestroyNode((CHAR *)v11);
  }
  return(unsigned int)v12;
}

Referenced by:

PiDrvDbInit
PiDrvDbRegisterNodeCallback