Какой заголовок включить для NTSTATUS при сборке для платформ ARM?

Я работаю по запросу разработчика ARM VS2013. Я пытаюсь использовать Microsoft Cryptography Next Generation (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 потому что Microsoft, как макросы BCRYPT_SUCCESS брось это NTSTATUS код.

Я также могу дублировать недостающие NTSTATUS проблема под VS2012 ARM Developer Prompt.

Какой заголовочный файл я должен включить, чтобы получить объявление для NTSTATUS под ARM?


Я думаю, что это может быть связано, но я не уверен: фатальная ошибка LNK1104: не удается открыть файл 'bcrypt.lib' при сборке для планшета Surface RT. Все, что я знаю, это то, что Microsoft, похоже, не очень хорошо протестировала, потому что слишком много чертовых проблем пытаются ее использовать.

1 ответ

Решение

Основная проблема заключается в том, что BCRYPT поддерживается для приложений универсальной платформы Windows (или приложений Магазина Windows 10), но не поддерживается для приложений Магазина Windows 8.x. Набор инструментов 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 должны быть созданы для 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 этот заголовок был в основном пустым файлом.

Другие вопросы по тегам