在为ARM平台构建时,为NTSTATUS包含哪些标头?

时间:2016-05-01 05:20:19

标签: visual-studio windows-store-apps arm cng

我在VS2013 ARM开发人员提示下工作。我正在尝试使用微软的下一代加密技术(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's blog中删除,因为我似乎无法从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这样的Microsoft宏将其转换为NTSTATUS代码。

我还可以在VS2012 ARM Developer Prompt下复制丢失的NTSTATUS问题。

我应该包含哪些头文件来获取ARM下的NTSTATUS声明?

认为这可能是相关的,但我不确定:fatal error LNK1104: cannot open file 'bcrypt.lib' when building for Surface RT tablet。关于我所知道的所有这些东西似乎都没有经过微软的测试,因为尝试使用它有太多该死的问题。

1 个答案:

答案 0 :(得分:3)

主要问题是通用Windows平台应用程序(也称为Windows 10商店应用程序)支持BCRYPT,但Windows 8.x商店应用程序支持 。 VS 2013工具集始终使用Windows 8.1 SDK,因此您构建的是Windows 8.1 Store应用程序。当您尝试使用VS 2012时,您使用的是Windows 8.0 SDK,因此您正在构建Windows 8.0 Store应用程序。再次,这两者都不支持BCRYPT。如果您使用VS 2015构建并安装了Windows 10 SDK,那么您的代码构建正常。

请注意,/D_MBCS不适用于Windows应用商店应用。所有Windows应用商店应用都应该为Unicode /DUNICODE /D_UNICODE而不是ANSI / Multibyte构建。

另外,请务必与windowsapp.lib关联,以确保在链接时选择正确的DLL。

  

如果文件中根本没有#include <bcrypt.h>,您可以轻松确认您所看到的所有错误都发生在VS 2012/2013中。 DWINAPI_FAMILY=WINAPI_FAMILY_APP确保所有不受支持的API都是未定义的,因此对于Windows 8.x Store,该标头基本上是一个空文件。