ࡱ> ` ;bjbjss 5Gu%pppp```8,Ԅ̇:=Hd4$?hQ9=pp3I^p Ȅ +5y`{^>._02ٗbx":;^dt d!Bct !cpppppp Introduction to the WDF UserMode Driver Framework May 16, 2006 Abstract The Windows Driver Foundation (WDF) is Microsofts next-generation driver model. WDF includes frameworks to support both user-mode and kernel-mode drivers, along with driver testing and verification tools. The user-mode driver framework (UMDF) component of WDF enables drivers for some types of devices to run in user mode instead of kernel mode. This paper provides an overview of the user-mode driver framework architecture, describes the advantages of user-mode drivers, and includes guidelines for determining whether to write a user-mode or kernel-mode driver. This information applies for the following operating systems: Microsoft Windows Vista"! Microsoft Windows XP The current version of this paper is maintained on the Web at:  HYPERLINK "http://www.microsoft.com/whdc/driver/wdf/UMDF_Intro.mspx" http://www.microsoft.com/whdc/driver/wdf/UMDF_Intro.mspx References and resources discussed here are listed at the end of this paper. Contents  TOC \o "1-3" \h \z \u  HYPERLINK \l "_Toc134433431" Introduction  PAGEREF _Toc134433431 \h 3  HYPERLINK \l "_Toc134433432" Advantages of Writing User-Mode WDF Drivers  PAGEREF _Toc134433432 \h 3  HYPERLINK \l "_Toc134433433" Devices Supported in User Mode  PAGEREF _Toc134433433 \h 4  HYPERLINK \l "_Toc134433434" Overview of UMDF  PAGEREF _Toc134433434 \h 5  HYPERLINK \l "_Toc134433435" UMDF Objects and Interfaces  PAGEREF _Toc134433435 \h 5  HYPERLINK \l "_Toc134433436" Operation and Defaults  PAGEREF _Toc134433436 \h 6  HYPERLINK \l "_Toc134433437" User-Mode WDF Architecture  PAGEREF _Toc134433437 \h 7  HYPERLINK \l "_Toc134433438" User-Mode WDF Driver Features  PAGEREF _Toc134433438 \h 9  HYPERLINK \l "_Toc134433439" Required Driver Functionality  PAGEREF _Toc134433439 \h 9  HYPERLINK \l "_Toc134433440" Handling I/O Requests  PAGEREF _Toc134433440 \h 9  HYPERLINK \l "_Toc134433441" Build, Test, and Debug  PAGEREF _Toc134433441 \h 10  HYPERLINK \l "_Toc134433442" Installation and Configuration  PAGEREF _Toc134433442 \h 10  HYPERLINK \l "_Toc134433443" Versioning  PAGEREF _Toc134433443 \h 11  HYPERLINK \l "_Toc134433444" Summary  PAGEREF _Toc134433444 \h 11  HYPERLINK \l "_Toc134433445" Resources  PAGEREF _Toc134433445 \h 11  Disclaimer This is a preliminary document and may be changed substantially prior to final commercial release of the software described herein. The information contained in this document represents the current view of Microsoft Corporation on the issues discussed as of the date of publication. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information presented after the date of publication. This White Paper is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS DOCUMENT. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, email address, logo, person, place or event is intended or should be inferred. 2006 Microsoft Corporation. All rights reserved. Microsoft, Visual Studio, Win32, Windows, and Windows Vista are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. All other trademarks are property of their respective owners. Introduction Most drivers run in Microsoft Windows kernel mode, where they have complete access to the system address space and to internal system structures. Such access comes at a price: a malicious or badly coded kernel-mode driver can cause problems that affect other drivers or the system itself and eventually crash the machine. Drivers that run in user mode, however, have access only to the user address space and therefore pose a much lower risk to system security and stability than kernel-mode drivers. For this reason, Microsofts next-generation driver model, the Windows Driver Foundation (WDF), contains a framework for the creation of user-mode drivers. The user-mode driver framework (UMDF) provides a unified model that can work across device classes. It integrates the installation and management of these devices with standard operating system facilities, such as Plug and Play and power management. UMDF is designed to support protocol device classes such as cameras and portable music players. Microsoft believes that moving drivers for such devices into user mode can help to simplify the drivers and improve the overall stability of the operating system. UMDF is based on the same conceptual driver programming model as the kernel-mode driver framework (KMDF) that is also part of WDF. However, the two frameworks implement the model with different components, device-driver interfaces (DDIs), and data structures. In addition to UMDF, WDF provides enhanced debugging and tracing tools and serviceability support for user-mode drivers. Advantages of Writing User-Mode WDF Drivers User-mode WDF drivers (also called UMDF drivers) are Plug and Play drivers that support protocol-based or serial busbased devices. They handle the same types of I/O requests as kernel-mode drivers and are installed by INF files, just as kernel-mode drivers are. User-mode WDF drivers have numerous advantages over kernel-mode drivers: Simpler driver environment Greater stability Greater security Use of the Microsoft Win32 API Debugging with a user-mode debugger Programming in C++ Rapid code generation Comparable performance to kernel mode Driver Environment. User-mode drivers operate in a much simpler environment than kernel-mode drivers. Kernel-mode drivers must be coded to avoid problems related to interrupt request level (IRQL), page faults, and thread context, just to name a few. In user mode, however, these issues do not exist. User-mode drivers always run in a different thread from the requesting process and can always take page faults. To take advantage of this environment, Microsoft has developed device-specific user-mode driver models for such devices as scanners, printers, cameras, and mobile devices and has supported user-mode drivers for several releases of Windows. However, these models do not work with the Plug and Play installation mechanism. UMDF integrates support for Plug and Play and power management, thus enabling such drivers to participate fully in system-wide operations. Greater Stability. User-mode drivers contribute to greater operating system stability because they have access only to the address space of the process in which they are running. Therefore, a corrupt or buggy driver might cause its device to be inoperable, but it is much less likely to cause system-wide problems. A corrupt kernel-mode driver has access to the system address space and calls kernel-mode functions that are exposed by the operating system, which directly manipulate important system structures. Errors in a kernel-mode driver can corrupt these structures and possibly cause the system to crash. Greater Security. User-mode drivers run in a much more secure environment, primarily because they do not have access to the system address space. Therefore, the chance that a malicious application might access another users data is slim. In addition, user-mode drivers are much less likely to cause a denial-of-service attack by hanging or crashing the system. At most, the driver process itself might become corrupted. Win32 API. Most applications programmers are familiar with the Win32 API. User-mode WDF drivers call the Win32 API instead of calling kernel-mode functions. The Win32 API provides access to some services that are not available in kernel mode, such as cryptography. Because the Win32 API is a user-mode component, the operating system performs additional security and verification checks before making changes that are requested by a user-mode caller. User-Mode Debuggers. User-mode WDF drivers can be debugged by using a user-mode debugger instead of a kernel-mode debugger. Debugging and driver development in user mode can be faster because an error affects only the current process, not the entire system, thus reducing the time that is spent rebooting. In addition, user-mode debugging requires only a single machine, whereas kernel-mode debugging requires both a host machine and a target machine. WDF includes several debugger extensions for use with user-mode drivers. Programming in C++. UMDF is designed for writing drivers that use the object-oriented features of C++. Rapid Code Generation. UMDF is based on a subset of the Component Object Model (COM). Driver writers can use numerous COM tools, such as the active template library (ATL), to quickly generate code. Comparable Performance to Kernel Mode. For the types of devices that UMDF drivers can support, I/O bandwidth is a greater issue than internal driver performance. For such devices, UMDF drivers are comparable in performance to kernel-mode WDF drivers. Devices Supported in User Mode UMDF supports the development of drivers for protocol-based or serial busbased devices, such as USB devices and network-connected devices. For example, drivers for the following types of devices can be written in user mode: Portable storage devices, such as PDAs and cell phones Portable media players USB bulk transfer devices Auxiliary display/video devices The device can be directly connected, connected on the network, or connected via a wireless protocol such as Bluetooth. User-mode drivers can support 32-bit or 64-bit devices for any Windows hardware platform and can be distributed on Windows Update. UMDF is currently supported for Microsoft Windows Vista"! and Windows XP. The preliminary UMDF release on the User-Mode Driver Framework Beta1 Developer Update includes the following sample UMDF drivers: Skeleton, a minimal driver that is intended for use as a template for driver development Echo, a simple software-only driver that shows the use of a serial I/O queue USB/FX2_Driver and USB/Echo_driver, which are function drivers for the USB-FX2 board that was designed by OSR USB/Filter, which is a filter driver for the USB-FX2 device stack Drivers that require the following cannot be written as UMDF drivers; they must be written as kernel-mode drivers: Handling interrupts Direct access to the hardware, such as direct memory access (DMA) Strict timing loops Use of nonpaged pool or other resources that are reserved for kernel mode Overview of UMDF UMDF performs two important tasks for a driver: Defining a set of objects and interfaces to represent common driver constructs Accepting all I/O requests that are targeted to the device and calling the driver to handle corresponding events UMDF drivers are object oriented and event driven. The driver and UMDF create instances of objects that are required to support the drivers device. The driver implements event callback interfaces that respond to events that affect these objects. UMDF Objects and Interfaces UMDF defines objects to represent the following: Driver Device I/O queue File I/O request I/O target Memory For each type of object, UMDF defines one or more interfaces through which to manipulate instances of the object. The interfaces provide methods and properties. Methods define actions that can be taken on behalf of the object and properties set and get the characteristics of the object. Some interfaces are implemented by UMDF and others are implemented by the driver. The UMDF objects and interfaces are based on COM. Microsoft chose COM as a basis for UMDF for several reasons: COM is familiar to many applications programmers. C++ is the preferred language for writing COM applications. COM interfaces enable logical groupings of functions, so that the DDI is easy to understand and navigate. Using COM enables the DDI to evolve without requiring existing driver dynamic-link libraries (DLLs) to be recompiled. Numerous tools, including Microsoft Visual Studio and ATL, support COM-based applications and objects. UMDF uses only a small subset of COM; it does not depend on the entire COM infrastructure and run-time library. Instead, it uses only the query-interface and reference-counting features. Every UMDF interface derives from IUnknown, and therefore supports the QueryInterface, AddRef, and Release methods by default. The AddRef and Release methods manage object lifetime. The QueryInterface method enables other components to determine which interfaces the driver supports. UMDF implements interfaces that are named IWDFXxx. The driver calls methods on these interfaces to perform operations on its objects, such as creating a device object or getting a request from an I/O queue. For example, UMDF implements the IWDFDriver interface, and the driver calls methods in this interface to create a device object. The names of the driver-implemented callback interfaces are in the form IObjectAction, where Object identifies the object to which the interface applies and Action indicates what the interface does. For example, one such interface is IQueueCallbackRead, which contains methods that are called when a queue dispatches a read request. The driver implements callback interfaces to provide device-specific responses to events. When a Plug and Play, power management, or I/O request arrives, UMDF calls methods in the drivers callback interfaces to handle the associated events. For example, when UMDF receives a read request, it calls methods in the drivers IQueueCallbackRead interface. UMDF provides any synchronization that is required across driver callbacks. By default, UMDF synchronizes at device object level; that is, it does not concurrently call the event callback methods at or below the device object level. A driver can override this default by requesting no synchronization. Operation and Defaults A fundamental goal of the overall WDF model is to provide intelligent defaults, so that driver developers can focus on their device hardware and avoid writing code to perform tasks that are common to most drivers. Instead, that code is built into the framework, thus making vendor-written drivers smaller, ensuring greater code reuse, and providing for global bug fixes by Microsoft. To achieve this goal, UMDF is designed to work with drivers on an opt-in basis. A UMDF driver includes callback interfaces for only the events that affect its device. For example, some devices require intervention immediately after they are turned on and immediately before they are turned off. The driver for such a device can implement a callback interface that provides methods to be called at those times. If the device does not require such intervention, its driver does not implement the interface. Plug and Play and Power Management. The opt-in approach is particularly valuable for Plug and Play and power management features. Within WDF as a whole, Plug and Play and power management are implemented as a state machine. (Both UMDF and the KMDF use the same implementation of the state machine.) At a given state, a predetermined set of events is valid for each type of object and the framework invokes the drivers callbacks for these events in a defined order. Thus, a driver can assume that both the system and its device are in a particular state whenever it is called to perform a Plug and Play or power management action. The complicated logic that tracks system and device state is thus incorporated into the framework, not into the driver. This approach vastly reduces the amount of decision-making that is required in the driver and eliminates the need to perform the same task in numerous places. Instead, the framework defines a state-related event and the driver supplies a callback interface. The driver includes code to handle only those events for which its device requires device-specific support. All other events can be handled by framework defaults. Queue Management. Plug and Play and power management support are integrated with queue management. A WDF driver can configure power management support for its I/O queues so that the framework stops dispatching requests while the device is in a low-power state and resumes dispatching after the device has returned to the operational state. Similarly, if an I/O request arrives while the device is in a low-power state, the framework can automatically power up the device. User-Mode WDF Architecture A UMDF driver runs in a driver host process that also hosts UMDF and a run-time environment. Each such driver operates as part of a stack of drivers that manage a device. The user-mode drivers are loaded above the kernel-mode drivers at the top of the stack. Because user-mode components do not have access to the system address space where the system and kernel-mode drivers maintain I/O requests and other shared data, the UMDF architecture includes components that communicate between kernel mode and user mode. Figure 1 shows the overall architecture of the UMDF driver model.  Figure 1. User-Mode WDF Driver Architecture Figure 1 shows two device stacks that service two different devices. Each device stack includes a UMDF driver that runs in its own driver host process. Figure 1 includes the following components, which are described according to the typical flow of an I/O request: Applications. The applications are clients of the drivers. These applications are user-mode processes that issue I/O requests through the Win32 API. The Win32 API calls I/O routines in the Windows kernel. Windows Kernel. The Windows kernel creates I/O request packets (IRPs) to represent the requests and forwards them to the top of the kernel-mode device stack for the target device. Reflector. The reflector is a kernel-mode WDM filter driver that is installed at the top of the kernel-mode device stack for each device that is managed by a UMDF driver. The reflector manages communication between the kernel-mode components and the user-mode driver host process. The reflector forwards I/O, power, and Plug and Play messages from the operating system to the driver host process, thus enabling user-mode drivers to respond to I/O requests and to participate in Plug and Play device installation, enumeration, and management. The reflector also monitors the driver host process to ensure that it responds properly to messages and completes critical operations in a timely manner, thus helping to prevent driver and application hangs. Microsoft provides the reflector. Host Process. The host process is the process in which the user-mode driver runs. It is separate from the application process and the driver manager. It runs in the security credentials of a LocalService account, although it is not a Windows service. The host process contains the user-mode device stack for the device. The device stack is visible to all applications across the system. Each instance of a device has its own device stack. Currently, each instance has a separate host process, too. The host process includes the following components: The UMDF driver is an in-process COM component that controls the hardware from user mode. An independent hardware vendor (IHV) supplies the UMDF driver. UMDF exposes the user-mode DDI. UMDF is a DLL of COM-style objects that support the presentation, flow, and management of I/O and Plug and Play requests to the driver. The run-time environment dispatches I/O requests, loads the driver, constructs and destroys the user-mode device stack, manages a user-mode thread pool, and handles messages from the reflector and the driver manager. The host process is a child process of the driver manager. Driver Manager. The driver manager creates and shuts down the host processes and maintains status information about them. It also responds to messages from the reflector. The driver manager runs as a Windows service and is started during installation of the first device that is managed by a UMDF driver. The driver manager must be running all the time that any device that is controlled by a UMDF driver is installed on the system. Microsoft provides the driver manager. Kernel-Mode Drivers. Additional kernel-mode drivers can service each device. Either Microsoft or an IHV can supply these drivers. User-Mode WDF Driver Features User-mode WDF drivers can call methods in UMDF and can use the Win32 API and other Windows user-mode features. Required Driver Functionality Every UMDF driver must do the following: Support DLL exports that are required by COM Implement the IDriverEntry interface on the driver class Implement the IClassFactory interface UMDF drivers, like UMDF itself, are implemented as in-process COM servers. Every UMDF driver must support DLL exports that are required by the COM run-time environment. These exports include DllGetClassObject, DllRegisterServer, and DllUnregisterServer. In addition, every UMDF driver must implement the IDriverEntry interface on the driver class. This interface includes methods that initialize and uninitialize the driver and perform other tasks that are required when the device is added to the system. UMDF calls these methods when the driver is loaded or unloaded and when the Plug and Play manager enumerates one of the drivers devices. Drivers must also implement the IClassFactory interface, so that UMDF can create an instance of the driver callback object. Handling I/O Requests Callers use the Win32 API to send I/O requests to devices that are managed by UMDF drivers. The Win32 API calls the appropriate kernel-mode I/O routine, and the kernel-mode I/O manager creates an IRP and sends this IRP to the driver at the top of the kernel-mode device stack for the target device. For a device that is managed by a UMDF driver, the reflector is the driver at the top of the kernel-mode device stack. The reflector forwards the request to the user-mode driver host process, in which UMDF and the driver run. UMDF interprets the request and calls methods in the drivers event callback interfaces. Depending on the type of I/O that the device supports, the driver might handle the request immediately or it might queue the request to handle later. UMDF provides configurable I/O queue objects that a driver can instantiate. The driver specifies which types of requests to place in each queue and how to dispatch those requests. Each queue can hold one or more types of requests. UMDF queues and dispatches requests according to the drivers specifications: sequentially (one at a time), in parallel (as soon as they arrive), or manually (at the drivers explicit request). If Plug and Play or power management events affect queuing, UMDF can start, stop, or resume queuing as appropriate, depending on how the driver configured the queue. The driver provides a callback interface for each type of request it can handle. To dispatch a request, UMDF calls a method in the corresponding callback interface. For example, to dispatch a read request, UMDF calls the OnRead method of the drivers IQueueCallbackRead interface. UMDF handles locking for the I/O queues and can cancel queued requests without requiring driver intervention. By default, requests that are in a queue can be canceled, but requests that have been dispatched to a driver cannot be canceled. Drivers that use these defaults typically require little if any cancellation code. Drivers can, however, override these defaults by making individual requests cancelable and implementing a cancellation callback interface. Build, Test, and Debug Like KMDF drivers, UMDF drivers are built with the Windows Driver Kit (WDK). The WDK includes the libraries and header files that are required to build a UMDF driver, along with sample code and build scripts. The WDK also includes debugger extensions that are designed for use with UMDF drivers. The debugger extensions work with CDB, NTSD, and WinDbg. User-mode WDF drivers can be debugged in either user mode or kernel mode. Debugging a user-mode driver is similar to debugging a service. In addition, the WDK includes PREfast, a static analysis tool that examines code paths on a per-function basis. PREfast can find logic and usage errors in a driver at compile time. PREfast can be used on both kernel-mode and user-mode drivers. Vendor-supplied user-mode driver code can use Event Tracing for Windows (ETW) to generate a trace log of driver events. The logs can be viewed using the tracing tools provided with the WDK. The user-mode components supplied by Microsoft start trace sessions that record their activities and note such events as driver hangs, time-outs, and failures. UMDF has integrated verification code that is always enabled. If a driver uses DDIs incorrectly or passes incorrect parameters, the verifier saves a memory dump in the system log file directory and optionally creates a Windows error report. The trace log files and error reports can optionally be sent to Microsofts Windows Error Reporting (WER) facility. WER captures software crash data and supports end-user reporting of crash information. The information collected through WER is accessible to vendors so that they can analyze problems and respond directly to their customers. Installation and Configuration UMDF drivers are installed using INF files, in the same way as kernel-mode drivers. The INF for a UMDF driver installs the driver and a service and includes directives to install any additional user-mode and kernel-mode components that the driver requires. Microsoft provides a coinstaller that is invoked when the INF for the device is processed. The coinstaller starts the driver manager if it is not already running. User-mode driver installation must not require a reboot of the system. Windows Logo Program and driver signing requirements for UMDF drivers are under development. Versioning UMDF supports versioning, so that a driver binary can run with the same major version of UMDF for which the driver was designed, tested, and released. Updates to UMDF or the operating system do not require updates to the driver. Microsoft is responsible for ensuring consistent behavior across releases. Summary Microsoft urges vendors of cameras, portable media players, and similar devices to develop UMDF drivers instead of kernel-mode drivers. UMDF drivers are easier to develop, provide comparable performance, and contribute to greater system stability. UMDF drivers are Plug and Play drivers for protocol- and serial busbased devices. Their devices appear in Device Manager. Such drivers can support 32bit or 64bit devices for any Windows hardware platform and can be distributed on Windows Update. UMDF and its drivers are based on COM, thus enabling developers to use existing development tools. UMDF provides an object-oriented, event-driven interface. The User-Mode Driver Framework Beta1 Developer Update includes a prerelease version of this framework. Resources Windows Driver Foundation (WDF) on the WHDC Web site Additional WDF presentations and white papers will be posted on this site as they become available.  HYPERLINK "http://www.microsoft.com/whdc/driver/wdf/default.mspx" http://www.microsoft.com/whdc/driver/wdf/default.mspx Current White Papers Introduction to the Windows Driver Foundation  HYPERLINK "http://www.microsoft.com/whdc/driver/wdf/wdf-intro.mspx" http://www.microsoft.com/whdc/driver/wdf/wdf-intro.mspx Architecture of the Windows Driver Foundation  HYPERLINK "http://www.microsoft.com/whdc/driver/wdf/wdf-arch.mspx" http://www.microsoft.com/whdc/driver/wdf/wdf-arch.mspx Architecture of the User-Mode Driver Framework HYPERLINK "http://www.microsoft.com/whdc/driver/wdf/UMDF-arch.mspx"http://www.microsoft.com/whdc/driver/wdf/umdf-arch.mspx Sample Drivers for the User-Mode Driver Framework HYPERLINK "http://www.microsoft.com/whdc/driver/wdf/umdf_samp.mspx"http://www.microsoft.com/whdc/driver/wdf/umdf-samp.mspx WDF Beta Program See the Windows Driver Foundation beta program invitation at  HYPERLINK "http://www.microsoft.com/whdc/driver/wdf/beta.mspx" http://www.microsoft.com/whdc/driver/wdf/beta.mspx A preview of UMDF is available in the User-Mode Driver Framework Beta1 Developer Update in the WinHEC 2006 conference materials. Installation instructions and additional information are provided on the CD. Windows Driver Kit  HYPERLINK "http://www.microsoft.com/whdc/driver/WDK/default.mspx" http://www.microsoft.com/whdc/driver/WDK/default.mspx Windows Error Reporting Windows Quality Online Service  HYPERLINK "https://winqual.microsoft.com" https://winqual.microsoft.com Winqual and Driver Maintenance: Overview  HYPERLINK "http://www.microsoft.com/whdc/maintain/default.mspx" http://www.microsoft.com/whdc/maintain/default.mspx Windows Logo Program and Driver Signing  HYPERLINK "http://www.microsoft.com/whdc/winlogo/default.mspx" )23? : 1 2 3 y z { # $ % & B C D E Q Ȼ}tmtY}t'jhh#>*B*Uph hhhh0J/jhh0J/Ujhh%Uhh%0J/'jhh!)>*B*UphhhD0J/jhhD0J/U hh- hh' hh[k hhj hh hhD hh@ hh%"3BK   s BL i}cef!0gd[k$.gd0 5:Q R S m n o p q r s t u  !"<=>ǴǫǫǴǫnǫ`jThh#U'jhh#>*B*UphjZhh#U'jhh#>*B*Uph hhhh0J/$hhCJOJPJQJ^JaJjhh0J/UhhE j`hh#UjhhUhh%>?@ABCD`abcstuꞐ|njHhh#U'jhh#>*B*UphjNhh#Uhh'jhh#>*B*Uph hhhh0J/$hhCJOJPJQJ^JaJjhh0J/UjhhUhhE (*+,FGHIJKLMNjklmͲޗՐ|nޗՐZ'jhh#>*B*Uphj<hh#U'jhh#>*B*Uph hh$hhCJOJPJQJ^JaJhhE jBhh#UjhhUhhhh0J/jhh0J/U'jhh#>*B*Uph#   '()*GHIcdefghijkǴǫǫǴǫnǫ`j* hh#U'j hh#>*B*Uphj0 hh#U'jhh#>*B*Uph hhhh0J/$hhCJOJPJQJ^JaJjhh0J/UhhE j6hh#UjhhUhh%9:;<Z[\vwxz{|}~Ꞑ|nj hh#U'j hh#>*B*Uphj$ hh#Uhh'j hh#>*B*Uph hhhh0J/$hhCJOJPJQJ^JaJjhh0J/UjhhUhhE (4567@ͲޗՐ|nޗՐZ'jhh#>*B*Uphjhh#U'j hh#>*B*Uph hh$hhCJOJPJQJ^JaJhhE j hh#UjhhUhhhh0J/jhh0J/U'j hh#>*B*Uph#@AB\]^`abcdrw376:J N !2!R!U!V!{""######%Ǵxxphh%5 hh- hh~ hh' hh,( hha& hhj hh%jhh%U$hhCJOJPJQJ^JaJjhh0J/UhhE j hh#UjhhUhh,fq~'(opVW36; !2"0gd'%$$2"M"_"p"""""##$n&(x*<,J..y/u00u111111w2$gdE gd'0gd'C%%n&v&w&& ((((x**,,<,A,B,F,G,P,w,z,U-]-J.].^.b.....y////////////-010000000223$3,344 4 4&4n44b5r56666Ű hhdD hh+ hh[k hha& hh,(hh,(5 hh-hh-5hh%5 hh% hhjEw2&4,55>6666b7v77788(8[8899:0:b:i:p:z::::$Cgdj0gd-66'7)77777#8'8(8,8`8c88888993949F9G9^9b9990:4:::::;;f<j<=======>8><>??:?H?J?P?V?]?v?|?????@@*@3@9@=@@@@@@ AAAAAhh%6hh~6hh%56 hh,(hh%5 hha& hh% hhjL:::<<<<X==6>8>@`ABD=ETEFHKKhMBO]OaQQQQR&0gd'0gd-CAAAAABJB\BuB~BGCKCCCCDDD1D9DgDkDFFFF)G+GHHHHHHIIKLhMnMoMyM_OaOOOOOOOQ QQQQQQQ4R6RRRR hhk1hh%0J'jhh%Uhh%h~Iphha&5 hh,( hhj hha&hh%5hh%6hh~6 hh%>RRSSSSSS]ThTTTUULW`WoWpWtWuW}WYY!Z%Z.Z2ZNZRZ[[[[]]^]f]v]z]]]]]]]^,^-^:^^^^^1_:_X_d__________𵭵 hh~hh+5 hh+hh%5 hhf hh hhk1 hha& hhjhha&0JF hh%hh%0JFARS^ToWaYY.ZZ[[[]I^g^^^_J____bb'ef h&ijgd+C0gd-_` `)`i`z`|```````````jasaaa-bNb[bbbccc ddddddddeeffggthxhhhhhii&i*ijjkkk"kkkkkll'l3lmmmmnmmmLoPoqhh%6hhD)|5 hhD)| hhj hhhh%5 hhf hh% hh~Kj kklmnqqrYss t:uBu;v5w;xExzx[ypyzzz{+|<||(gd+)gdD)|)gd+)(qqrr&r'r7rrrrssssssss t t!t*tPtVtbtftttttuuuuwBwwwwxLx_xexrxxxxx"y#y$yj(hh%Ujhh%U hh' hh' hh hhD)| hh+ hhj hh[0 hhE hh% hhOT<$yYyZypyyyyyyzzzMzNzzzzzzzzz?{@{A{n{ŶŶŶ叆rk^UA^U'j@,hh+>*B*Uphhh+0J/jhh+0J/U hh+'j*hh0 >*B*Uphhh0 0J/jhh0 0J/U3j*hh%>*B*U_HEnHphtHhh%0J/_HEnHtH%jhh%0J/U_HEnHtHhh%_HEnHtH hh%jhh%Uhh%0J/n{o{x{y{z{{{{{{{| |)|*|+|z|{||||||||}}I}X}]}}}~~~N~O~~ƶƯ}vh}_}hh:0J/j.hh_U hh:jhh:U hhj hh%j.hh+Ujhh+U hh+j!-hh0J/UhhD)|0J/hhXz0J/hhXz0J*jhh+0J/Uhh+0J/hhdD0J/%|}}P~h~~v45789:;=>?@ACDEFGIJK)gdD)|(gdD)|()~~~~~~~~~~~?@Atuv23456;<ABGHMPQrs펊~~u~~~hTmHnHujhUhhjhUhhD)|0J/Uj>1hhUjhhD)|U hhD)|je0hh%U hhE hh%0J/j/hh%U hh%jhh%U.http://www.microsoft.com/whdc/winlogo/default.mspx      STYLEREF Title \* MERGEFORMAT Introduction to the WDF User-Mode Driver Framework -  PAGE 2 WinHEC 2006  REF Copyright  2006 Microsoft Corporation. All rights reserved.  KLMNOPȴȴɴٴڴߴ 9:; hh%h%h h3Zhj2hLhU hhhmHnHuhjhUhTmHnHu !"#$%&'()*+,-./0123456789::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[\]^_`abcdefghijklmnopqrsttuvwxyz{|}~µõĵŵƵǵȵɵʵ˵˵̵͵εϵеѵҵӵԵյֵ׵صٵڵ۵ܵݵ޵ߵ  !""#$%&'()*+,-./0123456789:;3 0&P1h/ =!e "e #$% DyK yK rhttp://www.microsoft.com/whdc/driver/wdf/UMDF_Intro.mspx}DyK _Toc134433431}DyK _Toc134433431}DyK _Toc134433432}DyK _Toc134433432}DyK _Toc134433433}DyK _Toc134433433}DyK _Toc134433434}DyK _Toc134433434}DyK _Toc134433435}DyK _Toc134433435}DyK _Toc134433436}DyK _Toc134433436}DyK _Toc134433437}DyK _Toc134433437}DyK _Toc134433438}DyK _Toc134433438}DyK _Toc134433439}DyK _Toc134433439}DyK _Toc134433440}DyK _Toc134433440}DyK _Toc134433441}DyK _Toc134433441}DyK _Toc134433442}DyK _Toc134433442}DyK _Toc134433443}DyK _Toc134433443}DyK _Toc134433444}DyK _Toc134433444}DyK _Toc134433445}DyK _Toc1344334458Dd "FF0  # A"r&u(- @=r&u(-8Of9U3Vx] xSEڞަlD IpUVq-Rn**""lAX"RaAP?7I=M>93oK48Vwtݾ cM{efLc]1680 fy߅1:3_Дum4F<^S¯ #80OJoT7J4TUdrDNz[.aLϭQynD^~CY/yk$+< IVC7K\ZbZٔͳTxpl>Slr|o["uQi2 khN˖hcEry9d՟⮞dģH.K'e2o!"n𓗌wARXNw"| ab5%zy!tc.5%B_ⲟ.Z\fUƙ=缯9<ѿ%h_=Kگ! Db(/;7[N|)T~0/S7ј[2@%?N%9گ,JFAU[ll.xbm!<"q5O;f{6dV*Uj o+\$?ξ_>Wpљڈ>iۯ! n*mGWA!8Uܪ`m#:Q-O md1~ҋP6SFT."ЭV<vz9sz>]pUUG+qiB%Fי:Yrk*:\YV_cRrҵÝ.dh~K8pNz aEâsa|? s:LS9pxKD*k GHPapcsHHBpUN޹)t 256lI|ls`u LOd#vnA@<4'!TN*?x&' o ]G_El$EGT>+knu_/q~A _IL83M?~|?XoX=z_(^Z2״V6by oyZrC!X.gڿI0+OKW6GoU`UCoo QCG_jbOjM\m~ֵVnÊ[Uc#'[/rlas/śV{lo]"hkȶMq[^֎6_H>ZE\Uֶ+e4XU>CO> ihKk\ϷKftB僫7JIWR }|AZ>ύk.2ȋ*SZY]_+8m\ass k]nIlwۃ%#/M $1T V{*nU~e]tSHז]db˭ˊڲjVWˊ`j j.Wf#rܥ?i΍py_ܾɯ6NeX6cS; ʮ|v)IL:F+.xdm,rK®:\$T˓!xq+ԯ9%Vw7<}Fb*Jkz!t(!涺,*nU~0VZJ羼et ?*ixk3ͩg*N='K11뫰 Vc|7}yژR}566Gm}$>G /s_z>Ba Ђk˟Vs_?W|pVkJ/}|ܺUG@9on8$>(1(iHdз wmݍTqo\$Yn9x@UsYE#YI#ұf {&>eTB2τD}?]'ΓQo*?[}h&ϕy-O md};;WFW佔Gxpb<={a+[p0_HR☷?~h/lY} %.m+h}/&>z'Y<.X}>F+o_zGlV/v?Ϫk nSC| '>Fc|L08kX|꘏#:g}3 z,Cؙ`1 |hr /QEtFF5&mflR<ZwArY*V9w5y:?2*K|/FrD\ϝﻑ~?܁ޝ2wg3u_h_^'^BYoQlF37Ծ8/lrF?IqIlF&D˷hߎ v bX>1Lu=u3&utzKkS:c堆xAY#AYiF]LH.̩[ uFp4Ꞻ:g:sb^ixP|\iڄu= {FTVyY҃Ow]4~Ok6%#4E˦uCi23u~"Fu3P[%y*< q+\?ex\YS|er 6c?"V3|M"fk|2Kr٪jnQu{kj\Ѱ6A}< | #mB SgDlc8h Azބ|KKȫO8G-/WHGft끰H&:)L8\0@7>z2r6PP@R\bN n޼pk8k\!:Πu1sunJ/0ɻ)gnbl0f/Hu=PcOip=f8ɕ,ɋ?ghtL"34,d^ajJD[D:T }hSŭB4-O ]s'r{!Onź ]3Zٻ@ףYbA\X芶 JFbJ,F=>C"e)uU6XkgԚvF?>g=!ć &}R{"Y7E2m>VPhOa3yTN*?ۓ)X5-O md{W֞(*f`H+c3!=a3ȏ6V/G^V0UvF+ocKUNW?gSz c^cS$/6cK|Da37*mVoᕬֽdg!+ju=4V)-K<mX{;19; @i_ן-6Mg#[E8mmuyO{Tz-%_^s_žb1ʆRWW7V$̓tSHtrEbd@Jn6w{g7YY*ݞr8pV+q#m3|U'?m3|bfIt4"bBxS{)kGOФ4TGC  HѺ8StOj+ӞNaۛ" >Rp_L=SŭMH-R q/}:cZY_jG6|Lj|sL TG0H7,oZH|&}8G`SG [E8mIRpT}ɤKu$/rO=ۛ" >R(tT!R`I/)kG eTqΙy#s#H>HSYGZHgV{0H>қ4囻:4KCG:osoT!R`#i[2@6ΝWʹ; i\y<-QsO\U ϝl@\ErqUt!s%he:w<_v׾% w8-pcTb$0IbaTߨL /\ qܸ@z\v:p8Dҏzyߎ6!23qFfkcO}ž7{T#ajOq.MtCH^Ϸhc7_ FIި/. ƙS׃} gCz #:Ȝۄxm쵄¦.! ]U##*Ұk\6'W>xN84'Ι }Яլ11b܇7uHh&ڢkZ:5 I||}GgŁ!>Vċ:CEbĆqDG:^iu=PO(o(g3)E7gn'ym7w)s1~ FЙ`H'vYj\@w68ٜ n'g+T~,ӭzkFσm:D5|p񘋢x?@#MDyK 6http://www.microsoft.com/whdc/driver/wdf/default.mspxyK lhttp://www.microsoft.com/whdc/driver/wdf/default.mspxDyK yK phttp://www.microsoft.com/whdc/driver/wdf/wdf-intro.mspxQDyK 7http://www.microsoft.com/whdc/driver/wdf/wdf-arch.mspxyK nhttp://www.microsoft.com/whdc/driver/wdf/wdf-arch.mspxDyK yK phttp://www.microsoft.com/whdc/driver/wdf/UMDF-arch.mspxDyK yK phttp://www.microsoft.com/whdc/driver/wdf/umdf_samp.mspxDyK yK fhttp://www.microsoft.com/whdc/driver/wdf/beta.mspxDyK yK lhttp://www.microsoft.com/whdc/driver/WDK/default.mspxDyK yK >https://winqual.microsoft.com/DyK yK hhttp://www.microsoft.com/whdc/maintain/default.mspxDyK yK fhttp://www.microsoft.com/whdc/winlogo/default.mspx'Dd N 0  # AbM'ShݽkZ )'Y2Qn!'ShݽkZ PNG  IHDR3m2sRGB pHYs+&IDATx^Uowv;RTDEQA ?5KbbIkKl1X(첽ܻ7w5!yΙ3gUG"rg3O;KA;LF\fM$VQ38@ ؅IeR&T{ǽیٞ{* )Qvz6-dAdm\NwIE=k@NCT.}OftsOZ֟,N׻SOUV7)\+㗚9QeO濷WUB'_u:tr@~8m۪U+yНe˸ybvj:oO!M$ ":N]y怚ƥN1y%{o姗^{rs-[x7Jꦍ5/rs=mۂO9jnjsw1SYv;{O "ة*3U.7aG/ p]i8w.Joڴi{-Õ+VPcKJ5S.v/a^YnXٳOozP>7 D]||?ϺVey9]-~gݞ.zXvykk\Ah 3&r mqMΐ^O};١sZr{ϾpOQn?9Ow 7^Jk)))zjS̚u<:^^,**ٹsWLڳ'ڟdpso6L?SW]5{;zkm[| {r2'Y,aÆw֭o~)iicƌ?"kBbZz`$O ;|%HXc95$,u|q1R QR53r)8w􋅎UƧ).fsx_k YVK۵˒S9A:zܷ6xȐ;2͟#Go, +}mt҅_6ؔݾ=Bs֭ɸ/xꩧi<ӣǧQv_?%Xp#W[oG_v b8r".VO9  }*)^au[IRr?״D*l),s|ρ-Jj?_t6oluIa[;3n޻G/`3m޲ q 8wj']~t:?Gi̝ܿ^~֭W7;Üu .;MFxjV[taۍ r;IăGb]qlݻW.g;r?p͡-jӖ+.ӻo\~_HKO tQN1mIuXOEͯͬˣt^UY rw?/6lz9seOl4)PaVPaϖS԰ wI&m޼i+*wKxnA|BpSSR li9NP&" fPNbQ>IIX+()s\'5 fqQQmPSJȣu}ZLڴTQkQ%Xd{N@cg~q*aKz-=pV۶"_|ŧz[zZe_Mz7θyw)Wݻ׌\rD*zCt9|[N򖧈R6|PtNVЩi{BoOs(vG-g_w )'P*W_?#w]p2U:`GK-%ѪVT 'y*MGFwEbcKS~F )k08lL!ZbWn_v^Cv[D6 .hѢst/S a}5Ϙ,ӧeΖJSGٌĜ>}ogGRCo̝}6%R`g4YSɎ 腐U`蝥ּL--fYhVE;MVcID;aú@KIITÅ{. q'ciIN % kg[..Kİa9"^ )Vqt,ܪ jjD3)]D VI:ݞp۶ujIl,QF.4{ch>mTw,tDOptZN = rd?=7;Mtjl`r&Vذ:M{I)X2q؝p(ԗA++NuP#; ,v(**.*mҥK*ӒL㕕"ߗwXMMMuMuyY4*aizt _,`) 9loJVlONP줄N\lFš-O X֭ N l:u" F XliF | hhos|1cƊ1m9O{ |D/,ğ#iؕV;l)JUU4O*aD㰟g~-ln3ծM&:;$HW*d jz W'!aar)ZlqcnMNp%%%Y,f^ aEê@KeX^uSٲq8v\ta4q𹚚ZWzͰy|J 2ۨ˺ 5tBJAy sFYzE?*woھn: +Ɣ?yWEE=^ij׾n'hsȺ<&Ը]nv;XwiA:t1bİaÀ[T3|F?$tQ+$[]֝RT{Oaӧ%f6En|  7  lg?#W.)"^ڼtqʥP@ y+*ds.51M/m#G?gF8?h~|f% ^ܭ+L^F65GNr %+^{xwi豌 ca{F:u\U8g!6HX!Lssw!C¾G}?C0'\| ًu4/vkZp?!p@~خy#۰~ۧΎz( zA0PV{FX P5~1cЀH2^@-?y`{jm~o򄙓'w%7^q F;UNTW#n#_5bN9r0Vi]rF0`x^=98?G;\ݼM*UX-}ə"x?-ް\}7~O*subN~ ʌTTٞGDMVC5?dkG+`#;t./1d2jz>V5[BQt.r`V߽hp !QS;U5UB_*JŕRU}rC͛6+s[f5\bmByyYi o}J+}eY*ܔ)>I9ӳ*}]f-"%umpB\; `pY:D_>f֒oH$]o*`nvŒ LQ#G dꋿ7R]]n]XٴiSd֭[!a0ؤ~;v%wҢ $ P|ьآ(vd3ٍU"W +)6KWmQt XZM|~jϗ ̾$Ӿo0&to53VxIV !1 ;O-շuV*vzhd,Ǹ.Hta ɖO԰g`xqW?[L`@ l%i#} NmFC}u=@;@"~2( 9t~zLO$ʮX]pͻ9!sRHc nǥA۩75Zu32TD=Ie$[mpd5RUzYZg(!S.!C zGQ%)Njπ٠u.vL^BEi=rTOgӏ 9ٞF(٤|`~,6A}}V=_ytkQpab4P`u/jl %NFJGP`gcr饗R݀v]C\"3#F6` (w?H:צ([v ɜh4MFıa$F k뤉MoEP]4q~~IzłE (ȝ;wΙ3 Xh4`sv.+/-M ~CxUʄuyb.I(]'RѨj#rX~αO2ku ׸&OگMͪw^4Elj$(jXEN6m Tu|nzCVQb҆:1;:$;  /Lf"dJxSbn)BV,ˣ6\It`aɒ631Ȝ1YDhu2!ي=95ax*73wtI>J<#u8 y2rŶ@Kf=!aCj%8w?DmpiJIU=)5y gUJZJir6E\ F%+}F(p2q^ ۶I?*~}c2ί;ZN$%, VmJ "]@Œx̋q$:r5PTؤSDL7 +P_]AU ;v*R ':\67|3 쐖@ 2;a.[Nݮmz[6N@1hpB);D]'<*VǘyP$b kԆd'gm(KO^9BZ I3<#QCG(j8xaѼpjJ*6D^=NTK"Ȁ"geU(Dž!{GCa D^7D^Lpq\ҿM:tX Wa1c/l5ICrYT Fx/Sk-W_݃å Ug7@3qCrGŎMM2Nd _|Bա NV nWDtI ⮂<Öf-KPQ,$(( 5ť+b--*MGK% {@ sI<};1u!6lmzW&$]':}Z]M ! y EI֤t{fK @%+$xPkpxR֧rPH h=M].)Ru-W4JKY,Jُ>jOJ)'kYd WB~ءz!^$=>X}10uF?7~L5 f?$KT?.'ccCμ% /ҸW1ӧ $~(a~jt*,oؤI"&:=G:scdt u^>zVٸ-̰%8-ah -kq,ŶFjN$ŔNQ(e>9& )e,'X>&ĊM6ܧ |qShX&N_kXƌ#t<Г =\(U˽ُφJ5mHڴi#i2)9k6Ï<0>HJ˗\ibWذ]ňWb:,@LL,|bvW޼<.!I&5<)>PىKy9hz5G/[XL@DxHV#`XK( @  enE~j͹sɌoj$YWD#av`Nc&; 89oV_F)@Y1ۙv;`[)NAⲃ9:Rid"aju 5X'RC 93-Y6(ǎkuZ2Q_7iEE%HqiiME? :M1"GOq> E Bullet List 2  & F^>@^ E Title /CJ0KHOJPJQJ\^J_HaJ0mH sH tH DD E Subtitle2 P56CJaJvZ@vE Plain Text,Code h^h4B*CJOJPJQJ^J_HmHnHphsH tH utOt E Note Heading$($dN'5CJOJPJQJ^J_HmH sH tH ^O^ E Procedure!$$x&dP5B* CJph8/@8 E Listhx^h`F@FE TOC 2,TOC level 2 ^F@FE TOC 3,TOC level 3 ^V@VE TOC 1,TOC level 1 ! CJmHnHu# E Table row cell$:V"0>jg jj4 "f$4$#CJOJQJ56CJOJQJNO2N E Table Body,tp# & FCJaJFO12F E Table Head$$$ & F5CJ@O@ E Disclaimertext%CJaJ@O@ 'E FigCap &5@ CJaJ^Oq^ & FigCap Char/5@ CJOJPJQJ^J_HaJmH sH tH <O< E DT,Term1 ($^5:O: *E DL,Def1)$hP^hZOZ )DL Char,Def1 Char OJPJQJ^J_HmH sH tH :O: E Superscript H*OJQJ6O6 E Subscript H*OJQJJOJ E Plain Text Embedded CJOJQJdOdE Version+.$$d&dNPCJmHnHu6U@6 E Hyperlink >*B*phBOrB E Body Text Link 0$$Pzz E Table Grid7:V101x CJOJQJB'!B E Comment ReferenceCJaJdjABd E Comment Subject3-DM B*CJOJQJ\phfHBH E Balloon Text4CJOJQJ^JaJ8^R8 E Normal (Web)5aJ(a( E Red B*ph>> E Note end 7dxCJaJ>O> E Alert Text8 B* phPrP E List - New Paragraph9hP^h`r` E Note body:&dP OJPJQJ^J_HmH sH tH (O( E Italic6NN E Text,t <dxOJPJQJ_HmH sH tH TT E Bulleted List 1,1bl1= hh^hff E Bulleted List 2,bl2 > & F<OJQJ_HmH sH tH HH E Text Indent?hd<^h^J>)> E Page Number5CJOJQJTT E Text in List 2,t2Ad<<^T"T E Text in List 1,t1Bhd<<^hjOj E Le,listend (LE),leCd$CJOJPJQJ_HaJmH sH tH TORAT E Editor note%5CJOJQJ\phq *W@Q* E Strong5\$Oa$ E Bold5FV@qF FollowedHyperlink >*B* ph(O( FigureH&O& E SmallCJTOT [kBody Text Char OJPJQJ^J_HmH sH tH LOL E Bullet List 3 K & F B*phZOZ 'Heading 3 TextLP^B*PJ^JaJphROAR 'Style Heading 4h4 + 12 ptMCJ8O8 'Bullet 1 N & F<@O@ E Bullet List CharPJ^J>1@> E List Number Q & FxNON E ParameterR$. ^. ` 6PJ^J     Mw           '     Mw |@BsDf\qrsNw6000300P05 P3000*300c 0d 300J 0p 300K 0s ;00g 0 00<P\;000=;000= |@BsDfvmrsNw6000@(0A300,0*,300c0d300J 0p 300K 0s ;00m 0  @00=;00 0= ;00 0= 3BK sBL i} c e f q ~    '(opVW36;2M_pnx!<#J%%y&u''u((((((w)D**!+o++, ,,,,,G-H-Y---L.M.E/a//////////B111222g3i3@567@9n::<>|@BsDDFFFG HHILNN_OPPPQRzSST%TNT{TTTTWWXZ[=]W^%`<`a+bccffgh/i:ikjsjlkfllmvmmnnPoop\qmq"rrssstttFuGuIuJuKuLuMuOuPuQuRuSuUuVuWuXuYu[u\u]u^u_u`uaubuuuuuuuuuuu!v"v$v%v&v'v(v)v*v+v,v-v.v/v0v1v2v3v4v5v6v7v8v9v:v;vv?v@vAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv[v\v]v^v_v`vavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzv{v|v}v~vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwww w w w w wwwwwwwwwwwwwwwwwww w!w"w#w$w%w&w'w(w)w*w+w,w-w.w/w0w1w2w3w4w5w6w7w8w9w:w;ww?w@wAwBwCwDwEwFwGwHwIwJwKwNw0.0$0000000$0!0!0!0!000!0!000000!0!00!0$0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%000000000000 0 0 0 0 0 0 0 0C0000000000000u' 0u' 0 u' 0 u' 0 u'C0u'0u'0u'00u' 0 u' 0 u' 0u' 0u'C0u'00u' 0u' 0u' 0u' 0u'C0u'000H- 0H- 0H-C0H-0H-0H-00E/ 0E/ 0E/ 0E/ 0E/ 0E/ 0E/ 0E/C0E/0E/00E/ 0E/ 0E/ 0E/ 0 E/ 0!E/C0E/0E/0E/0E/0E/0E/0H-0n:0n:0n:0n:0n:00sD00sD0sD&0sD0sD0sD0sD0sD0sD00sD 0"sD 0#sD 0$sDC0sD0sD0sD0sD00zS0zS00T 0%T 0&T 0'TC0T0T0zS0W0W0W0W0W0zS0%`0%`0%`0%`0%`0zS0f0f0f0zS0/i00kj0kj0kj0(0lm)0lm(0lm)0lm)0lm)0lm)0lm(0lm)0lm)0lm(0lm)0lm(0lm)0lm)0lm(0lm)0lm@0@0@0@0h00@0@0@0@0h00@0@0@0@0h00@0@0@0@0h00@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0h00X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003BK sBL i}e f q ~    '(opVW36;2M_pnx!<#J%%y&u''u((((((w)D**!+o++, ,,,,,G-H-Y---L.M.E/a//////////B111222g3i3@567@9n::<>|@BsDDFFFG HHILNN_OPPPQRzSST%TNT{TTTTWWXZ[=]W^%`<`a+bccffgh/i:ikjsjlkfllmvmmnnPoop\qmq"rrssstttFuGuIuJuKuLuOuPuQuRuUuVuWuXu[u\u]u^u`uaubuuuuuuuuuuu!v"v$v%v&v'v.w/w0w1w2w3w4w5w6w7w8w9w:w;ww?w@wAwBwCwDwNw0.0$0000000$00000000000000!0$0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0 0000000 0000 0 0 0 0 0 0 0 0C0000000000 000p' 0p' 0 p' 0 p' 0 p'C0p'0p'0p'00p' 0 p' 0 p' 0p' 0p'C0p'00p' 0p' 0p' 0p' 0p'C0p' 000C- 0C- 0C-C0C-0C-0C-00@/ 0@/ 0@/ 0@/ 0@/ 0@/ 0@/ 0@/C0@/0@/00@/ 0@/ 0@/ 0@/ 0 @/ 0!@/C0@/0@/0@/0@/0@/0@/0C-0i:0i:0i:0i:0i: 00nD00nD0nD&0nD0nD0nD0nD0nD0nD00nD 0"nD 0#nD 0$nDC0nD0nD0nD0nD 00S0S00T 0%T 0&T 0'TC0T0T0S0W0W0W0W0W0S05`05`05`05`05`0S00000 0000 0(0)0(0)0)0)0)0(0)0)0(0)0(0)0)0(0)0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0 00{00+{00{00{00{00{0 0{0 0{0 0{0 0z{00m{00d{00Z{00P{00F{00<{003{00*{00!{00{00{00{000,[(  Q >@%6AR_q$yn{~;@CDEFGHILNPQSUVWY]f2"w2:Rj|K:Wt˵";AJKMORTX\^_`abcdefg:B2z #$DRnpqs!=?@Bbt+GIJLl )Hdfgi;[wz{}    6 A ] ` a c nTnnnoNo~ooo,pqppp"qZqqq rsIsssst.tqtttuDuMwX X%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕX%ĕ̕XXXXXXXXXX=pt{} !X( !"$#.;[ͤ"$k0.nOr&]P"$f=i6Q2(<-|4 2$#i.*'Փm8"$ᰌU;åA"$/|lZ%遽"$}u2a7"$n\a-6A;I^"$dqF?0(oU"$)[~8<"$Lz"$sp邗.fY&@%0(  B S  ?MwL _Hlt135555309 _Hlt135555310 _Hlt134266919 _Hlt134266920 _Hlt134266940 _Hlt134266941 Copyright _Toc85617058 _Toc134433431 _Toc134433432 _Toc134433433 _Toc134433434 _Toc134433435 _Toc134433436 _Toc134433437 _Toc134433438 _Toc85617067 _Toc134433439 _Toc134433440 _Toc134433441 _Toc134433442 _Toc134433443 _Toc85617069 _Toc134433444 _Toc134433445 _Hlt134859891 _Hlt134859892 _Hlt134265746 _Hlt134265747 _Hlt134265779 _Hlt134265780 _Hlt134859927 _Hlt134859928 _Hlt134266031 _Hlt134266032 _Hlt100551185 _Hlt134859938 _Hlt134859939 _Hlt134266019 _Hlt134265786 _Hlt134265787 _Hlt134265878 _Hlt133300484 _Hlt133300485 _Hlt133300505 _Hlt133300506 _Hlt134859945 _Hlt134859946 _Hlt100551188 _Hlt134859949 _Hlt134265881 _Hlt134266109 _Hlt134266110 _Hlt134266138 _Hlt134859952 _Hlt115505947 _Hlt115505948 _Hlt133300426 _Hlt133983689 _Hlt133983690 _Hlt134859959 _Hlt134859960 _Hlt134859979 _Hlt134859980 _Hlt134266201 _Hlt134266202 _Hlt134266207 _Hlt134266208 _Hlt134860020 _Hlt134860021 _Hlt134860040 _Hlt134860041 _Hlt134860053 _Hlt134860054 _Hlt134266212 _Hlt134266213pu'H-E/n:sDzSTTW%`f/ikjkjlmtntnwnwn2o2o=o=oAoAooooooopppppppDqFqIqRqRq rrrrrrrrsrssssstttttt+u+u,u,uNw@@@@@@ @@@@@@@ @!@"@#@$@%@&@'@(@)@*@+@,@-@.@/@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@A@B@C@D@E@F@G@H@I@J@K@'X-`/:DS$T$TW;`f9irjrjumununxnxn3o3o>o>oBoBooooooopppppppEqGqJqSqSq rrrrrrrsssssssstttttt,u,u-u-uNwGuGuLuLuMuMuRuSuXuYu^u_u&v'vNwGuGuLuLuMuMuRuSuXuYu^u_u&v'vNw3? Rq!@t+JHg[{ A a 2p((,,,,//BBHH O_OR SDSzSTTfaaggFhGhkk\qmqssssttttttEuFuGuGuLuLuMuMuRuSuXuYu^u_uuuuuu v&v'vNwGuGuLuLuMuMuRuSuXuYu^u_u&v'vNw|ޔl}"hr~L0F&v^uTxyd^aFQTiu4F4 `6D ? j"~D{h}pwNH $ o,y*ZdV &1b>m3:3U'5 S14QZT@M:^?UX8p>&q`#{~'@EK^`.^`.88^8`.^`. ^`OJQJo( ^`OJQJo( 88^8`OJQJo( ^`OJQJo(hh^h`. hh^h`OJQJo(P^`P^`.0^`0..``^``... ^` .... ^` ..... ^` ...... `^``....... 00^0`........h88^8`OJQJo(hHh^`OJQJ^Jo(hHoh  ^ `OJQJo(hHh  ^ `OJQJo(hHhxx^x`OJQJ^Jo(hHohHH^H`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHhpp^p`OJQJ^Jo(hHoh@ @ ^@ `OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHhPP^P`OJQJ^Jo(hHoh  ^ `OJQJo(hHh88^8`OJQJo(hHh^`OJQJ^Jo(hHoh  ^ `OJQJo(hHh  ^ `OJQJo(hHhxx^x`OJQJ^Jo(hHohHH^H`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hH hh^h`OJQJo( hh^h`hH) ^`hH) 88^8`hH) ^`hH() ^`hH() pp^p`hH()   ^ `hH. @ @ ^@ `hH.   ^ `hH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.^`o(. pp^p`hH. @ L@ ^@ `LhH. ^`hH. ^`hH. L^`LhH. ^`hH. PP^P`hH.  L ^ `LhH. hh^h`hH) ^`hH) 88^8`hH) ^`hH() ^`hH() pp^p`hH()   ^ `hH. @ @ ^@ `hH.   ^ `hH.h ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh88^8`OJQJo(hHh^`OJQJ^Jo(hHoh  ^ `OJQJo(hHh  ^ `OJQJo(hHhxx^x`OJQJ^Jo(hHohHH^H`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHhpp^p`OJQJ^Jo(hHoh@ @ ^@ `OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHhPP^P`OJQJ^Jo(hHoh  ^ `OJQJo(hHh ^`OJQJo(xx^x`OJQJo(hH^`OJQJ^Jo(hHopp^p`OJQJo(hH@ @ ^@ `OJQJo(hH^`OJQJ^Jo(hHo^`OJQJo(hH^`OJQJo(hH^`OJQJ^Jo(hHoPP^P`OJQJo(hHh88^8`OJQJ^Jo(hHoh^`OJQJ^Jo(hHoh  ^ `OJQJo(hHh  ^ `OJQJo(hHhxx^x`OJQJ^Jo(hHohHH^H`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hH~}|4QZTm3S &1&qU'5pH $D{? X?Uu4F}o,y*6{~SB                          ?                 YԾ                         6T                 [         ._no       8В         @ @ @76[kj)E %:\ KU!a&!)O).0 /[0k1B:UAU(e\etxD)|'+c `S@ FTL'dDfD7OTXz7_9D, 4~T,(#<iP-0 sGuJuKuLuPuQuRuVuWuXu\u]u^ubuuuuvNw@ss05ssL1*1+uMw@ @4l@h@UnknownGz Times New Roman5Symbol3& z ArialG5  hMS Mincho-3 fg5& zaTahoma?5 z Courier New;Wingdings"1KhƃFǃFN;`c`c!e 4dltlt  2qX%2?C:\Program Files\Microsoft Office\Templates\whdc_whitepaper.dot.Introduction to the User-Mode Driver Frameworkx                      Oh+'0$ 0< \ h t 0Introduction to the User-Mode Driver Frameworkwhdc_whitepaper.dot4Microsoft Office Word@F#@tU;@"4y@Z 5y`c՜.+,D՜.+,    (08@ H Llt /Introduction to the User-Mode Driver Framework Title (V^j_PID_LINKBASE _PID_HLINKSAAt <c{3http://www.microsoft.com/whdc/winlogo/default.mspx18}x4http://www.microsoft.com/whdc/maintain/default.mspx14&uhttps://winqual.microsoft.com/1r6http://www.microsoft.com/whdc/driver/WDK/default.mspx1.7o3http://www.microsoft.com/whdc/driver/wdf/beta.mspx1Fl8http://www.microsoft.com/whdc/driver/wdf/umdf_samp.mspx1c?i8http://www.microsoft.com/whdc/driver/wdf/UMDF-arch.mspx1y2f7http://www.microsoft.com/whdc/driver/wdf/wdf-arch.mspx1?zc8http://www.microsoft.com/whdc/driver/wdf/wdf-intro.mspx1`6http://www.microsoft.com/whdc/driver/wdf/default.mspx12Y1_Toc1344334452S1_Toc1344334442M1_Toc1344334432G1_Toc1344334422A1_Toc1344334412;1_Toc134433440251_Toc1344334392/1_Toc1344334382)1_Toc1344334372#1_Toc13443343621_Toc13443343521_Toc13443343421_Toc1344334332 1_Toc13443343221_Toc134433431Ss9http://www.microsoft.com/whdc/driver/wdf/UMDF_Intro.mspx1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjklmnopqrstuvwxyz{|}~    Root Entry F`g<5yData iY1Table#WordDocument5SummaryInformation(DocumentSummaryInformation8 CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q