CmGetInstallerClassMappedProperty

NTSTATUS __stdcall CmGetInstallerClassMappedProperty(
        HPNPCTX *hPnpCtx,
        const WCHAR *ClassGuid,
        VOID *ObjectBaseKey,
        const WCHAR *PropertyLocaleName,
        const _DEVPROPKEY *PropertyKey,
        UINT64 *PropertyType,
        UINT8 *PropertyBuffer,
        UINT64 BufferSize,
        UINT64 *PropertySize){
  NTSTATUS InstallerClassMappedPropertyFromRegProp; 
  DEVPROPKEY **v13; 
  DEVPROPKEY *v14; 
  const _DEVPROPKEY *v15; 
  unsigned int v16; 
  _QWORD *v17; 
  DEVPROPKEY **v18; 
  unsigned int v19; 
  DEVPROPKEY *v20; 
  __int64 v21; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  INT64 v26; 
  UINT64 v27; 

  InstallerClassMappedPropertyFromRegProp = -1073741802;
  *(_DWORD *)PropertySize = 0;
  if( !PropertyLocaleName )
  {
    v13 = &CmClassRegPropMap;
    while( 1 )
    {
      v14 = *v13;
      if( *v13 && PropertyKey->pid == v14->pid )
      {
        v23 = *(_QWORD *)&PropertyKey->fmtid.Data1 - *(_QWORD *)&v14->fmtid.Data1;
        if( *(_QWORD *)&PropertyKey->fmtid.Data1 == *(_QWORD *)&v14->fmtid.Data1 )
          v23 = *(_QWORD *)PropertyKey->fmtid.Data4 - *(_QWORD *)v14->fmtid.Data4;
        if( !v23 )
          break;
      }
      LODWORD(PropertyLocaleName) = (_DWORD)PropertyLocaleName + 1;
      v13 += 3;
      if( (unsigned int)PropertyLocaleName >= 9 )
        goto LABEL_6;
    }
    LODWORD(v27) = BufferSize;
    InstallerClassMappedPropertyFromRegProp = CmGetInstallerClassMappedPropertyFromRegProp(
                                                hPnpCtx,
                                                (WCHAR *)ClassGuid,
                                                ObjectBaseKey,
                                                (_DEVPROPKEY *)PropertyKey,
                                                PropertyType,
                                                PropertyBuffer,
                                                v27,
                                                PropertySize);
    if( InstallerClassMappedPropertyFromRegProp != -1073741802 )
      return InstallerClassMappedPropertyFromRegProp;
LABEL_6:
    v15 = (const _DEVPROPKEY *)&Create;
    v16 = 0;
    while( 1 )
    {
      v17 = *(_QWORD **)&v15->fmtid.Data1;
      if( PropertyKey->pid == *(_DWORD *)(*(_QWORD *)&v15->fmtid.Data1 + 16i64) )
      {
        v24 = *(_QWORD *)&PropertyKey->fmtid.Data1 - *v17;
        if( *(_QWORD *)&PropertyKey->fmtid.Data1 == *v17 )
          v24 = *(_QWORD *)PropertyKey->fmtid.Data4 - v17[1];
        if( !v24 )
          break;
      }
      ++v16;
      v15 = (const _DEVPROPKEY *)((char *)v15 + 32);
      if( v16 >= 0xD )
        goto LABEL_9;
    }
    LODWORD(v27) = BufferSize;
    InstallerClassMappedPropertyFromRegProp = CmGetInstallerClassMappedPropertyFromRegValue(
                                                hPnpCtx,
                                                ClassGuid,
                                                ObjectBaseKey,
                                                PropertyKey,
                                                PropertyType,
                                                PropertyBuffer,
                                                v27,
                                                PropertySize);
    if( InstallerClassMappedPropertyFromRegProp != -1073741802 )
      return InstallerClassMappedPropertyFromRegProp;
LABEL_9:
    if( PropertyKey->pid != 2 )
      goto LABEL_10;
    v25 = *(_QWORD *)&PropertyKey->fmtid.Data1 - *(_QWORD *)&DEVPKEY_DeviceClass_ClassCoInstallers.fmtid.Data1;
    if( *(_QWORD *)&PropertyKey->fmtid.Data1 == *(_QWORD *)&DEVPKEY_DeviceClass_ClassCoInstallers.fmtid.Data1 )
      v25 = *(_QWORD *)PropertyKey->fmtid.Data4 - *(_QWORD *)DEVPKEY_DeviceClass_ClassCoInstallers.fmtid.Data4;
    if( v25
      || (LODWORD(v26) = BufferSize,
          InstallerClassMappedPropertyFromRegProp = CmGetInstallerClassMappedPropertyFromCoInstallers(
                                                      hPnpCtx,
                                                      ClassGuid,
                                                      v15,
                                                      PropertyType,
                                                      PropertyBuffer,
                                                      v26,
                                                      PropertySize),
          InstallerClassMappedPropertyFromRegProp == -1073741802) )
    {
LABEL_10:
      v18 = &off_140983F60;
      v19 = 0;
      while( 1 )
      {
        v20 = *v18;
        if( PropertyKey->pid == (*v18)->pid )
        {
          v21 = *(_QWORD *)&PropertyKey->fmtid.Data1 - *(_QWORD *)&v20->fmtid.Data1;
          if( *(_QWORD *)&PropertyKey->fmtid.Data1 == *(_QWORD *)&v20->fmtid.Data1 )
            v21 = *(_QWORD *)PropertyKey->fmtid.Data4 - *(_QWORD *)v20->fmtid.Data4;
          if( !v21 )
            break;
        }
        ++v19;
        v18 += 2;
        if( v19 >= 4 )
          return InstallerClassMappedPropertyFromRegProp;
      }
      LODWORD(v27) = BufferSize;
      return CmGetInstallerClassMappedPropertyFromComposite(
               hPnpCtx,
               (WCHAR *)ClassGuid,
               ObjectBaseKey,
               (_DEVPROPKEY *)PropertyKey,
               PropertyType,
               PropertyBuffer,
               v27,
               PropertySize);
    }
  }
  return InstallerClassMappedPropertyFromRegProp;
}

Referenced by:

PnpDispatchInstallerClass