前言:
当前咱们对“netguidmsdn”大概比较关心,你们都想要知道一些“netguidmsdn”的相关文章。那么小编也在网摘上搜集了一些关于“netguidmsdn””的相关内容,希望我们能喜欢,朋友们快快来了解一下吧!近日用到驱动中获取wmi信息,依赖当年Windows server 2003(3790)离线WDK文档,图个方便快速,结果踩坑!
我们来看IoWMIQueryAllData函数,它是获取设备wmi信息的核心函数:
NTSTATUS IoWMIQueryAllData( IN PVOID DataBlockObject, IN OUT ULONG *InOutBufferSize, OUT /* non paged */ PVOID OutBuffer );
按照这个文档,其中OutBuffer返回的数据是WNODE_ALL_DATA结构:
typedef struct tagWNODE_ALL_DATA { struct _WNODE_HEADER WnodeHeader; ULONG DataBlockOffset; ULONG InstanceCount; ULONG OffsetInstanceNameOffsets; union { ULONG FixedInstanceSize; OFFSETINSTANCEDATAANDLENGTH OffsetInstanceDataAndLength[]; };} WNODE_ALL_DATA, *PWNODE_ALL_DATA;
该结构有一个结构头是struct _WNODE_HEADER类型:
typedef struct _WNODE_HEADER { ULONG BufferSize; UINT_PTR ProviderId; union { ULONG64 HistoricalContext; struct { ULONG Version; ULONG Linkage; }; }; union { HANDLE KernelHandle; LARGE_INTEGER TimeStamp; }; GUID Guid; ULONG ClientContext; ULONG Flags;} WNODE_HEADER, *PWNODE_HEADER;
坑就在这个结构头上,注意ProviderId的类型是UINT_PTR,它意味着在x86环境下是UINT,在x64环境下是UINT64类型。
我是在x64环境下使用的,结果根据结构成员去循环读取结构中的数据总是不对,对自己产生了深深的怀疑!
最后查了一下当前Win10 WDK中的wmistr.h中对该结构的声明,ProviderId的类型早已更正为ULONG类型,也就是不管x86还是x64,这个结构头的大小是一致的!!
直接查阅线上MSDN,也是ULONG类型!时代确实变了,什么东西都要在线!
当然不知道在Windows server 2003时代它是不是本来就有区别,只是后来统一了。
因此记之,备查。
标签: #netguidmsdn