Проверка версии Windows

Версия ОС была обновлена с выпуском Windows 10 ОС. Это означает, что внутренний номер версии для Windows 10 также был изменен на 10.0. Как и раньше, мы хотим сделать все возможное для обеспечения совместимости с приложениями и устройствами после изменения номера версии ОС. Для большинства категорий приложений (без зависимостей ядра) это изменение не повлияет на функциональность приложения, и существующие приложения будут работать нормально на Windows 10.

Проявления

Проявление этого изменения будет зависеть от конкретного приложения. Это означает, что любое приложение, выполняющее непосредственную проверку версии ОС, в ответ на запрос будет получать ответ с указанием более высокого номера версии, что может привести к возникновению одной или нескольких ситуаций, описанных ниже:

  • Установщик приложения не сможет установить приложение, и оно может не запуститься.
  • Приложения могут работать нестабильно или со сбоями.
  • Приложения могут создавать сообщения об ошибках, но продолжать работать в штатном режиме.

Некоторые приложения выполняют проверку номера версии ОС и просто передают пользователям предупреждение. Но есть приложения, работа которых очень сильно зависит от результатов проверки номера версии ОС (в драйверах или в режиме ядра для предотвращения обнаружения номера версии). В этих случаях при обнаружении несовместимой версии приложение запустить не удастся. Поэтому вместо проверки версии мы рекомендуем использовать один из следующих подходов.

  • Если приложение зависит от конкретной функции API, убедитесь, что вы используете правильную версию API.
  • Номер версии NTDDI (интерфейс драйвера устройства NT) увеличивается только в том случае, если целевые функции в API изменяются. Убедитесь, что вы обнаружите изменение с помощью APISet или другого доступного API, созданного командой функций, и не используйте версию в качестве прокси-сервера для некоторых функций или исправлений. Если есть критические изменения и правильная проверка невозможна, можно достоверно утверждать об обнаружении ошибки.
  • Убедитесь, что приложение не проверяет версию нечетными способами, например с помощью реестра, версий файлов, смещения, режима ядра, драйверов или других средств. Если приложению абсолютно нужно проверить версию, используйте API GetVersion, которые должны возвращать основной, дополнительный и номер сборки.
  • Если вы используете API GetVersion или другие вспомогательные функции версии, такие как VerifyVersionInfo, помните, что поведение этого API изменилось с Windows 8.1. Дополнительные сведения см. в документации по API .
  • Если вы владеете приложениями, такими как антивредоносное ПО или брандмауэр, следует работать через обычные каналы обратной связи и через программу Windows За кулисами.

Манифест приложения

Ниже приведен пример манифеста приложения:

<exe>.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <assemblyIdentity 
        type="win32" 
        name=SXS_ASSEMBLY_NAME
        version=SXS_ASSEMBLY_VERSION
        processorArchitecture=SXS_PROCESSOR_ARCHITECTURE
    />
    <description> my app exe </description>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel
                    level="asInvoker"
                    uiAccess="false"
                />   
            </requestedPrivileges>
        </security>
    </trustInfo>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 

      * <!-- Windows 10 --> 
      * <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        </application> 
    </compatibility>
</assembly>

Добавьте эти переменные в источники:

  • SXS_MANIFEST_RESOURCE_ID=1
  • SXS_MANIFEST=foo.manifest
  • SXS_ASSEMBLY_NAME=Microsoft.Windows.Foo
  • SXS_ASSEMBLY_VERSION=1.0
  • SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=1
  • SXS_MANIFEST_IN_RESOURCES=1

Для Windows 10 две строки выше, помеченные звездочкой (*), показывают, как точно ориентироваться на приложение для Windows 10 версии ОС. Манифест .exe для Windows 10 не повлияет на выполнение в предыдущих версиях ОС Windows. Вы также можете добавить его в RC-файл, если он уже определен. Добавление trustInfo не является обязательным, но настоятельно рекомендуется. Это позволит .exe всегда получать правильную версию независимо от того, является ли ОС Windows 10 или Windows 8.1.

Ресурсы