1

我在 VS2013 ARM Developer Prompt 下工作。我正在尝试使用 Microsoft 的下一代加密技术 (CNG),但我遇到了一些重要的问题。

我正在尝试编译一个简单的测试程序:

#include <windows.h>
#include <bcrypt.h>

int main(int argc, char* argv[])
{
    BCRYPT_ALG_HANDLE hProvider = NULL;
    NTSTATUS ret = BCryptOpenAlgorithmProvider(&hProvider, BCRYPT_RNG_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0);
    if (!(BCRYPT_SUCCESS(ret)))
    {
        return -1;
    }

    unsigned char buffer[20];
    ret = BCryptGenRandom(hProvider, buffer, (ULONG)sizeof(buffer), 0);
    if (!(BCRYPT_SUCCESS(ret)))
    {
        return -2;
    }

    ret = BCryptCloseAlgorithmProvider(hProvider, 0);
    if (!(BCRYPT_SUCCESS(ret)))
    {
        return -3;
    }

    return 0;
}

我尝试编译它:

C:\Users\Test>cl.exe /nologo /W4 /D_MBCS /Zi /TP /EHs c /MD /FI sdkddkver.h /FI winapifamily.h /DWINAPI_FAMILY=WINAPI_FAMILY_APP /c test.cxx
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for ARM
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cxx
test.cxx(6) : error C2065: 'BCRYPT_ALG_HANDLE' : undeclared identifier
test.cxx(6) : error C2146: syntax error : missing ';' before identifier 'hProvid
er'
test.cxx(6) : error C2065: 'hProvider' : undeclared identifier
test.cxx(7) : error C2065: 'NTSTATUS' : undeclared identifier
test.cxx(7) : error C2146: syntax error : missing ';' before identifier 'ret'
test.cxx(7) : error C2065: 'ret' : undeclared identifier
test.cxx(7) : error C2065: 'hProvider' : undeclared identifier
test.cxx(7) : error C2065: 'BCRYPT_RNG_ALGORITHM' : undeclared identifier
test.cxx(7) : error C2065: 'MS_PRIMITIVE_PROVIDER' : undeclared identifier
test.cxx(7) : error C3861: 'BCryptOpenAlgorithmProvider': identifier not found
test.cxx(8) : error C2065: 'ret' : undeclared identifier
test.cxx(8) : error C3861: 'BCRYPT_SUCCESS': identifier not found
test.cxx(14) : error C2065: 'ret' : undeclared identifier
test.cxx(14) : error C2065: 'hProvider' : undeclared identifier
test.cxx(14) : error C3861: 'BCryptGenRandom': identifier not found
test.cxx(15) : error C2065: 'ret' : undeclared identifier
test.cxx(15) : error C3861: 'BCRYPT_SUCCESS': identifier not found
test.cxx(20) : error C2065: 'ret' : undeclared identifier
test.cxx(20) : error C2065: 'hProvider' : undeclared identifier
test.cxx(20) : error C3861: 'BCryptCloseAlgorithmProvider': identifier not found

test.cxx(21) : error C2065: 'ret' : undeclared identifier
test.cxx(21) : error C3861: 'BCRYPT_SUCCESS': identifier not found

当我尝试包含<ntstatus.h>(从PJ Naughter 的博客中删除,因为我似乎无法从 Microsoft 找到任何有用的东西):

cl.exe /nologo /W4 /D_MBCS /Zi /TP /EHsc /MD /FI sdkddkver.h /FI winapifamily.h /DWINAPI_FAMILY=WINAPI_FAMILY_APP /c osrng.cpp
osrng.cpp
C:\Program Files (x86)\Windows Kits\8.1\include\shared\ntstatus.h(66) : warning
C4005: 'STATUS_WAIT_0' : macro redefinition
        C:\Program Files (x86)\Windows Kits\8.1\include\um\winnt.h(2202) : see p
revious definition of 'STATUS_WAIT_0'
C:\Program Files (x86)\Windows Kits\8.1\include\shared\ntstatus.h(212) : warning
 C4005: 'STATUS_ABANDONED_WAIT_0' : macro redefinition
        C:\Program Files (x86)\Windows Kits\8.1\include\um\winnt.h(2203) : see p
revious definition of 'STATUS_ABANDONED_WAIT_0'
C:\Program Files (x86)\Windows Kits\8.1\include\shared\ntstatus.h(235) : warning
 C4005: 'STATUS_USER_APC' : macro redefinition
...

我不能让它成为,LONG因为微软宏喜欢BCRYPT_SUCCESS将它转换为NTSTATUS代码。

我也可以NTSTATUS在 VS2012 ARM Developer Prompt 下复制缺失的问题。

我应该包含什么头文件来获得NTSTATUSARM 下的声明?


认为这可能是相关的,但我不确定:致命错误 LNK1104: cannot open file 'bcrypt.lib' when building for Surface RT tablet。我所知道的只是这些东西似乎没有经过微软的良好测试,因为尝试使用它时有太多该死的问题。

4

1 回答 1

4

主要问题是通用 Windows 平台应用(又名 Windows 10 应用商店应用)支持 BCRYPT,但Windows 8.x 应用商店应用支持 BCRYPT。VS 2013 工具集始终使用 Windows 8.1 SDK,因此您正在构建 Windows 8.1 应用商店应用程序。当您尝试 VS 2012 时,您使用的是 Windows 8.0 SDK,因此您正在构建 Windows 8.0 应用商店应用程序。同样,这两个都不支持 BCRYPT。如果您使用 VS 2015 构建并安装了 Windows 10 SDK,那么您的代码构建良好。

请注意,这/D_MBCS不是 Windows 应用商店应用程序的选项。所有 Windows Store 应用程序都应该为 Unicode/DUNICODE /D_UNICODE而不是 ANSI/Multibyte 构建,就像您尝试做的那样。

此外,请务必链接以确保在链接时windowsapp.lib选择正确的 DLL。

如果您根本没有#include <bcrypt.h>文件,您可以轻松地确认您看到的所有错误都发生在 VS 2012/2013 中。DWINAPI_FAMILY=WINAPI_FAMILY_APP确保所有不受支持的 API 都是未定义的,因此对于 Windows 8.x Store,该标头基本上是一个空文件。

于 2016-05-01T06:12:17.547 回答