2016-05-01 6 views
1

Я работаю под 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 не очень хорошо тестирует, потому что слишком много чертовых проблем пытается его использовать.

ответ

3

Основная проблема заключается в том, что BCRYPT поддерживается для приложений универсальной платформы Windows (например, для приложений Windows 10 Store), но был не, поддерживаемый для приложений Windows 8.x Store. Набор инструментов VS 2013 всегда использует SDK для Windows 8.1, поэтому вы создаете приложение для Windows 8.1 Store. Когда вы пробовали VS 2012, вы использовали SDK для Windows 8.0, поэтому вы строили приложения для Windows 8.0 Store. Опять же, ни одна из них не поддерживает BCRYPT. Если вы создаете VS 2015 и устанавливаете Windows 10 SDK, тогда ваш код будет строгим.

Обратите внимание, что /D_MBCS не является вариантом для приложений Windows Store. Все приложения Windows Store должны быть созданы для Unicode /DUNICODE /D_UNICODE, а не ANSI/Multibyte, как вы пытались сделать.

Кроме того, не забудьте установить ссылку с windowsapp.lib, чтобы убедиться, что вы нашли правильный DLL при подключении.

Вы можете легко подтвердить, что все ошибки, которые вы видите, происходят в VS 2012/2013, если у вас нет #include <bcrypt.h> в файле вообще. DWINAPI_FAMILY=WINAPI_FAMILY_APP гарантирует, что все неподдерживаемые API не определены, поэтому в Windows 8.x Store этот заголовок в основном представляет собой пустой файл.

+0

Спасибо Чак. Похоже, что все документы 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

+0

Все они говорят «приложения для Windows Store», потому что эти API поддерживаются для Windows 10. Я согласен, что вам не полезно, что он не упоминает «UWP» или «Windows 10», но на данный момент MSDN сообщает вам только о UWP не Windows 8.x Store. –

+0

Еще раз спасибо Чак. Не могли бы вы взглянуть на [Определения препроцессора для универсальной платформы Windows?] (Http://stackoverflow.com/q/36072350). Эти вопросы поддерживают порт нескольких библиотек C/C++, с которыми я работаю (OpenSSL, Crypto ++, Cryptlib и Botan). – jww

 Смежные вопросы

  • Нет связанных вопросов^_^