DrvDbGetDriverDatabaseMappedProperty

NTSTATUS __stdcall DrvDbGetDriverDatabaseMappedProperty(
        _DRVDB_CONTEXT *pDrvDbCtx,
        WCHAR *DatabaseNodeId,
        VOID *ObjectBaseKey,
        _DEVPROPKEY *PropertyKey,
        UINT64 *PropertyType,
        UINT8 *PropertyBuffer,
        UINT64 BufferSize,
        UINT64 *PropertySize){
  int RegValueMappedProperty; 
  _DRVDB_NODE *v12; 
  int v13; 
  __int64 v14; 
  unsigned int pid; 
  unsigned int v16; 
  char *v17; 
  _QWORD *v18; 
  const _DRVDB_PROPERTY_REG_VALUE_MAP *v19; 
  _DEVPROPKEY **v20; 
  unsigned int v21; 
  _DEVPROPKEY *v22; 
  _UNICODE_STRING **v23; 
  NTSTATUS v24; 
  VOID *v25; 
  __int64 v27; 
  __int64 v28; 
  size_t v29; 
  NTSTATUS v30; 
  unsigned int v31; 
  __int64 v32; 
  UINT8 *v33; 
  bool v34; 
  __int64 v35; 
  __int64 v36; 
  char v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  __int64(**v41)[3]; 
  unsigned int v42; 
  __int64(*v43)[3]; 
  __int64 v44; 
  UINT64 *Disposition; 
  _DRVDB_NODE *DatabaseNode; 
  VOID *PropertyRegValue; 

  PropertyRegValue = 0i64;
  DatabaseNode = 0i64;
  *(_DWORD *)PropertyType = 0;
  *(_DWORD *)PropertySize = 0;
  RegValueMappedProperty = 0;
  v12 = 0i64;
  v13 = wcsicmp(DatabaseNodeId, L"*");
  v14 = 0i64;
  if( !v13 )
  {
    RegValueMappedProperty = -1073741637;
    goto LABEL_23;
  }
  pid = PropertyKey->pid;
  if( pid == 2 )
  {
    v27 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_NODE;
    if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_NODE )
      v27 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x5008C7D4C8250077i64;
    if( !v27 )
    {
      *(_DWORD *)PropertyType = 18;
      v28 = -1i64;
      do
        ++v28;
      while( DatabaseNodeId[v28] );
      v29 = 2 * v28 + 2;
      *(_DWORD *)PropertySize = v29;
      if( PropertyBuffer && (unsigned int)BufferSize >= v29 )
      {
        memmove(PropertyBuffer, DatabaseNodeId, v29);
        goto LABEL_23;
      }
      goto LABEL_41;
    }
  }
  v16 = 0;
  v17 = (char *)&stru_140C00F40 + 7472;
  do
  {
    v18 = *(_QWORD **)v17;
    if( *(_DWORD *)(*(_QWORD *)v17 + 16i64) == pid )
    {
      v14 = *v18 - *(_QWORD *)&PropertyKey->fmtid.Data1;
      if( *v18 == *(_QWORD *)&PropertyKey->fmtid.Data1 )
        v14 = v18[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
      if( !v14 )
      {
        v30 = DrvDbFindDatabaseNode(pDrvDbCtx, DatabaseNodeId, &DatabaseNode);
        RegValueMappedProperty = v30;
        if( v30 < 0 )
          goto LABEL_23;
        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 )
              goto LABEL_23;
            v33 = PropertyBuffer;
            *(_DWORD *)PropertyType = 17;
            *(_DWORD *)PropertySize = 1;
            if( PropertyBuffer && (_DWORD)BufferSize )
            {
              v34 = *((_QWORD *)DatabaseNode + 11) != 0i64;
LABEL_65:
              *v33 = -v34;
              goto LABEL_23;
            }
            goto LABEL_41;
          case 6u:
            v35 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Selected;
            if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Selected )
              v35 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
            if( v35 )
              goto LABEL_23;
            *(_DWORD *)PropertyType = 17;
            *(_DWORD *)PropertySize = 1;
            if( PropertyBuffer && (_DWORD)BufferSize )
            {
              *PropertyBuffer = (*((_QWORD *)pDrvDbCtx + 5) != (_QWORD)DatabaseNode) - 1;
              goto LABEL_23;
            }
            goto LABEL_41;
          case 7u:
            v36 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Disabled;
            if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Disabled )
              v36 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
            if( v36 )
              goto LABEL_23;
            v33 = PropertyBuffer;
            *(_DWORD *)PropertyType = 17;
            *(_DWORD *)PropertySize = 1;
            if( !PropertyBuffer || !(_DWORD)BufferSize )
              goto LABEL_41;
            v37 = DatabaseNode[14] & 4;
            break;
          case 0xBu:
            v38 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_AccessMask;
            if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_AccessMask )
              v38 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
            if( v38 )
              goto LABEL_23;
            *(_DWORD *)PropertyType = 7;
            *(_DWORD *)PropertySize = 4;
            if( PropertyBuffer && (unsigned int)BufferSize >= 4 )
            {
              *(_DWORD *)PropertyBuffer = pDrvDbCtx[3];
              goto LABEL_23;
            }
            goto LABEL_41;
          case 0xFu:
            v39 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_LoadStatus;
            if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_LoadStatus )
              v39 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
            if( v39 )
              goto LABEL_23;
            *(_DWORD *)PropertyType = 24;
            *(_DWORD *)PropertySize = 4;
            if( PropertyBuffer && (unsigned int)BufferSize >= 4 )
            {
              *(_DWORD *)PropertyBuffer = DatabaseNode[38];
              goto LABEL_23;
            }
            goto LABEL_41;
          case 0x17u:
            v40 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Extended;
            if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Extended )
              v40 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
            if( v40 )
              goto LABEL_23;
            v33 = PropertyBuffer;
            *(_DWORD *)PropertyType = 17;
            *(_DWORD *)PropertySize = 1;
            if( !PropertyBuffer || !(_DWORD)BufferSize )
            {
LABEL_41:
              RegValueMappedProperty = -1073741789;
              goto LABEL_23;
            }
            v37 = DatabaseNode[14] & 0x10;
            break;
          default:
            goto LABEL_23;
        }
        v34 = v37 != 0;
        goto LABEL_65;
      }
    }
    ++v16;
    v17 += 8;
  }
  while( v16 < 7 );
  v19 = 0i64;
  v20 = &off_140001FC0;
  v21 = 0;
  while( 1 )
  {
    v22 = *v20;
    if( (*v20)->pid == pid )
    {
      v14 = *(_QWORD *)&v22->fmtid.Data1 - *(_QWORD *)&PropertyKey->fmtid.Data1;
      if( *(_QWORD *)&v22->fmtid.Data1 == *(_QWORD *)&PropertyKey->fmtid.Data1 )
        v14 = *(_QWORD *)v22->fmtid.Data4 - *(_QWORD *)PropertyKey->fmtid.Data4;
      if( !v14 )
        break;
    }
    ++v21;
    v20 += 5;
    if( v21 >= 0xC )
      goto LABEL_14;
  }
  v14 = 5i64 * v21;
  v19 = (const _DRVDB_PROPERTY_REG_VALUE_MAP *)&(&off_140001FC0)[5 * v21];
LABEL_14:
  if( v19 )
  {
    v23 = (_UNICODE_STRING **)pDrvDbCtx;
LABEL_16:
    if( ObjectBaseKey && (!v12 || (v12[14] & 0x10) == 0)
      || (!v12 || (v12[14] & 0x10) == 0 ? (v24 = DrvDbOpenDriverDatabaseRegKey(
                                                   v23,
                                                   DatabaseNodeId,
                                                   1ui64,
                                                   0,
                                                   &PropertyRegValue,
                                                   0i64)) : (v24 = DrvDbOpenObjectRegKey(
                                                                     (_DRVDB_CONTEXT *)v23,
                                                                     v23[4],
                                                                     DRVDB_BASE_KEY_TYPE_NODES,
                                                                     DatabaseNodeId,
                                                                     1,
                                                                     0,
                                                                     &PropertyRegValue,
                                                                     0i64)),
          RegValueMappedProperty = v24,
          v24 >= 0) )
    {
      v25 = ObjectBaseKey;
      if( PropertyRegValue )
        v25 = PropertyRegValue;
      LODWORD(Disposition) = BufferSize;
      RegValueMappedProperty = DrvDbGetRegValueMappedProperty(
                                 (VOID *)v14,
                                 v25,
                                 v19,
                                 (UINT8 *)PropertyType,
                                 PropertyBuffer,
                                 (UINT64)Disposition,
                                 PropertySize);
    }
  }
  else
  {
    v19 = 0i64;
    v41 = &off_140009A30;
    v42 = 0;
    while( 1 )
    {
      v43 = *v41;
      if( LODWORD((**v41)[2]) == pid )
      {
        v44 = (*v43)[0] - *(_QWORD *)&PropertyKey->fmtid.Data1;
        if( (*v43)[0] == *(_QWORD *)&PropertyKey->fmtid.Data1 )
          v44 = (*v43)[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
        if( !v44 )
          break;
      }
      ++v42;
      v41 += 5;
      if( v42 >= 4 )
        goto LABEL_94;
    }
    v19 = (const _DRVDB_PROPERTY_REG_VALUE_MAP *)(&off_140009A30 + 5 * v42);
LABEL_94:
    if( v19 )
    {
      v23 = (_UNICODE_STRING **)pDrvDbCtx;
      RegValueMappedProperty = DrvDbFindDatabaseNode(pDrvDbCtx, DatabaseNodeId, &DatabaseNode);
      if( RegValueMappedProperty >= 0 )
      {
        v12 = DatabaseNode;
        goto LABEL_16;
      }
    }
    else
    {
      RegValueMappedProperty = -1073741802;
    }
  }
LABEL_23:
  if( PropertyRegValue )
    ZwClose((_HANDLE)PropertyRegValue);
  return RegValueMappedProperty;
}

Referenced by:

DrvDbDispatchDriverDatabase
DrvDbLoadDatabaseNode