VS2010 - Изменение структуры в CryptoAPI - v7.0A против v6.0A - WinCrypt.h - PullRequest
7 голосов
/ 21 июня 2011

В C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h определение для CERT_CHAIN_ENGINE_CONFIG равно

typedef struct _CERT_CHAIN_ENGINE_CONFIG {

    DWORD       cbSize;
    HCERTSTORE  hRestrictedRoot;
    HCERTSTORE  hRestrictedTrust;
    HCERTSTORE  hRestrictedOther;
    DWORD       cAdditionalStore;
    HCERTSTORE* rghAdditionalStore;
    DWORD       dwFlags;
    DWORD       dwUrlRetrievalTimeout;      // milliseconds
    DWORD       MaximumCachedCertificates;
    DWORD       CycleDetectionModulus;

*#if (NTDDI_VERSION >= NTDDI_WIN7)
    HCERTSTORE  hExclusiveRoot;
    HCERTSTORE  hExclusiveTrustedPeople;
#endif*

} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;

Я использую Visual Studio 2010 на машине с XP sp3, и в этом случае я ожидаю, что следующие два члена в вышеупомянутой структуре будут выделены серым цветом. Но этого не происходит,

#if (NTDDI_VERSION >= NTDDI_WIN7)
    HCERTSTORE  hExclusiveRoot;
    HCERTSTORE  hExclusiveTrustedPeople;
#endif

NTDDI_VERSION в свою очередь определяется в sdkddkver.h следующим образом, а _WIN32_WINNT каким-то образом принимает значение NTDDI_WIN7, что в моем случае неверно, поскольку у меня машина XP SP3.

#if !defined(_WIN32_WINNT) && !defined(_CHICAGO_)
#define  _WIN32_WINNT   0x0601
#endif
#ifndef NTDDI_VERSION
#ifdef _WIN32_WINNT
// set NTDDI_VERSION based on _WIN32_WINNT
#define NTDDI_VERSION   NTDDI_VERSION_FROM_WIN32_WINNT(_WIN32_WINNT)
#else
#define NTDDI_VERSION   0x06010000
#endif
#endif

Вышеупомянутые два члена рассматриваемой структуры CERT_CHAIN_ENGINE_CONFIG отсутствуют в C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinCrypt.h Но мой проект Visual Studio 2010 автоматически извлекает заголовочные файлы и файлы lib из C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h Из-за конфликтующих структур я получаю parameter is incorrect

Посоветуйте, пожалуйста, как мне решить эту проблему?

Должен ли я установить Visual Studio 2010 SP1?

Я обнаружил одну ссылку в сети , где говорится, что инициализация структуры решит проблему, но это не так, поскольку два рассматриваемых параметра не будут выделены серым цветом и будут приняты во время сборки .

Update1:

Настройки моего проекта:

enter image description here $ (VCInstalDir) -> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC

$ (WindowsSdkDir) -> C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A

$ (FrameworkSdkDir) -> C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A

Настройки файла библиотеки,

$(VCInstallDir)lib
$(VCInstallDir)atlmfc\lib
$(WindowsSdkDir)lib
$(FrameworkSDKDir)\lib

ОБНОВЛЕНИЕ 2: Мои определения препроцессора:

WIN32;_DEBUG;_WINDOWS;_USRDLL;MY_DLL_EXPORTS;%(PreprocessorDefinitions)

% (PreprocessorDefinitions) унаследовали значения следующим образом

_WINDLL
_MBCS

Спасибо

Ответы [ 2 ]

4 голосов
/ 01 июля 2011

Проблема, которую вы имеете, может быть очень легко объяснена. Если вы используете v7.0A или v7.1, вы можете скомпилировать свой проект так, чтобы он работал под Windows 7. Поэтому значение по умолчанию для _WIN32_WINNT равно 0x0601.

Если вы хотите совместно скомпилировать программу, чтобы она работала в Windows XP, вы можете явно указать WINVER и _WIN32_WINNT . Обычно это делается в настройках проекта Visual Studio внутри определений препроцессора. Если вы сделаете это, соответствующая часть CERT_CHAIN_ENGINE_CONFIG структуры будет отображаться серым, как вы хотите.

В большинстве случаев и в случае CERT_CHAIN_ENGINE_CONFIG это действительно не нужно. Интерфейс Windows API спроектирован в основном так, что у вас не возникнет проблем при использовании CERT_CHAIN_ENGINE_CONFIG, определенного для Windows 7 в случае запуска программы в Windows XP. Если вы определите

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500

(или 0x0501 вместо 0x0500) вы сможете запускать свою программу в Windows 7, но вы не сможете использовать элементы hExclusiveRoot и hExclusiveTrustedPeople. Причина в поле cbSize, которое вы должны инициализировать как sizeof(CERT_CHAIN_ENGINE_CONFIG). Он дает для функции CertCreateCertificateChainEngine достаточно информации о размере входной структуры CERT_CHAIN_ENGINE_CONFIG. В случае небольшого значения cbSize последние HCERTSTORE членов hExclusiveRoot и hExclusiveTrustedPeople будут просто не использованы.

4 голосов
/ 21 июня 2011

значение NTDDI_WIN7, которое в моем случае неверно, поскольку у меня машина XP SP3.

Насколько я понимаю, переменные инициализируются в соответствии с системой, на которую вы нацеливаетесьне в какой системе вы компилируете код.Поэтому вам нужно посмотреть настройки вашего проекта и увидеть, какая у вас целевая платформа, на какие заголовки ссылаются и т. Д.

...