龙空技术网

别再信任WDK离线帮助文档了!

BB莱纳德 110

前言:

当前咱们对“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