为什么NTDDI_VERSION宏将其值从cpp改为ntdddisk.h?

时间:2014-05-30 07:16:06

标签: visual-c++ macros ioctl

为什么NTDDI_VERSION宏将其值从cpp更改为ntdddisk.h?

我正在使用带有累积更新4的Visual Studio 2012,并在Windows 7 x64上构建。

在一个CPP中,我需要为WIN 8调用新的IOCTL_ ..

在CPP中有#include

ntdddisk.h在受保护的条件下定义WIN 8的新IOCTL_:

#if (NTDDI_VERSION >= NTDDI_WIN8)
...
#endif

在cpp中,NTDDI_VERSION宏的值为NTDDI_WIN8(如预期的结果,包括sdkddkver.h和使用/ D_WIN32_WINNT = 0x0602进行编译)

但是,在ntdddisk.h中,NTDDI_VERSION宏的值具有值< NTDDI_VISTA,即小于NTDDI_WIN8

编译失败,错误

error C2065: 'IOCTL_..' : undeclared identifier

看起来像一个bug,除非我错过了其他的东西。想法?

详情如下:

在CPP文件中有这些包括

#pragma once
// Needed for  new IOCTL_  for  WIN 8 
#include <sdkddkver.h>
#include <windows.h>
// Check  NTDDI_VERSION ...
#if (NTDDI_VERSION >= NTDDI_WIN8)
// Value is  NTDDI_WIN8 as expected
// #include <TROUBLE.h>
#endif

#pragma pack(8)
#include <ntdddisk.h>
#include <ntddscsi.h>
#include <lm.h>
#include <objbase.h>

/*=== IMPORTANT: this struct needs to have 8-byte packing ===*/
typedef struct _SCSI_PASS_THROUGH_WITH_BUFFERS {
    SCSI_PASS_THROUGH spt;
    ULONG             Filler;      // realign buffers to double word boundary
    UCHAR             SenseBuf[32];
    UCHAR             DataBuf[512];
} SCSI_PASS_THROUGH_WITH_BUFFERS;
#pragma pack()

使用CL编译具有这些参数,包括-D_WIN32_WINNT = 0x0602

cl -nologo @COMPL.TMP /Fo..\\..\\..\\optimized\\obj\\x86\\CPP.obj CPP.cpp

COMPL.TMP包含

/I*** application-headers ***       
-D_AFXDLL -c -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DBTREEDB -O2 -Ox -MD -Zi   -DNT_CLIENT -DWIN32 -D"_CONSOLE"  -D_THREADS  -D_OPSYS_TYPE=DS_WINNT  -DPSAPI_VERSION=1 -D_WIN32_WINNT=0x0602 -TP -DMBCS=1 -D_LONG_LONG=1 -D_DSM_VLK_BTREE -DDSM_WIDECHAR  -D_UNICODE -DUNICODE  -DUSE_XML=1 -DXMLUTIL_EXPORTS=1 -DUSE_XERCES_2_8=1 -DPEGASUS_PLATFORM_WIN32_IX86_MSVC=1 -DPEGASUS_USE_EXPERIMENTAL_INTERFACES -Zp1 -D_DSM_LONG_NAME    -W3 -EHsc -GF       

2 个答案:

答案 0 :(得分:2)

问题不在于_WIN32_WINNTNTDDI_VERSION宏。

问题在于windows.h间接地包含winioctl.h,其中有几条好奇的线路在中途:

#ifndef _NTDDDISK_H_
#define _NTDDDISK_H_

不出所料,ntdddisk.h从那些相同的行开始,因此实际上根本不包括在内。

我无法轻易想出可以解决这个问题的标题组合或排序 - 我认为这是MS真正需要解决的问题。

然而,以下可怕的解决方法(我真的不建议,除非你无法从MS获得任何帮助)似乎让编译器实际处理ntdddisk.h

#define _NTDDDISK_H_
#include <windows.h>
#undef _NTDDDISK_H_

但是,我怀疑这个黑客可能会出现其他问题 - 所以如果您决定使用它,请仔细测试。

答案 1 :(得分:1)

我不确定这是我需要的,但插入

后编译工作
 #define _NTDDDISK_H_
 #include <windows.h>
 ...
 #undef _NTDDDISK_H_
 #include <ntdddisk.h>

感谢您的建议。