DrvDbCreateDatabaseNode

NTSTATUS __stdcall DrvDbCreateDatabaseNode(
        _DRVDB_CONTEXT *pDrvDbCtx,
        WCHAR *DatabaseNodeId,
        INT64 a3,
        WCHAR *a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  _QWORD *v8; 
  int v10; 
  VOID **v13; 
  WCHAR *PoolWithTag; 
  VOID **v15; 
  HPNPCTX *v16; 
  INT64 v17; 
  INT64 v18; 
  VOID **v19; 
  int v20; 
  bool v21; 
  __int64 v23; 
  UINT64 v24; 
  _UNICODE_STRING *v25; 
  VOID **v26; 
  VOID ***v27; 
  void *v28; 
  UINT64 dwFlags; 
  INT64 pszFormat; 
  VOID **Disposition; 
  UINT64 *v32; 
  VOID *ObjectBaseKey; 
  UINT64 v34; 

  v8 = (_QWORD *)a8;
  ObjectBaseKey = 0i64;
  LODWORD(v34) = 0;
  v10 = a3;
  *(_QWORD *)a8 = 0i64;
  v13 = 0i64;
  if( a4 )
  {
    PoolWithTag = a4;
  }
  else
  {
    v23 = -1i64;
    do
      ++v23;
    while( DatabaseNodeId[v23] );
    v24 = (unsigned int)(2 * v23 + 68);
    PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(1ui64, v24, 1111770192i64);
    if( !PoolWithTag )
      goto LABEL_25;
    v32 = (UINT64 *)DatabaseNodeId;
    Disposition = (VOID **)L"\\REGISTRY\\MACHINE";
    LODWORD(dwFlags) = 2048;
    v20 = RtlStringCchPrintfExW(PoolWithTag, v24 >> 1, 0i64, 0i64, dwFlags, (WCHAR *)L"%ws\\%ws\\%ws");
    if( v20 < 0 )
      goto LABEL_13;
  }
  v15 = ExAllocatePoolWithTag(1ui64, 0xA0ui64, 1111770192i64);
  v13 = v15;
  if( !v15 )
  {
LABEL_25:
    v20 = -1073741801;
    goto LABEL_13;
  }
  memset(v15, 0i64, 0xA0u);
  *((_DWORD *)v13 + 15) = pDrvDbCtx[2];
  *((_DWORD *)v13 + 14) = a5;
  v13[9] = (VOID *)a6;
  v13[10] = (VOID *)a7;
  *((_DWORD *)v13 + 16) = 0x10000;
  *((_DWORD *)v13 + 8) = v10;
  if( RtlCreateUnicodeString((INT64)(v13 + 2), (INT8 *)DatabaseNodeId)
    && RtlCreateUnicodeString((INT64)(v13 + 5), (INT8 *)PoolWithTag) )
  {
    v19 = ExAllocatePoolWithTag(0x200ui64, 0x68ui64, 1111770192i64);
    v13[18] = v19;
    if( v19 )
    {
      v20 = ExInitializeResourceLite((INT64)v19);
      if( v20 < 0 )
      {
        ExFreePoolWithTag(v13[18], 0);
        v13[18] = 0i64;
      }
    }
    else
    {
      v20 = -1073741670;
    }
    if( v20 >= 0 )
    {
      v16 = (HPNPCTX *)*((_QWORD *)pDrvDbCtx + 3);
      if( *(_DRVDB_CONTEXT **)v16 != pDrvDbCtx + 4 )
        goto LABEL_40;
      v21 = (a5 & 0x10) == 0;
      *v13 = pDrvDbCtx + 4;
      v13[1] = v16;
      *(_QWORD *)v16 = v13;
      *((_QWORD *)pDrvDbCtx + 3) = v13;
      if( v21
        || (v25 = (_UNICODE_STRING *)*((_QWORD *)pDrvDbCtx + 4)) == 0i64
        || (v20 = DrvDbOpenObjectRegKey(
                    pDrvDbCtx,
                    v25,
                    DRVDB_BASE_KEY_TYPE_NODES,
                    DatabaseNodeId,
                    0x2000000,
                    1u,
                    &ObjectBaseKey,
                    &v34),
            v20 >= 0)
        && ((_DWORD)v34 != 1
         || (LODWORD(Disposition) = *((unsigned __int16 *)v13 + 20) + 2,
             LODWORD(dwFlags) = 18,
             v20 = DrvDbSetDriverDatabaseMappedProperty(
                     (_UNICODE_STRING **)pDrvDbCtx,
                     DatabaseNodeId,
                     ObjectBaseKey,
                     (_DEVPROPKEY *)&DEVPKEY_DriverDatabase_RegistryPath,
                     dwFlags,
                     (UINT8 *)v13[6],
                     (UINT64)Disposition),
             v20 >= 0)) )
      {
        *v8 = v13;
        v13 = 0i64;
      }
    }
  }
  else
  {
    v20 = -1073741670;
  }
LABEL_13:
  if( ObjectBaseKey )
    PnpCtxRegCloseKey(v16, ObjectBaseKey, v17, v18, dwFlags, pszFormat, (INT64)Disposition, (INT64)v32);
  if( v13 )
  {
    v26 = (VOID **)*v13;
    if( !*v13 )
    {
LABEL_37:
      v28 = v13[18];
      if( v28 )
      {
        ExDeleteResourceLite((UINT64)v13[18]);
        ExFreePoolWithTag(v28, 0);
      }
      RtlFreeAnsiString((_UNICODE_STRING *)v13 + 1);
      RtlFreeAnsiString((_UNICODE_STRING *)(v13 + 5));
      ExFreePoolWithTag(v13, 0);
      goto LABEL_16;
    }
    if( v26[1] == v13 )
    {
      v27 = (VOID ***)v13[1];
      if( *v27 == v13 )
      {
        *v27 = v26;
        v26[1] = v27;
        goto LABEL_37;
      }
    }
LABEL_40:
    __fastfail(3u);
  }
LABEL_16:
  if( PoolWithTag && PoolWithTag != a4 )
    ExFreePoolWithTag(PoolWithTag, 0);
  return v20;
}

Referenced by:

DrvDbOpenContext
DrvDbOpenDriverDatabaseRegKey
DrvDbRegisterDatabase