DrvDbCreateDatabaseNode

INT64 __fastcall DrvDbCreateDatabaseNode(
        INT64 a1,
        const WCHAR *a2,
        INT64 a3,
        CHAR *a4,
        INT64 a5,
        INT64 a6,
        INT64 arg30,
        CHAR **arg38){
  CHAR **v8; 
  int v10; 
  _QWORD *v13; 
  WCHAR *PoolWithTag; 
  _QWORD *v15; 
  _QWORD *v16; 
  UINT64 v17; 
  INT64 v18; 
  struct _ERESOURCE *v19; 
  int v20; 
  bool v21; 
  UINT64 *v22; 
  __int64 v24; 
  UINT64 v25; 
  int v26; 
  const UNICODE_STRING *v27; 
  __int64 v28; 
  _QWORD *v29; 
  void *v30; 
  VOID *dwFlags; 
  INT64 a7[2]; 
  INT64 a8; 
  v8 = arg38;
  a7[0] = 0i64;
  LODWORD(a8) = 0;
  v10 = a3;
  *arg38 = 0i64;
  v13 = 0i64;
  if( a4 )
  {
    PoolWithTag = (WCHAR *)a4;
  }
  else
  {
    v24 = -1i64;
    do
      ++v24;
    while( a2[v24] );
    v25 = (unsigned int)(2 * v24 + 68);
    PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, v25, 0x42444450ui64);
    if( !PoolWithTag )
      goto LABEL_25;
    LODWORD(dwFlags) = 2048;
    RtlStringCchPrintfExW(PoolWithTag, v25 >> 1, 0i64, 0i64, (UINT64)dwFlags, L"%ws\\%ws\\%ws");
    v20 = v26;
    if( v26 < 0 )
      goto LABEL_13;
  }
  v15 = ExAllocatePoolWithTag(PagedPool, 0xA0ui64, 0x42444450ui64);
  v13 = v15;
  if( !v15 )
  {
LABEL_25:
    v20 = -1073741801;
    goto LABEL_13;
  }
  memset((INT64)v15, 0i64);
  *((_DWORD *)v13 + 15) = *(_DWORD *)(a1 + 8);
  *((_DWORD *)v13 + 14) = a5;
  v13[9] = a6;
  v13[10] = arg30;
  *((_DWORD *)v13 + 16) = 0x10000;
  *((_DWORD *)v13 + 8) = v10;
  if( RtlCreateUnicodeString((UNICODE_STRING *)v13 + 1, (PWCHAR)a2)
    && RtlCreateUnicodeString((UNICODE_STRING *)(v13 + 5), PoolWithTag) )
  {
    v19 = (struct _ERESOURCE *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x68ui64, 0x42444450ui64);
    v13[18] = v19;
    if( v19 )
    {
      v20 = ExInitializeResourceLite(v19);
      if( v20 < 0 )
      {
        ExFreePoolWithTag((PVOID)v13[18], 0);
        v13[18] = 0i64;
      }
    }
    else
    {
      v20 = -1073741670;
    }
    if( v20 >= 0 )
    {
      v16 = *(_QWORD **)(a1 + 24);
      if( *v16 != a1 + 16 )
        goto LABEL_40;
      v21 = (a5 & 0x10) == 0;
      *v13 = a1 + 16;
      v13[1] = v16;
      *v16 = v13;
      *(_QWORD *)(a1 + 24) = v13;
      if( v21
        || (v27 = *(const UNICODE_STRING **)(a1 + 32)) == 0i64
        || (LODWORD(dwFlags) = 0x2000000,
            v20 = DrvDbOpenObjectRegKey(
                    (INT64 *)a1,
                    v27,
                    1i64,
                    (WCHAR *)a2,
                    (INT64)dwFlags,
                    1,
                    (INT64)a7,
                    (INT64)&a8,
                    0i64),
            v20 >= 0)
        && ((_DWORD)a8 != 1
         || (v20 = DrvDbSetDriverDatabaseMappedProperty(
                     a1,
                     a2,
                     (void *)a7[0],
                     (__int64)&DEVPKEY_DriverDatabase_RegistryPath,
                     18,
                     (int *)v13[6],
                     (unsigned int)*((unsigned __int16 *)v13 + 20) + 2),
             v20 >= 0)) )
      {
        *v8 = (CHAR *)v13;
        v13 = 0i64;
      }
    }
  }
  else
  {
    v20 = -1073741670;
  }
LABEL_13:
  v22 = (UINT64 *)a7[0];
  if( a7[0] )
    PnpCtxRegCloseKey((__int64)v16, (void *)a7[0]);
  if( v13 )
  {
    v28 = *v13;
    if( !*v13 )
    {
LABEL_37:
      v30 = (void *)v13[18];
      if( v30 )
      {
        ExDeleteResourceLite(v13[18], v22, v17, v18, dwFlags);
        ExFreePoolWithTag(v30, 0);
      }
      RtlFreeAnsiString((_UNICODE_STRING *)v13 + 1);
      RtlFreeAnsiString((_UNICODE_STRING *)(v13 + 5));
      ExFreePoolWithTag(v13, 0);
      goto LABEL_16;
    }
    if( *(_QWORD **)(v28 + 8) == v13 )
    {
      v29 = (_QWORD *)v13[1];
      if( (_QWORD *)*v29 == v13 )
      {
        *v29 = v28;
        *(_QWORD *)(v28 + 8) = v29;
        goto LABEL_37;
      }
    }
LABEL_40:
    __fastfail(3u);
  }
LABEL_16:
  if( PoolWithTag && PoolWithTag != (WCHAR *)a4 )
    ExFreePoolWithTag(PoolWithTag, 0);
  return(unsigned int)v20;
}

Referenced by:

DrvDbOpenContext
DrvDbOpenDriverDatabaseRegKey
DrvDbRegisterDatabase