DrvDbSetDriverDatabaseMappedProperty

NTSTATUS __stdcall DrvDbSetDriverDatabaseMappedProperty(
        _UNICODE_STRING **pDrvDbCtx,
        WCHAR *DatabaseNodeId,
        VOID *ObjectBaseKey,
        _DEVPROPKEY *PropertyKey,
        UINT64 PropertyType,
        UINT8 *PropertyBuffer,
        UINT64 PropertySize){
  int v10; 
  _DRVDB_NODE *v11; 
  int v12; 
  __int64 v13; 
  unsigned int pid; 
  unsigned int v15; 
  char *v16; 
  _QWORD *v17; 
  _DEVPROPKEY **v18; 
  __int64(**v19)[3]; 
  unsigned int v20; 
  _DEVPROPKEY *v21; 
  _DRVDB_PROPERTY_REG_VALUE_MAP *v22; 
  NTSTATUS v23; 
  __int64 v25; 
  __int64 v26; 
  int v27; 
  unsigned int v28; 
  __int64 v29; 
  INT64 v30; 
  unsigned int v31; 
  __int64 v32; 
  _ETHREAD *v33; 
  _DRVDB_NODE *v34; 
  NTSTATUS v35; 
  _ERESOURCE *v36; 
  __int64 v37; 
  __int64 v38; 
  __int64 v39; 
  __int64(**v40)[3]; 
  unsigned int v41; 
  __int64(*v42)[3]; 
  __int64 v43; 
  __int64 v44; 
  INT64 v45; 
  _ETHREAD *CurrentThread; 
  _DRVDB_NODE *v47; 
  _UNICODE_STRING v48; 
  _DRVDB_NODE *DatabaseNode; 
  UINT64 v50; 
  VOID *Handle; 
  _UNICODE_STRING DestinationString; 

  Handle = 0i64;
  DatabaseNode = 0i64;
  v10 = 0;
  v11 = 0i64;
  DestinationString = 0i64;
  v12 = wcsicmp(DatabaseNodeId, L"*");
  pid = PropertyKey->pid;
  if( v12 )
  {
    if( pid == 2 )
    {
      v29 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_NODE;
      if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_NODE )
        v29 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x5008C7D4C8250077i64;
      if( !v29 )
      {
LABEL_50:
        v10 = -1073741790;
        goto LABEL_24;
      }
    }
    v15 = 0;
    v16 = (char *)&stru_140C00F40 + 7472;
    while( 1 )
    {
      v17 = *(_QWORD **)v16;
      if( *(_DWORD *)(*(_QWORD *)v16 + 16i64) == pid )
      {
        v13 = *v17 - *(_QWORD *)&PropertyKey->fmtid.Data1;
        if( *v17 == *(_QWORD *)&PropertyKey->fmtid.Data1 )
          v13 = v17[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
        if( !v13 )
          break;
      }
      ++v15;
      v16 += 8;
      if( v15 >= 7 )
      {
        v50 = 0i64;
        v18 = &off_140001FC0;
        v19 = 0i64;
        v20 = 0;
        while( 1 )
        {
          v21 = *v18;
          if( (*v18)->pid == pid )
          {
            v13 = *(_QWORD *)&v21->fmtid.Data1 - *(_QWORD *)&PropertyKey->fmtid.Data1;
            if( *(_QWORD *)&v21->fmtid.Data1 == *(_QWORD *)&PropertyKey->fmtid.Data1 )
              v13 = *(_QWORD *)v21->fmtid.Data4 - *(_QWORD *)PropertyKey->fmtid.Data4;
            if( !v13 )
              break;
          }
          ++v20;
          v18 += 5;
          if( v20 >= 0xC )
            goto LABEL_14;
        }
        v13 = 5i64 * v20;
        v19 = (__int64(**)[3])&(&off_140001FC0)[5 * v20];
        v50 = (UINT64)v19;
LABEL_14:
        if( v19 )
          goto LABEL_15;
        v50 = 0i64;
        v40 = &off_140009A30;
        v19 = 0i64;
        v41 = 0;
        while( 1 )
        {
          v42 = *v40;
          if( LODWORD((**v40)[2]) == pid )
          {
            v43 = (*v42)[0] - *(_QWORD *)&PropertyKey->fmtid.Data1;
            if( (*v42)[0] == *(_QWORD *)&PropertyKey->fmtid.Data1 )
              v43 = (*v42)[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
            if( !v43 )
              break;
          }
          ++v41;
          v40 += 5;
          if( v41 >= 4 )
            goto LABEL_105;
        }
        v19 = &off_140009A30 + 5 * v41;
        v50 = (UINT64)v19;
LABEL_105:
        if( !v19 )
        {
          v10 = -1073741802;
          goto LABEL_24;
        }
        v10 = DrvDbFindDatabaseNode((_DRVDB_CONTEXT *)pDrvDbCtx, DatabaseNodeId, &DatabaseNode);
        if( v10 >= 0 )
        {
          v11 = DatabaseNode;
          if( (DatabaseNode[14] & 0x10) == 0 )
            goto LABEL_50;
LABEL_15:
          if( (_DWORD)PropertyType != *((_DWORD *)v19 + 2) && (_DWORD)PropertyType )
          {
LABEL_111:
            v10 = -1073741811;
            goto LABEL_24;
          }
          if( (v22 = (_DRVDB_PROPERTY_REG_VALUE_MAP *)ObjectBaseKey) != 0i64 && (!v11 || (v11[14] & 0x10) == 0)
            || (!v11 || (v11[14] & 0x10) == 0 ? (v23 = DrvDbOpenDriverDatabaseRegKey(
                                                         pDrvDbCtx,
                                                         DatabaseNodeId,
                                                         2ui64,
                                                         0,
                                                         &Handle,
                                                         0i64)) : (v23 = DrvDbOpenObjectRegKey(
                                                                           (_DRVDB_CONTEXT *)pDrvDbCtx,
                                                                           pDrvDbCtx[4],
                                                                           DRVDB_BASE_KEY_TYPE_NODES,
                                                                           DatabaseNodeId,
                                                                           2,
                                                                           0,
                                                                           &Handle,
                                                                           0i64)),
                v10 = v23,
                v23 >= 0) )
          {
            if( Handle )
              v22 = (_DRVDB_PROPERTY_REG_VALUE_MAP *)Handle;
            v10 = DrvDbSetRegValueMappedProperty(
                    (VOID *)v13,
                    v22,
                    v50,
                    (UINT8 *)(unsigned int)PropertyType,
                    (UINT64)PropertyBuffer);
            if( v10 >= 0 && v11 && (v11[14] & 0x10) != 0 && PropertyKey->pid == 14 )
            {
              v44 = *(_QWORD *)&PropertyKey->fmtid.Data1 - *(_QWORD *)&DEVPKEY_DriverDatabase_RegistryPath.fmtid.Data1;
              if( *(_QWORD *)&PropertyKey->fmtid.Data1 == *(_QWORD *)&DEVPKEY_DriverDatabase_RegistryPath.fmtid.Data1 )
                v44 = *(_QWORD *)PropertyKey->fmtid.Data4 - *(_QWORD *)DEVPKEY_DriverDatabase_RegistryPath.fmtid.Data4;
              if( !v44 && (_DWORD)PropertyType )
              {
                if( (unsigned int)PropertySize < 2
                  || !PropertyBuffer
                  || *(_WORD *)&PropertyBuffer[2 * ((unsigned __int64)(unsigned int)PropertySize >> 1) - 2] )
                {
                  goto LABEL_111;
                }
                if( !RtlCreateUnicodeString((INT64)&DestinationString, (INT8 *)PropertyBuffer) )
                {
                  v10 = -1073741670;
                  goto LABEL_24;
                }
                CurrentThread = (_ETHREAD *)KeGetCurrentThread();
                --CurrentThread->Tcb.KernelApcDisable;
                v47 = DatabaseNode;
                ExAcquireResourceExclusiveLite(*((_QWORD *)DatabaseNode + 18), 1, v45);
                RtlFreeAnsiString((_UNICODE_STRING *)(v47 + 10));
                v48 = DestinationString;
                v47[8] = 0;
                *(_UNICODE_STRING *)(v47 + 10) = v48;
                v36 = (_ERESOURCE *)*((_QWORD *)v47 + 18);
                goto LABEL_129;
              }
            }
          }
        }
        goto LABEL_24;
      }
    }
    v10 = DrvDbFindDatabaseNode((_DRVDB_CONTEXT *)pDrvDbCtx, DatabaseNodeId, &DatabaseNode);
    if( v10 < 0 )
      goto LABEL_24;
    v31 = PropertyKey->pid;
    switch( v31 )
    {
      case 5u:
        v32 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Loaded;
        if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Loaded )
          v32 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
        if( !v32 )
        {
          if( (_DWORD)PropertyType != 17 || (_DWORD)PropertySize != 1 || !PropertyBuffer )
            goto LABEL_111;
          if( (DatabaseNode[14] & 1) != 0 )
            goto LABEL_50;
          v33 = (_ETHREAD *)KeGetCurrentThread();
          --v33->Tcb.KernelApcDisable;
          v34 = DatabaseNode;
          ExAcquireResourceExclusiveLite(*((_QWORD *)DatabaseNode + 18), 1, v30);
          if( *PropertyBuffer == 0xFF )
            v35 = DrvDbLoadDatabaseNode((_DRVDB_CONTEXT *)pDrvDbCtx, v34);
          else
            v35 = DrvDbUnloadDatabaseNode((_DRVDB_CONTEXT *)pDrvDbCtx, v34);
          v36 = (_ERESOURCE *)*((_QWORD *)v34 + 18);
          v10 = v35;
LABEL_129:
          ExReleaseResourceLite(v36);
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          goto LABEL_24;
        }
        goto LABEL_24;
      case 6u:
        v37 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Selected;
        if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Selected )
          v37 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
        if( !v37 )
        {
          if( (_DWORD)PropertyType != 17 || (_DWORD)PropertySize != 1 || !PropertyBuffer )
            goto LABEL_111;
          if( *PropertyBuffer == 0xFF )
          {
            pDrvDbCtx[5] = (_UNICODE_STRING *)DatabaseNode;
          }
          else if( DatabaseNode == (_DRVDB_NODE *)pDrvDbCtx[5] || !DatabaseNode )
          {
            pDrvDbCtx[5] = 0i64;
          }
        }
        goto LABEL_24;
      case 7u:
        v38 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Disabled;
        if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Disabled )
          v38 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
        if( !v38 )
        {
          if( (_DWORD)PropertyType != 17 || (_DWORD)PropertySize != 1 || !PropertyBuffer )
            goto LABEL_111;
          if( *PropertyBuffer == 0xFF )
            DatabaseNode[14] |= 4u;
          else
            DatabaseNode[14] &= ~4u;
        }
        goto LABEL_24;
    }
    if( v31 != 11 )
      goto LABEL_24;
    v39 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_AccessMask;
    if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_AccessMask )
      v39 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
    if( v39 )
      goto LABEL_24;
    if( (_DWORD)PropertyType != 7 || (_DWORD)PropertySize != 4 || !PropertyBuffer )
      goto LABEL_111;
    if( DatabaseNode != (_DRVDB_NODE *)pDrvDbCtx[4] )
      goto LABEL_50;
    v27 = *(_DWORD *)PropertyBuffer;
    goto LABEL_44;
  }
  if( pid != 6 )
  {
    if( pid == 11 )
    {
      v26 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_AccessMask;
      if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_AccessMask )
        v26 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
      if( !v26 )
      {
        if( (_DWORD)PropertyType != 7 || (_DWORD)PropertySize != 4 || !PropertyBuffer )
          goto LABEL_111;
        v27 = *(_DWORD *)PropertyBuffer;
LABEL_44:
        v28 = v27 & 0xD0000000;
        *((_DWORD *)pDrvDbCtx + 3) = v28;
        if( v28 == 0x10000000 )
          *((_DWORD *)pDrvDbCtx + 3) = -805306368;
        goto LABEL_24;
      }
    }
LABEL_46:
    v10 = -1073741637;
    goto LABEL_24;
  }
  v25 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Selected;
  if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Selected )
    v25 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
  if( v25 )
    goto LABEL_46;
  if( (_DWORD)PropertyType != 17 || (_DWORD)PropertySize != 1 || !PropertyBuffer )
    goto LABEL_111;
  if( *PropertyBuffer == 0xFF )
    pDrvDbCtx[5] = 0i64;
LABEL_24:
  if( Handle )
    ZwClose((_HANDLE)Handle);
  return v10;
}

Referenced by:

DrvDbCreateDatabaseNode
DrvDbDispatchDriverDatabase
DrvDbInitializeDatabaseNodeVersion