DrvDbSetDriverDatabaseMappedProperty

__int64 __fastcall DrvDbSetDriverDatabaseMappedProperty(
        __int64 a1,
        const wchar_t *a2,
        void *a3,
        __int64 a4,
        int a5,
        int *SourceString,
        ULONG a7){
  int DatabaseNode; 
  INT64 v11; 
  int v12; 
  __int64 v13; 
  int v14; 
  unsigned int v15; 
  __int64 **v16; 
  __int64 *v17; 
  __int64(**v18)[3]; 
  __int64(**v19)[3]; 
  unsigned int v20; 
  __int64(*v21)[3]; 
  HANDLE v22; 
  int v23; 
  __int64 v25; 
  __int64 v26; 
  int v27; 
  unsigned int v28; 
  __int64 v29; 
  int v30; 
  __int64 v31; 
  _ETHREAD *v32; 
  __int64 v33; 
  int v34; 
  struct _ERESOURCE *v35; 
  __int64 v36; 
  __int64 v37; 
  __int64 v38; 
  __int64(**v39)[3]; 
  unsigned int v40; 
  __int64(*v41)[3]; 
  __int64 v42; 
  __int64 v43; 
  _ETHREAD *CurrentThread; 
  INT64 v45; 
  struct _UNICODE_STRING v46; 
  INT64 a5a; 
  INT64 v48; 
  __int64(**v49)[3]; 
  HANDLE Handle; 
  struct _UNICODE_STRING DestinationString; 
  Handle = 0i64;
  v48 = 0i64;
  DatabaseNode = 0;
  v11 = 0i64;
  DestinationString = 0i64;
  v12 = wcsicmp(a2, L"*");
  v14 = *(_DWORD *)(a4 + 16);
  if( v12 )
  {
    if( v14 == 2 )
    {
      v29 = *(_QWORD *)a4 - DEVPKEY_NODE;
      if( *(_QWORD *)a4 == DEVPKEY_NODE )
        v29 = *(_QWORD *)(a4 + 8) + 0x5008C7D4C8250077i64;
      if( !v29 )
      {
LABEL_50:
        DatabaseNode = -1073741790;
        goto LABEL_24;
      }
    }
    v15 = 0;
    v16 = off_140C02C70;
    while( 1 )
    {
      v17 = *v16;
      if( *((_DWORD *)*v16 + 4) == v14 )
      {
        v13 = *v17 - *(_QWORD *)a4;
        if( *v17 == *(_QWORD *)a4 )
          v13 = v17[1] - *(_QWORD *)(a4 + 8);
        if( !v13 )
          break;
      }
      ++v15;
      ++v16;
      if( v15 >= 7 )
      {
        v49 = 0i64;
        v18 = &off_140001FC0;
        v19 = 0i64;
        v20 = 0;
        while( 1 )
        {
          v21 = *v18;
          if( LODWORD((**v18)[2]) == v14 )
          {
            v13 = (*v21)[0] - *(_QWORD *)a4;
            if( (*v21)[0] == *(_QWORD *)a4 )
              v13 = (*v21)[1] - *(_QWORD *)(a4 + 8);
            if( !v13 )
              break;
          }
          ++v20;
          v18 += 5;
          if( v20 >= 0xC )
            goto LABEL_14;
        }
        v13 = 5i64 * v20;
        v19 = &off_140001FC0 + 5 * v20;
        v49 = v19;
LABEL_14:
        if( v19 )
          goto LABEL_15;
        v49 = 0i64;
        v39 = &off_140009A30;
        v19 = 0i64;
        v40 = 0;
        while( 1 )
        {
          v41 = *v39;
          if( LODWORD((**v39)[2]) == v14 )
          {
            v42 = (*v41)[0] - *(_QWORD *)a4;
            if( (*v41)[0] == *(_QWORD *)a4 )
              v42 = (*v41)[1] - *(_QWORD *)(a4 + 8);
            if( !v42 )
              break;
          }
          ++v40;
          v39 += 5;
          if( v40 >= 4 )
            goto LABEL_105;
        }
        v19 = &off_140009A30 + 5 * v40;
        v49 = v19;
LABEL_105:
        if( !v19 )
        {
          DatabaseNode = -1073741802;
          goto LABEL_24;
        }
        DatabaseNode = DrvDbFindDatabaseNode(a1, a2, (const UNICODE_STRING **)&v48);
        if( DatabaseNode >= 0 )
        {
          v11 = v48;
          if( (*(_DWORD *)(v48 + 56) & 0x10) == 0 )
            goto LABEL_50;
LABEL_15:
          if( a5 != *((_DWORD *)v19 + 2) && a5 )
          {
LABEL_111:
            DatabaseNode = -1073741811;
            goto LABEL_24;
          }
          if( (v22 = a3) != 0i64 && (!v11 || (*(_DWORD *)(v11 + 56) & 0x10) == 0)
            || (!v11 || (*(_DWORD *)(v11 + 56) & 0x10) == 0 ? (v23 = DrvDbOpenDriverDatabaseRegKey(
                                                                       (const UNICODE_STRING **)a1,
                                                                       a2,
                                                                       2u,
                                                                       0,
                                                                       &Handle,
                                                                       0i64)) : (LODWORD(a5a) = 2,
                                                                                 v23 = DrvDbOpenObjectRegKey(
                                                                                         (INT64 *)a1,
                                                                                         *(const UNICODE_STRING **)(a1 + 32),
                                                                                         1i64,
                                                                                         (WCHAR *)a2,
                                                                                         a5a,
                                                                                         0,
                                                                                         (INT64)&Handle,
                                                                                         0i64,
                                                                                         0i64)),
                DatabaseNode = v23,
                v23 >= 0) )
          {
            if( Handle )
              v22 = Handle;
            DatabaseNode = DrvDbSetRegValueMappedProperty(v13, v22, (__int64)v49, a5, SourceString, a7);
            if( DatabaseNode >= 0 && v11 && (*(_DWORD *)(v11 + 56) & 0x10) != 0 && *(_DWORD *)(a4 + 16) == 14 )
            {
              v43 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_RegistryPath;
              if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_RegistryPath )
                v43 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
              if( !v43 && a5 )
              {
                if( a7 < 2 || !SourceString || *((_WORD *)SourceString + ((unsigned __int64)a7 >> 1) - 1) )
                  goto LABEL_111;
                if( !RtlCreateUnicodeString(&DestinationString, (PWCHAR)SourceString) )
                {
                  DatabaseNode = -1073741670;
                  goto LABEL_24;
                }
                CurrentThread = (_ETHREAD *)KeGetCurrentThread();
                --*((_WORD *)CurrentThread + 242);
                v45 = v48;
                ExAcquireResourceExclusiveLite(*(ERESOURCE **)(v48 + 144), 1u);
                RtlFreeAnsiString((_UNICODE_STRING *)(v45 + 40));
                v46 = DestinationString;
                *(_DWORD *)(v45 + 32) = 0;
                *(struct _UNICODE_STRING *)(v45 + 40) = v46;
                v35 = *(struct _ERESOURCE **)(v45 + 144);
                goto LABEL_129;
              }
            }
          }
        }
        goto LABEL_24;
      }
    }
    DatabaseNode = DrvDbFindDatabaseNode(a1, a2, (const UNICODE_STRING **)&v48);
    if( DatabaseNode < 0 )
      goto LABEL_24;
    v30 = *(_DWORD *)(a4 + 16);
    switch( v30 )
    {
      case 5:
        v31 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_Loaded;
        if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_Loaded )
          v31 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
        if( !v31 )
        {
          if( a5 != 17 || a7 != 1 || !SourceString )
            goto LABEL_111;
          if( (*(_DWORD *)(v48 + 56) & 1) != 0 )
            goto LABEL_50;
          v32 = (_ETHREAD *)KeGetCurrentThread();
          --*((_WORD *)v32 + 242);
          v33 = v48;
          ExAcquireResourceExclusiveLite(*(ERESOURCE **)(v48 + 144), 1u);
          if( *(_BYTE *)SourceString == 0xFF )
            v34 = DrvDbLoadDatabaseNode(a1, v33);
          else
            v34 = DrvDbUnloadDatabaseNode(a1, v33);
          v35 = *(struct _ERESOURCE **)(v33 + 144);
          DatabaseNode = v34;
LABEL_129:
          ExReleaseResourceLite(v35);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          goto LABEL_24;
        }
        goto LABEL_24;
      case 6:
        v36 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_Selected;
        if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_Selected )
          v36 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
        if( !v36 )
        {
          if( a5 != 17 || a7 != 1 || !SourceString )
            goto LABEL_111;
          if( *(_BYTE *)SourceString == 0xFF )
          {
            *(_QWORD *)(a1 + 40) = v48;
          }
          else if( v48 == *(_QWORD *)(a1 + 40) || !v48 )
          {
            *(_QWORD *)(a1 + 40) = 0i64;
          }
        }
        goto LABEL_24;
      case 7:
        v37 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_Disabled;
        if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_Disabled )
          v37 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
        if( !v37 )
        {
          if( a5 != 17 || a7 != 1 || !SourceString )
            goto LABEL_111;
          if( *(_BYTE *)SourceString == 0xFF )
            *(_DWORD *)(v48 + 56) |= 4u;
          else
            *(_DWORD *)(v48 + 56) &= ~4u;
        }
        goto LABEL_24;
    }
    if( v30 != 11 )
      goto LABEL_24;
    v38 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_AccessMask;
    if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_AccessMask )
      v38 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
    if( v38 )
      goto LABEL_24;
    if( a5 != 7 || a7 != 4 || !SourceString )
      goto LABEL_111;
    if( v48 != *(_QWORD *)(a1 + 32) )
      goto LABEL_50;
    v27 = *SourceString;
    goto LABEL_44;
  }
  if( v14 != 6 )
  {
    if( v14 == 11 )
    {
      v26 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_AccessMask;
      if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_AccessMask )
        v26 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
      if( !v26 )
      {
        if( a5 != 7 || a7 != 4 || !SourceString )
          goto LABEL_111;
        v27 = *SourceString;
LABEL_44:
        v28 = v27 & 0xD0000000;
        *(_DWORD *)(a1 + 12) = v28;
        if( v28 == 0x10000000 )
          *(_DWORD *)(a1 + 12) = -805306368;
        goto LABEL_24;
      }
    }
LABEL_46:
    DatabaseNode = -1073741637;
    goto LABEL_24;
  }
  v25 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_Selected;
  if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_Selected )
    v25 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
  if( v25 )
    goto LABEL_46;
  if( a5 != 17 || a7 != 1 || !SourceString )
    goto LABEL_111;
  if( *(_BYTE *)SourceString == 0xFF )
    *(_QWORD *)(a1 + 40) = 0i64;
LABEL_24:
  if( Handle )
    ZwClose(Handle);
  return(unsigned int)DatabaseNode;
}

Referenced by:

DrvDbCreateDatabaseNode
DrvDbDispatchDriverDatabase
DrvDbInitializeDatabaseNodeVersion