有没有什么原因让DISK_DETECTION_INFO is defined as
typedef struct _DISK_DETECTION_INFO {
DWORD SizeOfDetectInfo;
DETECTION_TYPE DetectionType;
union {
struct {
DISK_INT13_INFO Int13;
DISK_EX_INT13_INFO ExInt13;
};
};
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;而不是
typedef struct _DISK_DETECTION_INFO {
DWORD SizeOfDetectInfo;
DETECTION_TYPE DetectionType;
DISK_INT13_INFO Int13;
DISK_EX_INT13_INFO ExInt13;
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;或者我只是过度分析了这段代码?
发布于 2011-09-11 14:11:15
可以说,这是一个错误。然而,有可能我们只得到了结构的公开定义。在内部(当由Windows内核使用时),它可能被定义为:
typedef struct _DISK_DETECTION_INFO {
DWORD SizeOfDetectInfo;
DETECTION_TYPE DetectionType;
union {
struct {
DISK_INT13_INFO Int13;
DISK_EX_INT13_INFO ExInt13;
};
DISK_INTERNAL_INFO Private; // Used internally, when DetectionType = -1
};
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;我不认为这是可维护的、安全的或可移植的,但这是可能的。
DISK_INTERNAL_INFO甚至可以超过匿名struct的大小--如果用户自己从不实例化对象,那么这项技术甚至可以被认为是对用户隐藏额外数据但将其保留在结构中的有用方法。他们永远不会“看到”匿名的struct。
发布于 2011-09-11 14:47:53
这两种行为之间有一个非常具体的区别:在第一种情况下,在初始化DISK_DETECTION_INFO时,Int13和ExtInt13都不会初始化。在后一种情况下,所有四个字段都被初始化。
MSVC有许多奇怪的扩展,包括结构末尾的可变大小数组,对于这些扩展,自动初始化行为可能是不可取的。
编辑:关于“初始化”:
假设结构是
typedef struct _foo {
int bar;
union {
struct {
int baz;
int wee;
};
};
} foo;然后,编写foo x = { 1; }不会给baz或wee赋值(它们在技术上是不确定的)。如果结构是
typedef struct _foo {
int bar;
int baz;
int wee;
} foo;然后,编写foo x = { 1; }会为baz=0和wee=0赋值
发布于 2011-09-11 15:01:59
我认为有合理的证据表明,有人在编写原始的DISK_DETECTION_INFO结构定义时犯了一个简单的错误。这个错误逃到了野外,所以要纠正它已经太晚了。
头文件中的定义为:
typedef struct _DISK_DETECTION_INFO {
DWORD SizeOfDetectInfo;
DETECTION_TYPE DetectionType;
union {
struct {
//
// If DetectionType == DETECTION_INT13 then we have just the Int13
// information.
//
DISK_INT13_INFO Int13;
//
// If DetectionType == DETECTION_EX_INT13, then we have the
// extended int 13 information.
//
DISK_EX_INT13_INFO ExInt13; // If DetectionType == DetectExInt13
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;文档内容如下:
如果DetectionType为DetectInt13,则联合为DISK_INT13_信息结构。
如果DetectionType为DetectExInt13,则联合为DISK_EX_ INT13_INFO结构。
因此,由于DISK_INT13_INFO和DISK_EX_INT13_INFO是相互排斥的,因此它的原始意图很可能是将它们放在一个联盟中。
https://stackoverflow.com/questions/7376552
复制相似问题