add these web sites

DeviceExtension与DeviceObjectExtension的关系

Posted by micki on July 25, 2018, sorted in Windows Driver Development

DeviceExtension与DeviceObjectExtension的关系

DeviceExtension与DeviceObjectExtension是DEVICE_OBJECT中的两个成员变量, 其在DEVICE_OBJECT中的原型分别为:PVOID DeviceExtension和struct _DEVOBJ_EXTENSION  *DeviceObjectExtension, 可以看出两个成员均为指针.
 
DeviceExtension指向的是设备对像创建者自定义的结构, 网上能搜到很多驱动示例会用到 DeviceObjectExtension - DeviceExtension来计算DeviceExtension所指向数据结构的长度, 那么二者到底是什么关系以至于该算式能得到DeviceExtension所指向数据结构的长度? 想必大多数读者的猜想跟我是一样的, IoCreateDevice创建DeviceObject时, 会在DeviceExtension数据结构之后分配DeviceObjectExtension数据结构的空间, 这样便可以用DeviceObjectExtension - DeviceExtension来计算DeviceExtension所指向数据结构的长度. 事实如何呢? 我们可以做一个简单的实验来验证.
 
 
我写一个简单的例子来验证二者之间的关系, 首先创间一个自定义的DeviceExtension结构:
 
typedef struct _stDevExt
{
int nDevice;
} DEV_EXT, *PDEV_EXT;
 
然后调用IoCreateDevice以该结构为DeviceExtension创建一个DeviceObject, 用Windbg可以看到其如下情况:

 
DeviceObjectExtension - DeviceExtension = 8, 而DEV_EXT结构长度为4. 不一样, 难到有猫腻? 不急, 我把DeviceExtension结构稍做修改如下:
 
typedef struct _stDevExt
{
int nDevice;
int nReserve1;
} DEV_EXT, *PDEV_EXT;

这次运行结果如下:

 
这次DeviceObjectExtension - DeviceExtension = 8, 而DEV_EXT结构长度为8, 一样了. 回头再看看DEVICE_OBJECT的定义:typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT, 里面有个MEMORY_ALLOCATION_ALIGNMENT, 而该符号定义如下:
 
#if defined(_WIN64) || defined(_M_ALPHA)
#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
#define MEMORY_ALLOCATION_ALIGNMENT 16
#else
#define MAX_NATURAL_ALIGNMENT sizeof(ULONG)
#define MEMORY_ALLOCATION_ALIGNMENT 8
#endif
 
看到这里可知道驱动里结构内存的分配在Win32里是以8字节为单位的而在Win64系统里是以16字节为单位的, 这样一来第一次测试里有4字节的差异也就有了合理的解释了,虽然DEV_EXT结构实际只有4字节, 但IoCreateDevice为其分配了8个字节的存储空间, 然后才是DeviceObjectExtension, 以上测试可证实IoCreateDevice总在DeviceExtension空间之后分配DeviceObjectExtension.
 

Recent Posts