作者:empty 页数:148 出版社:empty |
Windows驱动程序开发环境和Windows调试器已集成到Microsoft VisualStudio中。在此集成的驱动程序开发环境中, VisualStudio界面中提供有编码、构建、打包、部署和测试驱动程序所需的大部分工具。若要设置集成开发环境, 请先安装VisualStudio, 然后再安装WDK。要了解如何获取VisualStudio和WDK, 请访问WDK设置和下载页面。Windows调试工具包含在WDK安装中。WDK使用MSBuild.exe, VisualStudio用户界面中提供有此程序, 并且它也可以作为命命行工具提供。在VisualStudio环境中创建的驱动程序使用项目和解决方案文件来描述项目或项目组。VisualStudio环境提供有用于将旧源和目录文件转换成项目和解决方案文件的工具。VisualStudio环境提供适用于以下项的模板:·新驱动程序·骆动程序包·新测试·现有测试的增强功能·自定义驱动程序部署脚本
在VisualStudio环境中, 你可以配置构建流程, 使其自动创建和签署驱动程序包。VisualStudio中提供了静态和实时分析工具。你可以配置用于测试驱动程序的目标计算机,并在每次重建时特你的驱动程序自动部署到目标计算机。你可以从多个运行时测试中进行选择,也可以编写自己的测试。本部分的主题介绍了如何使用VisualStudio执行驱动程序开发、部署和测试中涉及的各任务。其他视频你将在Windows驱动程序文档中的以下页面上找到视频:·蒋Windows Performance Toolkit(WPT) 与WDF配合使用:视频:在没有调试程序的情况下访问驱动程序IFR日志·视频:使用WDF源代码调试驱动程序·视频:调试UMD F驱动程序
Windows驱动程序入门自Windows 10版本2004发布后的某个时间点起.在Windows中运行的驱动程序被归类为Windows驱动程序或Windows桌面驱动程序。Windows驱动程序在所有Window 10变体中运行, 其中包括Windows 10X和Windows 10桌面版, Windows桌面驱动程序只在Windows 10桌面版中运行。Windows驱动程序*分类将扩展并取代当前的*通用驱动程序分类。此页面提供了即将发布的Windows驱动程序要求的预览。NOTEWindows驱动程序和Windows桌面驱动程序之间的区别并不影响任何要为Windows 10版本2004提交和认证的驱动程序,认证和提交方面的支更将在以后进行.Windows驱动程序要求当Windows驱动程序成为认证选项时, 需要通守以下要求:·符合DCH设计原则。·遵循驱动程序包隔离原则。·遵循API分层要求,·使用Hardware Lab Kit获得Windows硬件兼容性计划认证流程认证。请注意, Windows硬件兼容性计划认证流程要求适用于KM DF和UMD F驱动程序。Windows驱动程序与Windows桌面驱动程序下表总结了上述区别:在Windows 10桌面版中运行在Windows 10X中运行必须获得W HCP认证WDK和HL K是开发和认证驱动程序的
主要工具速循更严格的可靠性和可维护性要求(如驱动程序包隔离)尽管只在Windows 10桌面版中运行的驱动程序不需要符合针对Windows驱动程序的附加要求, 但这样做特增强驱动程序的可维护性和可靠性, 并为将来可能在Windows 10X上获得认证做好准备,DCH设计原则和最佳做法本页介绍了Windows驱动程序的设计原则和最佳做法,DCH设计原则为了让Windows驱动程序符合DCH, 需要考虑三个设计原则:·声明性(D) :仅使用声明性INF指令安装驱动程序。请勿包括共同安装程序或Register DI函数。·组件化(C) :特定于版本的、特定于OEM和可选的驱动程序自定义项独立于基础驱动程序包。因此, 可以独立于自定义项为仅提供核心设备功能的基础驱动程序设定目标、进行外部测试和提供服务。·硬件支持应用(H) 任何与Windows驱动程序关联的用户界面(U) 组件都必须打包为硬件支持应用(HSA)或预安装在OEM设备上, H5A是与驱动程序配对的可选设备特定应用, 此类应用可以是通用Windows平台(UWP) , 也可以是桌面桥应用, 必须通过Microsoft Store分发和更新HSA.有关详细信息, 请参阅硬件支持应用(H5A) :适用于驱动程序开发人员的步骤和硬件支持应用(HSA) :适用于应用开发人员的步骤。首字母缩略词*DCH*指的是上面列出的原则。请参阅符合DCH的驱动程序包示例页, 以了解驱动程序示例如何应用DCH设计原则。
概述符合DCH的驱动程序包中有INF文件, 以及在基于通用Windows平台(UWP} 的Windows 10版本上安装和运行的二进制文件。它们还在共用一组公用接的其他Windows 10版本上安装和运行。符合DCH的驱动程序二进制文件可使用KM DF、UMD F 2或Windows驱动程序模型(WDM) ,符合DCH的驱动程序由以下部分组成:·基础驱动程序·可选组件包·可选硬件支持应用基础驱动程序包含所有核心功能和共享的代码。可选组件包可以包含自定文项和其他设置。通常, 设备制造商或独立硬件供应商(IHV) 会编写基础驱动程序。然后.系统构建者或原始设备制造商(OEM) 符提供任何可选组件包。在获得IHV认证后, 基础驱动程序包就可以部署在所有OEM系统上。由于可以在共享硬件部件的所有系统中使用基准驱动程序包.因此Microsoft可以通过Windows预览体验成员外部测试广泛地测试基准驱动程序包, 而不是将分发局限于特定计算机,OEM仅验证它为OEM系统提供的可选自定义项。要求若要创建遵循DCH设计原则的驱动程序包, 请按照以下步骤操作:·为驱动程序创建通用INF1.中阅Windows驱动程序包中有效的INF部分和指命的列表。2.使用Inf Verif工具来验证驱动程序包的INF文件是否遵循Windows驱动程序的声明性(D) 要求。·确保所有不包含核心驱动程序功能的可选组件包都与基础驱动程序包分离。
与驱动程序包关联的硬件支持应用必须通过Microsoft Store分发。最佳实践·如果结合使用Windows驱动程序工具包(WDK) 版木2004与最新的VisualStudio, 请将驱动程序项目属性中的*目标平台“值设置为 Mind ows Driver“.这会自动添加正确的库, 并且它会在生成过程中运行正确的INF验证和APi Validator。若要实现此目的, 请执行以下操作1.打开驱动程序项目属性。2.选择*驱动程序设置”。3.使用下拉菜单将*目标平台“设置为windows Drivers·如果INF执行依赖于目标平台的任何自定义设置操作, 请考您将其分离形成一个扩展INF。可以独立于基础驱动程序包更新扩展INF.以提高稳健性和可用性。有关详细信息, 请参阅使用扩展INF文件。·如果想要提供一个与你的设备兼容的应用程序, 请包括UWP应用。有关详细信息, 请参阅硬件支持应用(H5A) :适用干驱动程序开发人员的步骤。OEM可以使用DIS M-部署块像服务和管理预加栽此类应用。或者, 用户可以从Microsoft Store手动下载此应用,·在INF Destination Dirs部分中, 将目标目录设为dir id 13.使驱动程序可从驱动程序存储运行, 此设置不适用于某些设备。驱动程序包隔离
驱动程序包离是Windows驱动程序的一项要求, 让驱动程序对外部变化更有弹性、更容易更新和安装。尽管驱动程序包隔离是针对Windows驱动程序的要求, 但Windows桌面驱动程序仍可从中受益, 因为此要求提高了复原能下表在左侧列中显示了Windows驱动程序不再允许的旧驱动程序做法, 在右侧列中显示了要求的Windows驱动所有独立驱动程序包都将其驱动程序包文件保留在驱动程序存储中。这意味若, 它们在其INF中指定DIR ID 13以从驱动程序存储运行的内核模式驱动程序可以调用lo Query Full Driver Path并使用该路径来查找与之相对应的配置文件。如果内核模式驱动程序是KM DF驱动程序, 则它可以使用Wdf Driver Wdm Get Driver Object来检索要传递到lo Query Full Driver Path的WDM驱动程序对象。UMD F驱动程序可以使用Get Module Handle ExW和Get Module FileName W来确定驱动程序是从何处加载的, 例如:bRet-Get Module Handle ExW{GET_MC DULE_HANDLE_EX_FLAG_FROM_ADDRESS,WDM或KM DF驱动程序从Driver Store中运行并需要从其驱动程序包访问其他文件, 它可以使用lo Query Full Driver Path来查找它的路径、获取加载它的目录路径以及查找与该路径相关的配置文件。成者, 在Windows 10版本1803及更高版本中, 使用Driver Directory lm age作为目录类型来调用lo Get Driver Directory, 以获取加载该驱动程序的目录路径。对于INF负载的文件, INF中该文件的Source Disks Files条目中列出的subdir必须与INF中该文件的2021/1/5·Edit On lingNOTE力和可维护性。程序行为,INF将文件复制到Sy stern 32 drivers使用硬编码路程与其他驱动程序交互将路径硬编码到全局注册表位置运行时文件写入任何位置从驱动程序存储运行在安装时指定驱动程序包文件的位置。if(bRot) (Destination Dirs条目中列出的subdir匹配。uu驱动程序文件从驱动程序存储运行使用系统提供的功能成设各接与其他驱动程序交互使用HKR和系统提供的功能取注册表和文件状态的相对位驱动程序文件写入系统提供的位道(PC MSTR) sO river Entry,S handle H odule) ;chars written=Get H odule File N are MC handle Module,path,pathLength) ;
此外, CopyFiles指令不能用于重命名文件。这些限制是必需的, 这样在设备上安装INF才不会导致在Driver Store目录中创建新文件。由于Source Disks Files条目无法具有多个文件名相同的条目.并且CopyFiles不能用干重命名文件, 因此INF引用,的每个文件必须具有唯一的文件名。从驱动程序存储动态查找和加载文件在某些情况下,驱动程序包可能包含应该由另一驱动程序包中的二进制文件加载或由某个用户模式组件加载的文件。下面有几个示例:·用户模式DLL提供一个用来与驱动程序包中的驱动程序通信的接。·扩展驱动程序包包含一个由基准驱动程序包中的驱动程序加载的配置文件。在这些情况下,驱动程序包应该设置某个状态来指示文件的路径或由设备公开的设备接,例如.驱动程序包可以使用HKR Add Reg来设置此状态。在此示例中, 应该假定:对于Ex an ple File.dll, 驱动程序包有一个没有任何subdir的Source Disks Files条目, 这样就会将文件置于驱动程序包目录的根目录中, 而CopyFiles指令的Destination Dirs则指定dir id 13.下面是一个INF示例, 演示了如何将其设置为设备状态:[Ex ap leOD Install.Hw]Add Reg-Ex an ple DO Install.Add Reg[Exo wp le_DD Install.Add Reg]HKR, , Example Value, , 13% Example File.dll而将其设置为设备接状态的INF示例为:[Ex at pleD DInstall.Interfaces]Add Interface{s fill in an interface class GUID for an interface exposed by thedevice>) , , Example_Add_Interface_Section[Example_Add_Interface_Section]Add Reg-Ex an ple_Add_Interface_Section, Add Reg[Example_Add_Interface_Section.Add Reg]前面的示例使用空的标志值, 这会导致生成REG_SZ注册表值。这样就会将%13%转换成完全限定的用户模式文件路径。在许多情况下,最好是特路径设置为某个环境变量的相对值。如果使用标志值0x20000,则注册表值为类型REG_EXPANDS Z.面%13%则会转换为一个包含相应环境变量的路径, 该变量用干抽象路径的位置。检索此注册表值时, 请调用Expand Environment Strings来解析路径中的环境变量。如果此慎需由内核模式组件读取, 则此俏应该是REG_SZ慎。内核模式组件在读取该值时应该在其前面预YPP A当此设置成为设备状态的一部分时,如果要访问它,则应用程序必须先找到设备的标识。用户模式代码可以使用CM_Get_Device_ID_List_Size和CM_Get_Device_ID_List获取设备的列表(按睿筛选) , 该设备列表可能包含多个设备,因此请先搜索相应的设备,然后再从设备读取状态。例如,在直找符合特定条件的设备时,请调用找到正确的设备以后, 请调用CM_Open_Dev Node_Key来获取存储设备状态的注册表位置的句柄。内核模式代码应该检素PDO(Physical Device Object.物理设备对象) 并调用lo Open Device Registry Key。若要在此设置是设备接状态时访问它, 可以通过用户模式代码来调用CM_Get_Device_Interface_List_Size另外, 可以使用CM_Register_Notification来取设备接的到达和删除通知, 这样就可以在后用接时通知代码, 让代码随后检素状态。在设备接类(在上述API中使用) 中可能有多个设备接, 检查这些接, 确定哪个找到正确的设备接以后, 调用CM_Open_Device_Interface_Key。内核模式代码可以检素从其获取状态的设备接的符号链接名称。为此,请调用lo Register Plug Play Notification, 以便注册获取相应设备接类的设备接通知。也可调用lo Get Device Interfaces, 获取系统中当前设备接的列表。在设备接类(在上述API中使用) 中可能有多个设备接。检查这些接,确定哪个接是应该读取设置的正确接。找到适当的符号链接名称以后, 请调用lo Open Device Interface Registry Key, 以便检在其中存储了设备撞将CM_GETID LIST_FILTER_PRESENT标志与CM_Get_Dev ie_ID_List Size和CM_Get_Device_ID_List配合使用戴者将CM_GET_DEVICE_INTERFACE_LIST_PRESENT标志与CM_Get_Device_Interface_List_Size和CM_Get_Device_Interface_List配合使用。这样可确保硬件存在并已做好通信准备需要在驱动程序之间共享状态时,应该只有一个驱动程序拥有共状态,并且该驱动程序应该为其他驱动程序提通常,拥有该状态的驱动程序会在自定义设备接类中公开一个设备接。当驱动程序准备好让其他驱动程序访问该状态时,它将后用该接。其他驱动程序可以注册设备接到达通知。要访问状态,自定义设备接类可以定·I/O协议,可以与提供访问状态的机制的设备接类相关联。其他驱动程序使用已启用的设备接来发送符合·直接调用接通过查询接返回。其他驱动程序可以通过发送IRP_MN_QUERY_INTERFACE从驱动程序检素由或者,如果拥有该状念的驱动程序允许直接访问该状态,其他驱动程序则可以通过使用系统提供的功能以编程方这些接或状态(取决于使用的共享方法)需要进行正确的版本控制,以便拥有该状态的驱动程序可以独立于访问该状态的其他驱动程序而获得服务。驱动程序供应商不能同时依赖于正在获得服务且版本相同的两个驱动程序。因为控制接的设备和驱动程序变化不定,所以驱动程序和应用程序该避免在组件后动时调用最佳做法是注册设各接到达或制除的通知,然后调用适当的函数来获取计算机上现有的已后用接的列表。HKR, , Ex aep le Value, , X 13% Ex an ple File.dl 1, 然后再将其传递给Zw Open File之类的AP 1。CM_Get_Dev Node_Property来检素设备的属性。和CM_Get_Device_Interface_List。接是适合读取设置的接。状态的注册表位置的句柄。NOTE使用设备接供一种读取和修改该状志的方法。义两个协议之一:协议的//O请求。数指针以进行调用。式访问设备接状态来访问该状态。lo Get Device Interfaces来获取已后用接的列表。有关设备接的详细信息,请参阅:·使用设备楼·注册获取设备接到达和设备删除通知·注册设备接更改通知读取和写入状态
NOTE如果组件使用的是设备设备接属性来存储状态, 则推续使用方法和适当的OS API来存储井访问状态, 以下指南适用于需要由组件存的其他状态。对各种状态的访问应该通过调用函数来完成,这些函数向调用方提供状态的位置,然后系统将读取/写入与该位置相关的状态。请勿使用硬编码的绝对注册表路径和文件路径。本节包含以下小节:·PnP设备注册表状态·设备接注册表状态·服务注册表状态·设备文件状态·服务文件状态PnP设备注册表状态独立驱动程序包和用户模式组件通常使用两个位置在注册表中存储设备状态。它们是用于设备的硬件密(设备密)和用于设备的软件密(驱动程序密钥),若要检索这些注册表位置的句柄,请根据使用的平台使用以下选项之一;·lo Open Device Registry Key(WDM)·Wdf Device Open Registry Key, Wd fF do ln it Open Registry Key(WDF)·CM_Open_Dev Node_Key(用户模式代码)·INF Add Reg指, 使用引用自IN FDD Install部分或DD Install HW部分的add-registry section中的HKR reg:root条目, 如下所示:[Example OD Install.Hw]Add Reg-Ex an ple DO Install.Add Reg[Ex an ple_DD Install.Add Reg]使用设备接与其他驱动程序和组件共享状态。请勿将路径硬编码到全局注册表位置。若要读取和写入设各接注册表状态,请根据使用的平台使用以下选项之一:, INF Add Reg指合, 使用引用自add interface-section部分的add-regis ry-section中的HKR reg-root荣目INF为驱动程序和Win 32服务设置的注册表值应存偏在服务的 参数 子项下, 方法是在Add Reg部分中提供HKR·loOp enD river Registry Key(WDM) .DRIVER_REGKEY_TYPE为Driver RegKey Parameters·Get Service Registry State Key(Win 32服务) , SERVICE REGISTRY_STATE_TYPE为这些由INF在服务的 参数“子键中提供的注册表值不应该在运行时修改, 应视为只读的值。在运行时写入的注册表值应在不同的位置下写入。若要访问要在运行时写人的状态的位置,请使用以下图数之一:·loOp enD river Registry Key(WDM) .DRIVER_REGKEY_TYPE为Driver RegKey Persistent State·Get Service Registry State Key(Win 32服务) , SERVICE_REGISTRY_STATE_TYPE为Service Registry State Persistent如果需要写人与设备相关的文件, 这些文件应相对于通过OS API提供的句柄或文件路径进行存储。例如, 特定于·lo Get Device Directory(WDM) , Directory Type参数设置为Device Directory Data·lo Get Driver Directory(WDM) , Directory Type参数设置为Device Directory Data·lo Get Driver Directory(KM DF) , Directory Type参数设置为Device Directory Data·Get Service Directory(Win 32服务) , eDirectory Type参数设置为Service Directory Persistent State若要与其他组件共享服务的内部状态,请使用受控制的、受版本控制的接,而不是直接注册表或文件读取,用作可与其他组件共享的中间操作的一部分的文件成该写入Driver Data Program Data位置。这些位置为组件提供一个位置,用于写入临时状态或旨在由其他组件使用、可能从某一系统收集和复制以供另一避免在Dr1ver Data或Pro gran Data目录的根目录中军入文件。请改用公司名称创建子目录, 然后在在该目录中例如, 对于Con to so的公司名称, 内核模式驱动程序可将自定义日志写入 Driver Data Con to so Logs, 用户模式应HKR, , Example Value, , *13% Ex an ple File.dll设备接注册表状态·lo Open Device l nterface Registry Key(WDM)·CM_Open_Device_Interface_Key(用户模式代码)服务注册表状态行, 然后在INF的服务安装部分引用该部分, 例如:[Example DD Install.Services]Add service-Ex an ple Service, 8x 2, Example_Service_Inst[Ex at ple_Service_Inst]Display Nate-N Exar ple Service.Svc Do sck5ervice Type=1Start Type=3Error ControlService Binary-%13% Exar ple Service.sysAdd Reg-Exar ple_Service_Inst-Add Reg[Exar ple_Service_Inst.Add Reg]HKR, Par are ters, Ex awp le value, OxB8e1e0e 1, 1若要访问该状态的位置,请根据平台使用下列函数之一:·Wdf Driver Open Parameters Registry Key(WDF)Service Registry State Parameters·Wdf Driver Open Persistent State Registry Key(WDF)设备文件状态该设备的配置文件就是一个应存储在此处的文件类型。·Wdf Device Retrieve Device DirectoryString(WDF)服务文件状态Win 32和驱动程序服务均读取和写人关于本身的状态。若要访问服务自己的内部状态值.该服务需使用下列选项之一:·Wdf Driver RetrieveD river Data DirectoryString(UMD F)Driver Data和Program Data系统处理的状态。例如.自定义日志文件或故障转储符合此描述。军入文件和更多子目录。
用程序可收集或分析x Driver Data N Con to so Logs中的日志文件。Driver DataWindows 10版本1803及更高版本中提供了Driver Data目录, 可供管理员和UMD F驱动程序访问。内核模式驱动程序使用系统提供的名为 Driver Data的符号链接访问Driver bata目录。用户模式程序使用环境变量X Driver Data k访间Driver Data目录。Program Datax progra rDa tax用户模式环境变量适用于存储数据时要使用的用户模式组件。API分层API分层要求.Windows驱动程序包中的二进制文件只调用基于UWP的Windows 10版本中或特选Win32API集中包含的API和DDI。API分层是以前属于D CHU设计原则的 U^要求的扩展。若要查看API支持哪个平台, 请访间API的文档页, 井市阅“要求 部分的*目标平台*条目。Windows驱动程序必须只使用将 目标平台 列为”Universal“(即在所有Windows产品/服务上都可用的功能的子集) 的API或DDI.Windows API集页面描述了一组最佳做法和工具, 它们用于确定API是否适用于Windows 10X开发。Api Validator是用于验证Windows驱动程序是否符合API分层要求的主要工具。Windows驱动程序工具包(WDK)若要详细了解如何使用Api vaid at or来验证Windows驱动程序是否符合API分层要求, 请参阅验证Windows驱2021/1/5·Edit Qn line概述验证API分层随附Api Validator.动程序。
构建Windows驱动程序2020/11/3·:Edit Qn lineProvider- Con to so 可以结合使用Microsoft VisualStudio 2019与Windows驱动程序工具包(WDK) 版本2004来生成Windows驱动程序。可从Windows硬件开发人员中心下载工具包和工具。在许多情况下, 只要驱动程序不使用任何用户模式组件, 就可以将旧的内核模式驱动程序重新编译为Windows驱动程序。旧的WDM和KM DF驱动程序应饺能够重新编译为定目标到Windows 10的Windows驱动程序, 而无需转换。虽然这些驱动程序可以编译而不需要任何转换, 但这并不意味着驱动程序符合Windows驱动程序的所有要求, 若要详细了解Windows驱动程序要求, 请参阅Windows驱动程序人门,相比之下.现有用户模式驱动程序可能需要修改才能编译为Windows驱动程序。具体来说, 驱动程序包在UWP之外不能有任何依项。例如, 仅部分Win32API属于UWP。将现有驱动程序项目转换为Windows驱动程序项目1, 在VisualStudio 2019中, 打开现有的驱动程序项目。2.在'解决方案资源管理器 窗格中,选择井按住(或右键单击)解决方案,然后选择*配置管理器 。将目标操作系统设置为Windows 10。3.选择并按住(或右键单击)驱动程序项目,然后选择 属性 。在 配置属性 -> 驱动程序 下,验证“目标平台 是否设置为 Windows驱动程序'。若要生成只在Windows 10桌面版中运行的驱动程序, 请选择 桌面:4.生成驱动程序。你可能会遇到链接器错误,5.览误日志, 逐个修复错误。请参阅文档中的各个参考页面, 以寻找可能的替换API.如果无法替换.则可能需要重新设计驱动程序。在Microsoft VisualStudio中新建Windows驱动程序项目1.使用模板来新建驱动程序(依次转到 文件*->“新项目“->“新建项目->“项目类型*-“驱动程序”,然后选择所需的模板).2.创建项目后,在 解决方案资源管理器 窗格中,选择并按住(或右键单击)解决方案,然后选择 配置管理器 。将 活动解决方案配置 设置为所需的目标Windows版本, 并将 活动解决方案平台 设置为 Win 32 或*x 64 。如果ARM列出, 请选择^ 新建.5*为ARM生成。如果选择Windows 10.驱动程序模型将默认为*通用。若要手动更改驱动程序模型、请选择井按住(或右键单击)驱动程序项目,然后选择 属性,在“配置属性”->“驱动程序设置>“常规 下, 找到“目标平台^条目, 选择Windows驱动程序。Microsoft VisualStudio使用此设置确定要链接的库。注意无法为低于Windows 10版本1809的Windows版本生成Windows驱动程序。3.可能需要修改inf文件以指定提供程序, 指定为%Manufacturer Name%合牌, 该命牌稍后将在INF文件的Strings节中展开。例如:4.现在可以生成解决方案。VisualStudio链接所需库并生成cat文件、inf文件和驱动程序二进制文件。在Microsoft VisualStudio中创建新的通用应用程序或DLL项目1.使用模板来新建驱动程序(依次转到*文件*> 新项目*→*新建项目->*项目类型*->^驱动程序 ,然后选择所需的模板) , 并选择 适用于驱动程序的空桌面应用程序(通用) “或 适用于驱动程序的空DII(通用) 。2.创建项目后,在 解决方案资源管理器 格中,选择并按住(或右键单击)解决方案,然后选择“配置管理器.将*活动解决方案配置 设置为所需的目标Windows版本, 并将 活动解决方案平台*设置为Win 32 或 x 64 。如果ARM未列出, 请选择 新建.>“为ARM生成。如果选择Windows 10.应用程序模型将默认为'通用 .若要手动更故目标平台,请选择并按住(或右键单击)驱动程序项目,然后选择 属性 。在“配道展性 ->“驱动程序设置*->“常规 下,找到 目标平台“条目。3.生成解决方案。有关生成驱动程序时可以在在VisualStudio中使用的配置设置的信息, 请参阅使用WDK生成驱动程序。
验证Windows驱动程序2021/1/5-Et Qn line使用Inf Verf、动程序验证器驱动程序隔离检查和Api Validator工具来测试Windows驱动程序是否符合Windows驱动程序人门中所述的要求。Inf VerifInf Verif是一种工具, 用于验证INF语法, 并检查INF是否符合要求和限制。结合使用Inf Verif与/w和/v可以验证Windows驱动程序是否:·符合DCH设计原则的声明性(D) 原则·遵循Windows驱动程序入门中的驱动程序包隔高要求如需了解更多详情, 请参阅通过命令行运行Inf Verif。面向当前版本的Windows和早期版本的WindowsInf Verif的每次运行测试单个规则集, 例如/(Windows驱动程序兼容性) 或/k(硬件开发人员中心提交) 。如果你的INF包含较新版本的Windows中引入的语法, 井且你还想要将以前的Windows版本作为目标, 请使用INF修饰来标记特定版本的INF项, 然后多次运行Inf Verif.例如inf verif/kc INF fileinf verif/uNT AHD 54.18.8.0.cbufldnunberuherewisa requirement) cINF file)如果没有错误, 则INF满足Windows驱动程序的驱动程序包隔离要求。例如.从Windows 10版本1809开始, INF Add Event Provider指命可供使用。若要在一个面向Windows 10版本1809之前的OS版本的INF中使用此指命, 请修饰使用旧INF语法(用于注册ETW事件提供程序) 的安装部分和使用已更新语法的安装部分。有关演示如何使用OS修饰的示例代码, 请参阅适用于一个或多个目标操作系统的示例INF模型部分。驱动程序验证器驱动程序隔离检查为了获得Windows驱动程序的资格, 驱动程序必须满足驱动程序包隔离要求。自Windows 10预览版19568开始,驱动程序验证器(DV)会监视已隔离的驱动程序包所禁止的注册器读取和写人,可在内核调试程序中发生违规行为时查看这些行为,也可配值DV来停止系统,并在发生违规行为时生成包含详细偿息的内存转储。可通过第一种方法开始驱动程序开发,然后在驱动程序快要完成时,切换到第二种方法。若要在违规行为发生时进行查看,请先连接内核调试程序,然后使用以下命令。重后操作后用DV设置后,可在内核调试程序输出中监视违规行为。若要在单个驱动程序中后用驱动程序隔离:ver1fter/rc 3335/driver my Driver.sys若要检查多个驱动程序请使用空格隔离每个驱动程序名称:ver1fier/rc 3336/driver my Driver i-sys nyp river 2.sys若要配置DV, 使它在发生违规行为时进行bug检查, 请使用以下语法:verifier/one check/rc 3335/driver ny Driver l.sys需要重后才能后用验证设置,若要通过命命行执行此操作,请指定;shut do mn/r/te下面是几个错误消息示例:例如:Zw Create Key提供完全绝对路径:DRIVER_ISOLATION_VIOLATION:cdrivernarex:Registryoperationsshouldnotuseabsolutepaths.Detectedcreation of un isolated registry key Registry Va chine SYSTE H例如:Zw Create Key提供与句柄相对的路径.而此句柄并非来自已获批的API的:DRIVER ISOLATION_VIOLATION: driver nane:Registry operations should only use key handles returned fron hDFor MDH APIS.Detected creation of un isolated registry key REGISTRY ACHINE SYSTEM S one Key That Should Not Exist请考虑后用带有DV驱动程序隔离检查的设各基础功能测试,帮助及早捕获驱动程序隔离违规行为,Api ValidatorApi Validator工具用于验证二进制文件调用的API是否对Windows驱动程序是有效的。如果二进制文件调用的API在Windows驱动程序的有效API集之外, 此工具就会返回错误。此工具是Windows 10版WDK的一部分,Api Validator用于验证驱动程序是否支持API分层, 这是Windows驱动程序的要求之一。有关完整的要求列表,请参阅Windows驱动程序入门。在VisualStudio中运行Api Validator如果驱动程序项目的^目标平台 属性设置为Windows驱动程序.VisualStudio就会自动运行Api Validator作为生成后步骤。若要查看Api Validator显示的所有满息, 请依次转到 工具**选项“>“项目和解决方案”>“生成井运行^, 井将 MSBuild项目生成输出详细程度 设置为“详细, 从命命行生成时, 请将开关/v:detailed或/v:diag添加到生成命令以提高详细级别。对于umd f 2_fx 2驱动程序示例, API验证错误如下所示:
Marning1warning:APIDecodePointerinkernel32.dllisnotsupported.osrusbfx2un.dllcallsthisAPI,C: ProgramFiles(x 86) windows kits lay src usb u rdf 2_fx 2 driver Api validator.exeosrusbfx2umMar ning 2warning:API Disable Thread Ll brary Calls in kernel 32.dll is not supported, osrusbfx2un.dll callsthis API.C:A Pro gran Files(x 85) Mind ows Kits 1B src usb undf 2_fx 2 driver Api Validator.exeosrusbfx2unMarning3warning:APIEncedePointerInkernel32.dllisnotsupported, osrusbfx2um.dll calls this API,C: ProgramFiles(x 86) windows Kits ie s re usb Au rdf 2_fx2A driver Api validator.exeosrusbfxzunMarning4warning:APIGetCurrentPracessIdinkernel32.dllisnotsupported.osrusbfx2un.dllcallsthisAPI, C: Program F1les(x 86) windows kits i 0 s re usb u rdf 2_fx2A driver Api v all dator.exeosrusbfx2umMarning5Marning:APIGetCurrentThreadIdinkernel32.dllisnotsupported.osrusbfxzun.dllcallsthisAPI, C: Pro gran Files(x 86) WIndows Kits ib src usb undf 2_fx 2 driver Api validator.exeosrusbfx2unNarning6warning:APIGetsystemTineasFileTineinkernel32.dllisnotsupported.osrusbfx2un.dllcallsthis API.C: ProgramFiles(x 86) Windows Kits ley src usb umd f 2_fx 2 driver Api validator.exeosrusbfx2umMarning7Marning:APIIsDebuggerPresentinkerne132.d11isnotsupported.osrusbfx2um, dll calls thisAPI,c: Pro gran Files(x 85) Mind ows Kits 1e srcx usb undf 2_fx 2 driver Api validator.exeosrusbfx2umMar ning 8warning:API Is Processor Feature Present in kerne 132.d111s not supported, osrusbfx2um.d 11 callsthis aPI,C:A Pro gran Files(x 86) Mind ows Kits 1e srcX usb unc lf 2_fx 2 driver Api validator, exeosrusbfx2unNarning9warning:APIQueryPerformanceCounterinkerne132.dllisnotsupported.osrusbfx2un.dllcallsthis API, c:A Program F1les(x 86) W windows Kits 10 src t usb undf 2_fx 2 driver Api validator.exeosrusbfx2umError 18errorHSB 3721:The command C:1Progran Files(x 85] Windows Kits 18ybinyx 64 Api Validator.exe”-Driver Package Path: C: Pro gran Files(x 86) Windows kits 18 src A usb undf 2_fx2ADebugW ·Supported Api Xml Files:“C:A Pro gran Files(x 86) AM indows Kits 1e build universal Do1s x 86 Universal DD is.x nl”-Api Extractor Exe Path:*c: Pro gran Files(x a 6) Windows Kits 18 bin yx 64* exited with code-1.C:A ProgramFiles(x 86) Mind ows Kits 10 build MindowsDriver.comon, targets 15315osrusbfx2um修复验证错误1.如果已将旧的桌面UMD F驱动程序项目切换为Windows驱动程序, 请验证在生成二进制文件时是否添加了正确的库。选择并按住(或右键单击)项目,然后选择属性。依次转到*链接器 ->“输入,其他依赖项应包含:若要查看针对One Core SKU的其他链接器选项, 请参阅针对One Core生成。2.一次删除替换一个不允许的API调用, 并重新运行此工具, 直到没有错误。3.在某些情况下, 可以使用仅用于桌面的DDI参考页列出的备用DDI替换这些调用。如果没有适合的替换项, 可能必须编写解决方法代码。如果需要, 可以从WDK中的驱动程序模板开始编写新的Windows驱动Apivalidation:Error:FlexL1nkTest.oxehasadependencyon'wtsap132.d111kTSEnunerateSesstonsw’butisApivalidatton:Error:FlexLinkTest.exehasadependencyon'wtsapi32.dll!wTsFreeHemorybutismissing:也可以从命令提示符运行Ap validator exe。在WDK安装中, 转到CA ProgramFiles(x 85) WindowsKits 10 bin arch>和CN ProgramFiles(x 86) Windows Kits 10 build universal DDls arch*。·Api Validator需要以下文件:Api Validator exe、A it static.exe、Microsoft.Kits.Drivers Api Validator dIl和·Universal DD is.xml必须与要验证的二进制文件体系结构相匹配(例如, 对于x 64驱动程序, 使用x 64Api validator.exe-DriverPackagePath:cdriverfolderpaths-SupportedApixmlFiles:(path to XML files例如.若要验证WDK中的 活动 示例调用的API, 应首先在VisualStudio中生成示例。然后, 打开命命提示符,并转到包含此工具的目录(例如, C: ProgramFiles(x 86 MInde us Kits 10 bin x 64) .输入以下命令api validator.exe-Driver Package Path: C: Proe raw Files(xB 6) ww in do us Kits 1e src y usb undf 2 Lfxzpebug :SupportedApixnlFiles:e: ProgranFiles(x86)windousKits 1e bulldyuniversalDDIs x64 UniversalDOIs.anl”Api validator.exe:warning:API Decode Pol nter in kernel 32.dll is not supported.osrusbfx2un.dll calls thisApi validator, exe:warning:API Disable Thread Library calls in kerne 132.dll is not supported, osrusbfx2un.dllApi validator.exe:Warning:API Encode Pointer in kernel 32.dll is not supported, osrusbfx2un.dli calls thisApi validator.exe:Warning:API Get Current ProcessId in kernel 32.dll is not supported.osrusbfx2un.d1l callsApi validator.exe:Warning:API Get Current ThreadId in kernel 32.dll is not sup parted.osrusbfx2un.dll callsApi validator.exe:warning:API Get System Tine As File Tine in kernel 32.dll is not supported, osrusbfx2un.dllApi validator.exe:warning:API Is Debugger Present in kernel 32.dll is not supported.osrusbfx2um.dll callsApi validator.exe:warning:API Is Processor Feature Present in kerne 132.dll is not supported.osrusbfx2un.dliApi validator.exe Driver located atC: Pro gran Files(x 86) Windows Kits 10 s re usb u rdf 2_fx 2 Debug is NOT aX Additional Dependencies) ; S(SDK LIBPATH) A One Core UAP.11b程序。如果看到如下所示的错误, 请参阅针对One Core生成中的指南。n is sing:IsApi Set In pIe mented( ext-ms-win-session-wts api 32-11-1-e )IsAp1SetTr plemented( ext-ns-win-session-wt sap 132-11-1-e*)Api validation:NOT all binaries are Universal从命爷提示符运行Api Validator重要说明:Universal DDs.xml aUniversal DDL xml)·Api Validator一次只测试一个体系结构·有关其他信息, 请参阅下面的 已知Api Validator问题”使用以下语法:cntaintnesupporedAPI sTOrM in dods a rives)此命令将生成以下输出:API.calls this API.API,this API,this API.calls this API.this API,calls this API.Api validator.exe:Warning:API Query Per forcalls this API,Universal Driver排除Api Validator故障如果Api Validator exe输出格式不正确错误(如下所示) :Errorf sle types,osrusbfx2um请使用此解决方法:1.打开“项目 属性,导航到 常规 ,将 输出目录“重命名为以下内容:2.重新生成解决方案。已知Api Validator问题·Api Validator不能在ARM 64上运行, 因为A it Static不能在ARM 64上运行。·ARM 64二进制文件可以在x 64计算机上测试, 但不能在x 86计算机上测试。·Api Validator可以在x 86上运行, 以测试x 85二进制文件和ARM二进制文件。·Api Validator可以在x 64上运行, 以测试x 85、x 54、ARM和ARM 64二进制文件。nce Counter in kernel 32.d11isnotsupparted.osrusbfx2un.dllerror:A it static outputfile has incorrect for wa tar analysis run on incorrectCixProgranF1les(x 86) A WIndows Kits ie srcX usb undf 2_fx 2 driver Api validator.exe$(5olutionD1r) s(Platform) s(Configuration Name) 、
Cntents
开发驱动程序
Windws驱动程序
Windws驱动程序入门
DCH设计原则和最佳做法
驱动程序包隔离
API分层
构建Windws驱动程序
验证Windws驱动程序
符合DCH的驱动程序包示例
调试Windws驱动程序
生成驱动程序
创建新设备功能驱动程序
创建新的筛选器驱动程序
设备筛选器驱动程序排序
创建新的软件驱动程序
创建新的基元驱动程序
从现有源文件创建驱动程序
使用WDK生成驱动程序
针对ne Cre进行构建
为不同版本的Windws生成驱动程序
使用WDK生成ARM 64驱动程序
使用企业版WDK 10
在实验室中安装WDK 8.1生成环境
使用含用户模式驱动程序和桌面应用的Micrsft C运行时
避免自定义生成环境内出现浮点错误
驱动程序项目的计数器清单预处理器属性
驱动程序项目的驱动程序模型设置属性
驱动程序项目的消息编译器属性
驱动程序项目的M F编译器属性
驱动程序项目的Stampin f属性
将WDK 8.1项目转换为WDK 10
适用于Windws 10的驱动程序融合模型
驱动程序参考页上的 目标平台
使用代码分析和验证工具分析驱动程序
准备一台用于手动部署驱动程序的计算机
预配计算机时会出现什么情况(WDK 8.1)
预配计算机时会出现什么情况(WDK 8.0)
驱动程序部署、测试和调试配置故障除
创建驱动程序包
创建设备元数据包
为驱动程序签名
为驱动程序签名
在开发和测试期间为驱动程序签名
为驱动程序签名以便公开发布
驱动程序签名属性
部署驱动程序
将驱动程序部署到测试计算机
驱动程序包项目的部署属性
驱动程序包项目的驱动程序验证程序属性
驱动程序包项目的KM DF验证程序属性
驱动程序包项目的UMD F验证程序属性
驱动程序包项目的Inf2Cat属性
如何创建自定义的驱动程序安装脚本
在Windws 10移动版上安装驱动程序
调试驱动程序
测试驱动程序
测试驱动程序
开发期间测试驱动程序的相关技巧
如何使用VisualStudi在运行时测试驱动程序
如何在WDK 8.1中运行HCK测试套件
如何选择和配置设备基础功能测试
如何测试驱动程序包
如何读取驱动程序测试结果日志
如何在运行时通过命令提示符测试驱动程序
如何使用 驱动程