DrvDbGetDriverFileMappedProperty

NTSTATUS __stdcall DrvDbGetDriverFileMappedProperty(
        _DRVDB_CONTEXT *pDrvDbCtx,
        WCHAR *DriverFileName,
        VOID *ObjectBaseKey,
        _DEVPROPKEY *PropertyKey,
        UINT64 *PropertyType,
        UINT8 *PropertyBuffer,
        UINT64 BufferSize,
        UINT64 *PropertySize){
  UINT8 *v8; 
  UINT64 *v10; 
  unsigned int pid; 
  __int64 v14; 
  UINT8 *v15; 
  int ObjectDatabaseNodeName; 
  __int64 v17; 
  __int64(**i)[3]; 
  __int64(*v19)[3]; 
  __int64 v20; 
  __int64 v22; 
  const _DRVDB_PROPERTY_REG_VALUE_MAP *v23; 
  UINT64 v24; 
  UINT64 v25; 
  INT64 v26; 

  v8 = (UINT8 *)PropertyType;
  v10 = PropertySize;
  v26 = 0i64;
  *(_DWORD *)PropertyType = 0;
  *(_DWORD *)v10 = 0;
  pid = PropertyKey->pid;
  if( pid == 2 )
  {
    v14 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_NODE;
    if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_NODE )
      v14 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x5008C7D4C8250077i64;
    if( !v14 )
    {
      v15 = PropertyBuffer;
      LODWORD(v24) = (unsigned int)BufferSize >> 1;
      *(_DWORD *)v8 = 18;
      ObjectDatabaseNodeName = DrvDbGetObjectDatabaseNodeName(
                                 (INT64 *)pDrvDbCtx,
                                 4i64,
                                 (INT64)DriverFileName,
                                 v15,
                                 v24,
                                 v10);
      if( (int)(ObjectDatabaseNodeName + 0x80000000) < 0 || ObjectDatabaseNodeName == -1073741789 )
        *(_DWORD *)v10 *= 2;
      goto LABEL_21;
    }
  }
  v17 = 0i64;
  for( i = &off_1400099E0; ; i += 5 )
  {
    v19 = *i;
    if( LODWORD((**i)[2]) == pid )
    {
      v20 = (*v19)[0] - *(_QWORD *)&PropertyKey->fmtid.Data1;
      if( (*v19)[0] == *(_QWORD *)&PropertyKey->fmtid.Data1 )
        v20 = (*v19)[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
      if( !v20 )
        break;
    }
    v17 = (unsigned int)(v17 + 1);
    if( (unsigned int)v17 >= 2 )
      return -1073741802;
  }
  v22 = 5 * v17;
  v23 = (const _DRVDB_PROPERTY_REG_VALUE_MAP *)(&off_1400099E0 + 5 * v17);
  if( !v23 )
    return -1073741802;
  if( !ObjectBaseKey )
  {
    ObjectDatabaseNodeName = DrvDbOpenDriverFileRegKey(
                               (INT64 *)pDrvDbCtx,
                               (INT64)DriverFileName,
                               1i64,
                               0,
                               (INT64)&v26,
                               0i64);
    if( ObjectDatabaseNodeName < 0 )
      goto LABEL_21;
    ObjectBaseKey = (VOID *)v26;
  }
  LODWORD(v25) = BufferSize;
  ObjectDatabaseNodeName = DrvDbGetRegValueMappedProperty((VOID *)v22, ObjectBaseKey, v23, v8, PropertyBuffer, v25, v10);
LABEL_21:
  if( v26 )
    ZwClose(v26);
  return ObjectDatabaseNodeName;
}

Referenced by:

DrvDbDispatchDriverFile