Я работаю под VS2013 ARM Developer Prompt. Я пытаюсь использовать Microsoft Cryptography Next Generation (CNG), но у меня возникают некоторые нетривиальные проблемы.Какой заголовок должен быть включен для NTSTATUS при создании платформ ARM?
Я пытаюсь составить простую тестовую программу:
#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, потому что я могу» t, похоже, не нашел ничего полезного для 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
, потому что макросы Microsoft, такие как BCRYPT_SUCCESS
, передают его в код NTSTATUS
.
Я также могу дублировать недостающую NTSTATUS
проблему под VS2012.
Какой заголовочный файл я должен включить, чтобы получить объявление для NTSTATUS
под ARM?
Я думаю это может быть связано, но я не уверен: fatal error LNK1104: cannot open file 'bcrypt.lib' when building for Surface RT tablet. О том, что я знаю, это то, что Microsoft не очень хорошо тестирует, потому что слишком много чертовых проблем пытается его использовать.
Спасибо Чак. Похоже, что все документы Microsoft нарушены. См., Например, ['BCryptOpenAlgorithmProvider'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa375479%28v=vs.85%29.aspx), [' BCryptGenRandom'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa375458%28v=vs.85%29.aspx) и ['BCryptCloseAlgorithmProvider'] (https://msdn.microsoft.com/ru -us/библиотека/окно/настольный/aa375377% 2 = vs.85% 29.aspx). – jww
Все они говорят «приложения для Windows Store», потому что эти API поддерживаются для Windows 10. Я согласен, что вам не полезно, что он не упоминает «UWP» или «Windows 10», но на данный момент MSDN сообщает вам только о UWP не Windows 8.x Store. –
Еще раз спасибо Чак. Не могли бы вы взглянуть на [Определения препроцессора для универсальной платформы Windows?] (Http://stackoverflow.com/q/36072350). Эти вопросы поддерживают порт нескольких библиотек C/C++, с которыми я работаю (OpenSSL, Crypto ++, Cryptlib и Botan). – jww