我在 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 下复制缺失的问题。
我应该包含什么头文件来获得NTSTATUS
ARM 下的声明?
我认为这可能是相关的,但我不确定:致命错误 LNK1104: cannot open file 'bcrypt.lib' when building for Surface RT tablet。我所知道的只是这些东西似乎没有经过微软的良好测试,因为尝试使用它时有太多该死的问题。