gpt4 book ai didi

visual-c++ - 为什么 NTDDI_VERSION 宏将其值从它包含的 cpp 更改为 ntdddisk.h?

转载 作者:行者123 更新时间:2023-12-02 07:10:05 27 4
gpt4 key购买 nike

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

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

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

在CPP中有#include

ntdddisk.h 定义了 WIN 8 在 protected 条件下的新 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

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

详细信息是:

在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

最佳答案

问题不在于 _WIN32_WINNTNTDDI_VERSION 宏。

问题在于 windows.h 间接包含 winioctl.h,其中大约有以下几行奇怪的代码:

#ifndef _NTDDDISK_H_
#define _NTDDDISK_H_

不出所料,ntdddisk.h 以相同的行开头,因此实际上根本不包含在内。

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

但是,以下糟糕的解决方法(我真的不建议这样做,除非您无法从 MS 获得任何帮助)似乎让编译器真正处理 ntdddisk.h:

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

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

关于visual-c++ - 为什么 NTDDI_VERSION 宏将其值从它包含的 cpp 更改为 ntdddisk.h?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23949080/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com