我在VS2013 ARM开发人员提示下工作。我正在尝试使用微软的下一代加密技术(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's blog中删除,因为我似乎无法从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
这样的Microsoft宏将其转换为NTSTATUS
代码。
我还可以在VS2012 ARM Developer Prompt下复制丢失的NTSTATUS
问题。
我应该包含哪些头文件来获取ARM下的NTSTATUS
声明?
我认为这可能是相关的,但我不确定:fatal error LNK1104: cannot open file 'bcrypt.lib' when building for Surface RT tablet。关于我所知道的所有这些东西似乎都没有经过微软的测试,因为尝试使用它有太多该死的问题。
答案 0 :(得分:3)
主要问题是通用Windows平台应用程序(也称为Windows 10商店应用程序)支持BCRYPT,但Windows 8.x商店应用程序支持 。 VS 2013工具集始终使用Windows 8.1 SDK,因此您构建的是Windows 8.1 Store应用程序。当您尝试使用VS 2012时,您使用的是Windows 8.0 SDK,因此您正在构建Windows 8.0 Store应用程序。再次,这两者都不支持BCRYPT。如果您使用VS 2015构建并安装了Windows 10 SDK,那么您的代码构建正常。
请注意,/D_MBCS
不适用于Windows应用商店应用。所有Windows应用商店应用都应该为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,该标头基本上是一个空文件。