2016-05-01 19 views
1

Ich arbeite unter der VS2013 ARM Developer Prompt. Ich versuche, Microsofts Cryptography Next Generation (CNG) zu verwenden, aber ich habe einige nicht-triviale Probleme.Welche Header für einen NTSTATUS beim Erstellen für ARM-Plattformen enthalten?

Ich versuche, ein einfaches Testprogramm zu kompilieren:

#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; 
} 

ich es mit zu kompilieren versuchen:

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 

Als ich von PJ Naughter's blog enthalten <ntstatus.h> (verschrottet versuchen, weil ich es kann‘ Es scheint, als ob Sie etwas Nützliches von Microsoft finden:

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 
... 

Ich kann es nicht ein LONG machen, weil Microsoft-Makros wie BCRYPT_SUCCESS es zu einem Code NTSTATUS werfen.

Ich kann auch das fehlende NTSTATUS Problem unter VS2012 ARM Developer Prompt duplizieren.

Welche Header-Datei sollte ich hinzufügen, um eine Erklärung für NTSTATUS unter ARM zu erhalten?


ich denken dies könnten verwandt sein, aber ich bin nicht sicher: fatal error LNK1104: cannot open file 'bcrypt.lib' when building for Surface RT tablet. Über allem, was ich weiß, ist dieses Zeug nicht gut von Microsoft getestet, weil es zu viele verdammte Probleme gibt, die versuchen, es zu verwenden.

Antwort

3

Das Hauptproblem ist, dass BCRYPT für die Universal Windows Platform-Anwendungen (auch Windows 10 Store-Anwendungen) unterstützt wird, aber nicht unterstützt für Windows 8.x Store-Apps. Das Toolset von VS 2013 verwendet immer das Windows 8.1 SDK, sodass Sie eine Windows 8.1 Store-App erstellen. Wenn Sie VS 2012 ausprobierten, verwendeten Sie das Windows 8.0-SDK, sodass Sie Windows 8.0 Store-Apps erstellten. Auch dies unterstützt weder BCRYPT. Wenn Sie mit VS 2015 erstellen und das Windows 10-SDK installiert haben, wird der Code ordnungsgemäß erstellt.

Beachten Sie, dass keine Option für Windows Store-Apps ist. Alle Windows Store-Apps sollten für Unicode /DUNICODE /D_UNICODE und nicht ANSI/Multibyte erstellt werden, wie Sie es versuchten.

Achten Sie auch darauf, mit windowsapp.lib zu verknüpfen, um sicherzustellen, dass Sie die richtigen DLLs beim Verbinden abholen.

Sie können leicht bestätigen, dass alle Fehler, die Sie sehen, in VS 2012/2013 passieren, wenn Sie #include <bcrypt.h> in der Datei überhaupt nicht haben. Die DWINAPI_FAMILY=WINAPI_FAMILY_APP stellt sicher, dass alle nicht unterstützten APIs nicht definiert sind. In Windows 8.x Store war diese Kopfzeile im Grunde eine leere Datei.

+0

Dank Chuck. Es scheint, dass alle Microsoft-Dokumente gebrochen sind. Siehe zum Beispiel ['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) und ['BCryptCloseAlgorithmProvider'] (https://msdn.microsoft.com/de -us/Bibliothek/Windows/Desktop/aa375377% 28v = vs.85% 29.aspx). – jww

+0

Sie sagen alle "Windows Store-Apps", weil diese APIs für Windows 10 unterstützt werden. Ich stimme zu, dass es nicht hilfreich ist, dass "UWP" oder "Windows 10" nicht erwähnt werden UWP nicht Windows 8.x Store. –

+0

Danke nochmal Chuck. Würde es Ihnen etwas ausmachen, sich [Präprozessor-Definitionen für Universal Windows Platform?] (Http://stackoverflow.com/q/36072350). Diese Fragen halten den Port einiger C/C++ - Bibliotheken aufrecht, mit denen ich arbeite (OpenSSL, Crypto ++, Cryptlib und Botan). – jww