VS2010 - CryptoAPI中的结构更改 - v7.0A Vs v6.0A - WinCrypt.h

时间:2011-06-21 17:12:43

标签: c++ visual-studio-2010 visual-c++ certificate cryptoapi

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;

我在XP sp3机器中使用visual studio 2010,在这种情况下,我希望上面结构中的以下两个成员变灰。但这不会发生,

#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的上述两个成员但我的2010视觉工作室项目会自动从C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h中提取标题和lib文件因为冲突结构,我得到parameter is incorrect

请告知我如何解决这个问题?

我是否必须安装visual studio 2010 sp1?

found one reference in the web表示初始化结构会解决问题,但不会,因为有问题的两个参数不会显示为灰色,并会在构建时被采用。

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 个答案:

答案 0 :(得分:4)

  

NTDDI_WIN7的值,在我的情况下是不正确的,因为我的是XP SP3机器。

据我了解,变量是根据您定位的系统初始化的,而不是您编写代码的系统。因此,您需要查看项目设置,看看您的目标平台是什么,引用了哪些标题等。

答案 1 :(得分:4)

您所遇到的问题可以很容易解释。如果使用v7.0A或v7.1,则可以编译项目,使其在Windows 7下运行。因此_WIN32_WINNT的默认值为0x0601

如果你想编译程序以便它可以在Windows XP上运行,你可以define WINVER and _WIN32_WINNT explicitly。通常,可以在预处理器定义内的Visual Studio项目的设置中执行此操作。如果您这样做,CERT_CHAIN_ENGINE_CONFIG结构的相应部分将显示为您想要的灰色。

在大多数情况下,在CERT_CHAIN_ENGINE_CONFIG的情况下,并不是真的需要它。 Windows API主要是这样设计的,如果在Windows XP上启动程序,则在使用为Windows 7定义的CERT_CHAIN_ENGINE_CONFIG时没有任何问题。如果你确定

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500

(或0x0501代替0x0500)您将能够在Windows 7中运行您的程序,但您将无法使用hExclusiveRoot和{{1成员。原因是hExclusiveTrustedPeople字段,您应将其初始化为cbSize。它为CertCreateCertificateChainEngine函数提供了有关输入结构sizeof(CERT_CHAIN_ENGINE_CONFIG)大小的足够信息。如果CERT_CHAIN_ENGINE_CONFIG值较小,则不会使用最后cbSize个成员HCERTSTOREhExclusiveRoot