<!doctypehtml><html class=client-nojs dir=ltr lang=en><meta charset=utf-8><title>
   Windows Programming/Device Driver Introduction - Wikibooks, open books for an open world
  </title><script>document.documentElement.className="client-js";RLCONF={"wgBreakFrames":!1,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"7623ae8f-ce04-4362-bd07-e7f38c5f9bd5","wgCSPNonce":!1,"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":!1,"wgNamespaceNumber":0,"wgPageName":"Windows_Programming/Device_Driver_Introduction","wgTitle":"Windows Programming/Device Driver Introduction","wgCurRevisionId":3744218,"wgRevisionId":3744218,"wgArticleId":58696,"wgIsArticle":!0,"wgIsRedirect":!1,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Book:Windows Programming"],"wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Windows_Programming/Device_Driver_Introduction","wgRelevantArticleId":58696,"wgIsProbablyEditable":!0,
"wgRelevantPageIsProbablyEditable":!0,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgFlaggedRevsParams":{"tags":{"value":{"levels":3}}},"wgStableRevisionId":3744218,"wgMediaViewerOnClick":!0,"wgMediaViewerEnabledByDefault":!0,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":!0,"nearby":!0,"watchlist":!0,"tagline":!1},"wgWMESchemaEditAttemptStepOversample":!1,"wgULSCurrentAutonym":"English","wgNoticeProject":"wikibooks","wgEditSubmitButtonLabelPublish":!0,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":!0,"wgCentralAuthMobileDomain":!1,"wgSiteNoticeId":"2.24"};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.flaggedRevs.icons":"ready","oojs-ui-core.styles":"ready","oojs-ui.styles.indicators":"ready","mediawiki.widgets.styles":"ready",
"oojs-ui-core.icons":"ready","skins.vector.styles.legacy":"ready","ext.flaggedRevs.basic":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","ext.wikimediaBadges":"ready","wikibase.client.init":"ready","ext.dismissableSiteNotice.styles":"ready"};RLPAGEMODULES=["site","mediawiki.page.ready","mediawiki.toc","skins.vector.legacy.js","ext.flaggedRevs.advanced","ext.gadget.wikidialog","ext.gadget.commons-file","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.centralauth.centralautologin","ext.dismissableSiteNotice"];</script><script>(RLQ=window.RLQ||[]).push(function(){mw.loader.implement("user.options@1hzgi",function($,jQuery,require,module){/*@nomin*/mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"});
});});</script><link href=/w/load.php?lang=en&modules=ext.dismissableSiteNotice.styles%7Cext.flaggedRevs.basic%2Cicons%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediaBadges%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.indicators%7Cskins.vector.styles.legacy%7Cwikibase.client.init&only=styles&skin=vector rel=stylesheet><script async src=/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector></script><meta name=ResourceLoaderDynamicStyles><link href=/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector rel=stylesheet><meta content="MediaWiki 1.38.0-wmf.6"name=generator><meta content=origin name=referrer><meta content=origin-when-crossorigin name=referrer><meta content=origin-when-cross-origin name=referrer><meta content=telephone=no name=format-detection><meta content="Windows Programming/Device Driver Introduction - Wikibooks, open books for an open world"property=og:title><meta content=website property=og:type><link media="only screen and (max-width: 720px)"href=//en.m.wikibooks.org/wiki/Windows_Programming/Device_Driver_Introduction rel=alternate><link href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit rel=alternate title=Edit type=application/x-wiki><link rel="shortcut icon"href=/static/favicon/wikibooks.ico><link title="Wikibooks (en)"href=/w/opensearch_desc.php rel=search type=application/opensearchdescription+xml><link href=//en.wikibooks.org/w/api.php?action=rsd rel=EditURI type=application/rsd+xml><link href=https://creativecommons.org/licenses/by-sa/3.0/ rel=license><link href=https://en.wikibooks.org/wiki/Windows_Programming/Device_Driver_Introduction rel=canonical><link href=//meta.wikimedia.org rel=dns-prefetch><link href=//login.wikimedia.org rel=dns-prefetch><body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Windows_Programming_Device_Driver_Introduction rootpage-Windows_Programming skin-vector action-view skin-vector-legacy"><div class=noprint id=mw-page-base></div><div class=noprint id=mw-head-base></div><div class=mw-body id=content role=main><a id=top> </a><div id=siteNotice><div id=mw-dismissablenotice-anonplace></div><script>(function(){var node=document.getElementById("mw-dismissablenotice-anonplace");if(node){node.outerHTML="\u003Cdiv class=\"mw-dismissable-notice\"\u003E\u003Cdiv class=\"mw-dismissable-notice-close\"\u003E[\u003Ca tabindex=\"0\" role=\"button\"\u003Edismiss\u003C/a\u003E]\u003C/div\u003E\u003Cdiv class=\"mw-dismissable-notice-body\"\u003E\u003Cdiv id=\"localNotice\" lang=\"en\" dir=\"ltr\"\u003E\u003Cdiv style=\"background: #ffffff; border: solid 1px #48b; width: auto; padding-left:2px; padding-right:2px; margin-left:auto; margin-right:auto; vertical-align: top; display:table; color:black;\"\u003EThe Wikibooks community has accepted \u003Ca href=\"/wiki/Wikibooks:Reading_room/Proposals#Implementation\" title=\"Wikibooks:Reading room/Proposals\"\u003Evideo game strategy guides\u003C/a\u003E on this wiki! See \u003Ca href=\"/wiki/Wikibooks:Strategy_guides\" title=\"Wikibooks:Strategy guides\"\u003EWikibooks:Strategy guides\u003C/a\u003E for the newly-created policy on strategy games. We're looking forward to your contributions.\n\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E\u003C/div\u003E";}}());</script></div><div class=mw-indicators></div><h1 class=firstHeading id=firstHeading>Windows Programming/Device Driver Introduction</h1><div class=vector-body id=bodyContent><div class=noprint id=siteSub>From Wikibooks, open books for an open world</div><div id=contentSub><span class=subpages> < <a title="Windows Programming"href=/wiki/Windows_Programming> Windows Programming </a> </span></div><div id=contentSub2></div><div id=jump-to-nav></div><a class=mw-jump-link href=#mw-head> Jump to navigation </a><a class=mw-jump-link href=#searchInput> Jump to search </a><div class="mw-body-content mw-content-ltr"dir=ltr id=mw-content-text lang=en><div class=mw-parser-output><div aria-labelledby=mw-toc-heading class=toc id=toc role=navigation><input class=toctogglecheckbox id=toctogglecheckbox role=button style=display:none type=checkbox><div class=toctitle dir=ltr lang=en><h2 id=mw-toc-heading>Contents</h2><span class=toctogglespan> <label class=toctogglelabel for=toctogglecheckbox></label> </span></div><ul><li class="toclevel-1 tocsection-1"><a href=#Types_of_Drivers> <span class=tocnumber> 1 </span> <span class=toctext> Types of Drivers </span> </a><li class="toclevel-1 tocsection-2"><a href=#Driver_History> <span class=tocnumber> 2 </span> <span class=toctext> Driver History </span> </a><li class="toclevel-1 tocsection-3"><a href=#Driver_Issues> <span class=tocnumber> 3 </span> <span class=toctext> Driver Issues </span> </a><li class="toclevel-1 tocsection-4"><a href=#Writing_a_Driver> <span class=tocnumber> 4 </span> <span class=toctext> Writing a Driver </span> </a><li class="toclevel-1 tocsection-5"><a href=#Device_Driver_Stack> <span class=tocnumber> 5 </span> <span class=toctext> Device Driver Stack </span> </a><li class="toclevel-1 tocsection-6"><a href=#Buses_and_Physical_Devices> <span class=tocnumber> 6 </span> <span class=toctext> Buses and Physical Devices </span> </a><li class="toclevel-1 tocsection-7"><a href=#PnP> <span class=tocnumber> 7 </span> <span class=toctext> PnP </span> </a><li class="toclevel-1 tocsection-8"><a href=#Device_Namespace,_and_Named_Devices> <span class=tocnumber> 8 </span> <span class=toctext> Device Namespace, and Named Devices </span> </a><li class="toclevel-1 tocsection-9"><a href=#"Arbitrary_Context"> <span class=tocnumber> 9 </span> <span class=toctext> "Arbitrary Context" </span> </a> <ul><li class="toclevel-2 tocsection-10"><a href=#Floating_Point_Arithmetic> <span class=tocnumber> 9.1 </span> <span class=toctext> Floating Point Arithmetic </span> </a></ul><li class="toclevel-1 tocsection-11"><a href=#External_Links> <span class=tocnumber> 10 </span> <span class=toctext> External Links </span> </a></ul></div><h2><span class=mw-headline id=Types_of_Drivers> Types of Drivers </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: Types of Drivers"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=1> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: Types of Drivers"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=1> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><p>Windows device drivers generally come in 2 flavors: <b> Virtual Device Drivers </b> (VXD) and <b> Windows Driver Model </b> (WDM). VxD style drivers are older, and are less compatible, while WDM drivers are supposed to be fully code-compatible all the way back to Windows 98.<h2><span class=mw-headline id=Driver_History> Driver History </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: Driver History"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=2> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: Driver History"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=2> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><p>In the old days of DOS, the computer was free land where anything goes. To that end, developers wrote their own hardware drivers, conforming to no specific specification or interface, using real-mode assembly code. With the advent of Windows 3.0, the operating system began to take a more hands-on approach to application management, by creating and maintaining a variety of virtual machines, to execute different programs in different processor contexts. Drivers could no longer exist as non-conformist real-mode DOS drivers, but instead had to mitigate access between multiple programs, running more or less in parallel with each other. Windows 3.0 changed the "real devices" into managed resources known as "virtual devices", and replaced the real-mode drivers with new <b> virtual device drivers </b> (VDD).<p>The Windows NT product line existed as a separate entity from the "regular" windows brand. These two operating systems were completely different in almost every imaginable way, except perhaps that the shells looked similar. Windows NT was a fully-managed operating system, and unauthorized resource accesses were blocked by the NT kernel. This meant that in Windows NT, device drivers needed to interface with the computer through specific methods, while standard windows drivers (Windows 3.0, 3.1, 3.11, 95, 98, Me) could access hardware directly, without any sort of management. The drivers for both systems at this point, were generally written in assembly language, as well.<p>Realizing that the market was split between Windows and Windows NT, Microsoft saw a need to introduce a single driver model, so that device drivers could be portable between Windows and Windows NT. In addition, Microsoft knew that drivers had to be writable in a higher-level language, like C, in order to be code-compatible for different hardware systems. To meet these needs, Microsoft created the <b> Windows Driver Model </b> (WDM). WDM drivers are compiled using the DDK, they are written in C, and they follow exacting specifications that ensure they can be executed on any windows system. This book will attempt to focus on WDM drivers, but will include notes on writing DOS TSR drivers, and VDDs as well.<h2><span class=mw-headline id=Driver_Issues> Driver Issues </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: Driver Issues"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=3> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: Driver Issues"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=3> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><p>Device Drivers operate in kernel mode so writing, testing, and debugging drivers can be a tricky task. Drivers should always be well tested before they are installed.<p>Since device drivers do not operate in user mode, the user mode libraries (kernel32.dll, user32.dll, wingdi.dll, msvcrt.dll) are not available to a device driver. Instead, a device driver must link directly to ntoskrnl.exe and hal.dll which provide Native API and executive services.<h2><span class=mw-headline id=Writing_a_Driver> Writing a Driver </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: Writing a Driver"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=4> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: Writing a Driver"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=4> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><p>Device drivers are typically written in C, using the <b> Driver Development Kit </b> ( <a class="external text"href=https://en.wikibooks.org/wiki/Windows_Programming/Device_Driver_Introduction#External_Links> DDK </a> ). There are functional and object-oriented ways to program drivers, depending on the language chosen to write in. It is generally not possible to program a driver in Visual Basic or other high-level languages.<p>Because drivers operate in kernel mode, there are no restrictions on the actions that a driver may take. A driver may read and write to protected areas of memory, it may access I/O ports directly, and can generally do all sorts of very powerful things. This power makes drivers exceptionally capable of crashing an otherwise stable system.<p>The Windows platform DDK comes with header files, library files, and a command-line compiler that can be used to write device drivers in C or C++. There is no graphical interface to the DDK compiler.<h2><span class=mw-headline id=Device_Driver_Stack> Device Driver Stack </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: Device Driver Stack"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=5> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: Device Driver Stack"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=5> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><p>Windows implements device drivers in a highly-modular fashion, and it is important that we discuss some vocabulary before we continue the discussion of driver programming any further. The drivers necessary for any particular device are arranged in a driver stack, and are connected together internally by a singly-linked list, that starts at the bottom of the stack (the <b> root driver </b> ), and terminates at the highest level driver. Each driver <i> must </i> contain at least 2 modules, a root driver, and a <b> function driver </b> . This combination, with some optional additions, constitute the whole of what people generally call a complete "device driver". Function Drivers will be the most common type of driver to be written, and will be of a primary focus in this wikibook.<p>Microsoft realized that certain classes of devices all behave similarly, and it would be a gigantic waste of time for every hardware manufacturer to have to write the entire driver code from scratch. To this end, Windows allows for a type of driver known as a <b> class driver </b> . Class drivers are themselves not complete function drivers, but class drivers can be dynamically linked to a regular function driver, and can simplify the development process quite a bit. It is possible to write your own class driver, but 3rd party programmers generally don't worry about it. In general, Microsoft will supply the class drivers, and driver developers will tap into those class drivers. This ensures that class drivers are fully Microsoft tested and certified, and that they are very versatile.<p>Another classification of driver is the <b> filter driver </b> . There are two general types of filter driver, an <b> upper filter driver </b> , and a <b> lower filter driver </b> . Upper filter drivers exist in the stack above the function driver, and--as their name implies--they filter the incoming I/O requests. Lower filter drivers are placed in the stack between the function driver and the root driver. Filter drivers are generally implemented as bug fixes, or as quick hack extensions for preexisting drivers.<p>Here is a general diagram of a driver stack:<pre>Upper filter driver
     |
     |
  Function Driver &LT-------> Class Driver
     |
     |
Lower Filter Driver
     |
     |
  Root driver
     |
     |
   Hardware
</pre><h2><span class=mw-headline id=Buses_and_Physical_Devices> Buses and Physical Devices </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: Buses and Physical Devices"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=6> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: Buses and Physical Devices"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=6> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><p>For simplification, let us use the term "bus" to refer to any place on your computer where information can travel from one place to another. This is a very broad definition, and rightfully so: the term "bus" needs to account for everything from USB, Serial ports, PCI cards, Video outputs, etc. Each bus is controlled by its own root driver. There is a USB root driver, a PCI root driver, and so on.<p>Let's now consider a mythical construct known as the <b> root bus </b> , a structure that all other buses connect into. A root bus object doesn't actually physically exist in your computer, but it is handy to think about it. Plus, the root bus has its own driver. The root bus driver object is responsible for keeping track of the devices connected on any bus in your entire computer, and ensuring that the data gets to where it is all going.<h2><span class=mw-headline id=PnP> PnP </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: PnP"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=7> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: PnP"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=7> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><p>Plug-n-Play (PnP) is a technology that allows for the hardware on the computer to be changed dynamically, and the PnP software will automatically detect changes, and allocate important system resources. PnP gets its own root driver, that communicates closely with the Root bus driver, to keep track of the devices in your system.<h2><span id=Device_Namespace.2C_and_Named_Devices> </span> <span class=mw-headline id=Device_Namespace,_and_Named_Devices> Device Namespace, and Named Devices </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: Device Namespace, and Named Devices"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=8> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: Device Namespace, and Named Devices"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=8> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><h2><span id=.22Arbitrary_Context.22> </span> <span id='"Arbitrary_Context"'class=mw-headline> "Arbitrary Context" </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title='Edit section: "Arbitrary Context"'class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=9> edit </a> <span class=mw-editsection-divider> | </span> <a title='Edit section: "Arbitrary Context"'href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=9> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><p>Drivers execute in the context of whatever thread was running when windows accessed the driver. To this end, we say that drivers execute in an "arbitrary context". Therefore, it is not good practice for a driver programmer to make any assumptions about the state of the processor at the entry point to a driver. There are a few issues that arise with this, so we will discuss them here.<h3><span class=mw-headline id=Floating_Point_Arithmetic> Floating Point Arithmetic </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: Floating Point Arithmetic"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=10> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: Floating Point Arithmetic"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=10> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h3><p>Drivers that want to use MMX or floating point arithmetic may find they are in for some undue difficulty. Because a driver may be entered in any context, at any time, the floating point unit may contain partial results and unhandled exceptions from the user mode program that was interrupted to call the driver. It is not enough to simply save the context and then to restore it, because any unhandled exceptions may become "unhandleable", and raise a system error or a bug check. There are only certain times when Microsoft recommends using floating point arithmetic, and we will discuss them later.<h2><span class=mw-headline id=External_Links> External Links </span> <span class=mw-editsection> <span class=mw-editsection-bracket> [ </span> <a title="Edit section: External Links"class=mw-editsection-visualeditor href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit&section=11> edit </a> <span class=mw-editsection-divider> | </span> <a title="Edit section: External Links"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit&section=11> edit source </a> <span class=mw-editsection-bracket> ] </span> </span></h2><ul><li><a class="external text"href=http://www.scribd.com/doc/61354342/Introduction-to-WDM rel=nofollow> Understanding the Windows Driver Model </a> - An introduction to the basic concepts needed for WDM programming<li><a class="external text"href=http://www.scribd.com/doc/61435580/WDM-Input-Output-Concepts rel=nofollow> WDM I/O Concepts </a> - Understanding the I/O concepts needed for WDM programming<li><a class="external text"href=https://support.microsoft.com/en-in/help/2685811/kernel-mode-driver-framework-version-1-11-update-for-windows-vista-win rel=nofollow> Kernel-Mode Driver Framework 1.11 </a> - the .ISO download includes the Driver Development Kit (DDK)</ul></div><noscript><img style="border: none; position: absolute;"alt height=1 src=//en.wikibooks.org/wiki/Special:CentralAutoLogin/start?type=1x1 width=1></noscript><div class=printfooter>Retrieved from " <a dir=ltr href=https://en.wikibooks.org/w/index.php?title=Windows_Programming/Device_Driver_Introduction&oldid=3744218> https://en.wikibooks.org/w/index.php?title=Windows_Programming/Device_Driver_Introduction&oldid=3744218 </a> "</div></div><div class=catlinks data-mw=interface id=catlinks><div class=mw-normal-catlinks id=mw-normal-catlinks><a href=/wiki/Special:Categories title=Special:Categories> Category </a> : <ul><li><a title="Category:Book:Windows Programming"href=/wiki/Category:Book:Windows_Programming> Book:Windows Programming </a></ul></div></div></div></div><div id=mw-navigation><h2>Navigation menu</h2><div id=mw-head><nav class="mw-portlet mw-portlet-personal vector-user-menu-legacy vector-menu"aria-labelledby=p-personal-label id=p-personal role=navigation><h3 aria-label class=vector-menu-heading id=p-personal-label><span> Personal tools </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list><li class=mw-list-item id=pt-anonuserpage><span> Not logged in </span><li class=mw-list-item id=pt-anontalk><a title="Discussion about edits from this IP address [n]"accesskey=n href=/wiki/Special:MyTalk> <span> Discussion for this IP address </span> </a><li class=mw-list-item id=pt-anoncontribs><a title="A list of edits made from this IP address [y]"accesskey=y href=/wiki/Special:MyContributions> <span> Contributions </span> </a><li class=mw-list-item id=pt-createaccount><a title="You are encouraged to create an account and log in; however, it is not mandatory"href=/w/index.php?title=Special:CreateAccount&returnto=Windows+Programming%2FDevice+Driver+Introduction> <span> Create account </span> </a><li class=mw-list-item id=pt-login><a title="You are encouraged to log in; however, it is not mandatory [o]"accesskey=o href=/w/index.php?title=Special:UserLogin&returnto=Windows+Programming%2FDevice+Driver+Introduction> <span> Log in </span> </a></ul></div></nav><div id=left-navigation><nav class="mw-portlet mw-portlet-namespaces vector-menu vector-menu-tabs"aria-labelledby=p-namespaces-label id=p-namespaces role=navigation><h3 aria-label class=vector-menu-heading id=p-namespaces-label><span> Namespaces </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list><li class="selected mw-list-item"id=ca-nstab-main><a title="View the content page [c]"accesskey=c href=/wiki/Windows_Programming/Device_Driver_Introduction> <span> Book </span> </a><li class=mw-list-item id=ca-talk><a title="Discussion about the content page [t]"accesskey=t href=/wiki/Talk:Windows_Programming/Device_Driver_Introduction rel=discussion> <span> Discussion </span> </a></ul></div></nav><nav class="mw-portlet mw-portlet-variants emptyPortlet vector-menu-dropdown-noicon vector-menu vector-menu-dropdown"aria-labelledby=p-variants-label id=p-variants role=navigation><input aria-haspopup=true aria-labelledby=p-variants-label class=vector-menu-checkbox data-event-name=ui.dropdown-p-variants id=p-variants-checkbox role=button type=checkbox><h3 aria-label="Change language variant"class=vector-menu-heading id=p-variants-label><span> Variants </span> <span class=vector-menu-checkbox-expanded> expanded </span> <span class=vector-menu-checkbox-collapsed> collapsed </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list></ul></div></nav></div><div id=right-navigation><nav class="mw-portlet mw-portlet-views vector-menu vector-menu-tabs"aria-labelledby=p-views-label id=p-views role=navigation><h3 aria-label class=vector-menu-heading id=p-views-label><span> Views </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list><li class="selected mw-list-item"id=ca-view><a href=/wiki/Windows_Programming/Device_Driver_Introduction> <span> Read </span> </a><li class=mw-list-item id=ca-ve-edit><a title="Edit this page [v]"accesskey=v href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&veaction=edit> <span> Edit </span> </a><li class="collapsible mw-list-item"id=ca-edit><a title="Edit this page [e]"accesskey=e href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=edit> <span> Edit source </span> </a><li class=mw-list-item id=ca-history><a title="Past revisions of this page [h]"accesskey=h href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=history> <span> View history </span> </a></ul></div></nav><nav class="mw-portlet mw-portlet-cactions emptyPortlet vector-menu-dropdown-noicon vector-menu vector-menu-dropdown"title="More options"aria-labelledby=p-cactions-label id=p-cactions role=navigation><input aria-haspopup=true aria-labelledby=p-cactions-label class=vector-menu-checkbox data-event-name=ui.dropdown-p-cactions id=p-cactions-checkbox role=button type=checkbox><h3 aria-label class=vector-menu-heading id=p-cactions-label><span> More </span> <span class=vector-menu-checkbox-expanded> expanded </span> <span class=vector-menu-checkbox-collapsed> collapsed </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list></ul></div></nav><div class=vector-search-box id=p-search role=search><div><h3><label for=searchInput>Search</label></h3><form action=/w/index.php class=vector-search-box-form id=searchform><div class=vector-search-box-inner data-search-loc=header-navigation id=simpleSearch><input aria-label="Search Wikibooks"placeholder="Search Wikibooks"title="Search Wikibooks [f]"accesskey=f autocapitalize=sentences class=vector-search-box-input id=searchInput name=search type=search><input name=title type=hidden value=Special:Search><input class="searchButton mw-fallbackSearchButton"title="Search the pages for this text"id=mw-searchButton name=fulltext type=submit value=Search><input title="Go to a page with this exact name if it exists"class=searchButton id=searchButton name=go type=submit value=Go></div></form></div></div></div></div><div id=mw-panel><div id=p-logo role=banner><a title="Visit the main page"class=mw-wiki-logo href=/wiki/Main_Page> </a></div><nav class="mw-portlet mw-portlet-Navigation vector-menu vector-menu-portal portal"aria-labelledby=p-Navigation-label id=p-Navigation role=navigation><h3 aria-label class=vector-menu-heading id=p-Navigation-label><span> Navigation </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list><li class=mw-list-item id=n-mainpage><a title="Visit the main page [z]"accesskey=z href=/wiki/Main_Page> <span> Main Page </span> </a><li class=mw-list-item id=n-help><a title="Find help on how to use and edit Wikibooks"href=/wiki/Help:Contents> <span> Help </span> </a><li class=mw-list-item id=n-Browse><a title="Check out what Wikibooks has to offer"href=/wiki/Wikibooks:Card_Catalog_Office> <span> Browse </span> </a><li class=mw-list-item id=n-Cookbook><a title="Learn recipes from around the world"href=/wiki/Cookbook:Table_of_Contents> <span> Cookbook </span> </a><li class=mw-list-item id=n-Wikijunior><a title="Books for children"href=/wiki/Wikijunior> <span> Wikijunior </span> </a><li class=mw-list-item id=n-Featured-books><a title="The best of Wikibooks"href=/wiki/Wikibooks:Featured_books> <span> Featured books </span> </a><li class=mw-list-item id=n-recentchanges><a title="A list of recent changes in the wiki [r]"accesskey=r href=/wiki/Special:RecentChanges> <span> Recent changes </span> </a><li class=mw-list-item id=n-sitesupport><a title="Support Wikibooks"href=//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikibooks.org&uselang=en> <span> Donations </span> </a><li class=mw-list-item id=n-randomrootpage><a href=/wiki/Special:RandomInCategory/Book:Wikibooks_Stacks/Books> <span> Random book </span> </a><li class=mw-list-item id=n-Using-Wikibooks><a href=/wiki/Using_Wikibooks> <span> Using Wikibooks </span> </a></ul></div></nav><nav class="mw-portlet mw-portlet-Community vector-menu vector-menu-portal portal"aria-labelledby=p-Community-label id=p-Community role=navigation><h3 aria-label class=vector-menu-heading id=p-Community-label><span> Community </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list><li class=mw-list-item id=n-Reading-room-forum><a href=/wiki/Wikibooks:Reading_room> <span> Reading room forum </span> </a><li class=mw-list-item id=n-portal><a title="Find your way around the Wikibooks community"href=/wiki/Wikibooks:Community_Portal> <span> Community portal </span> </a><li class=mw-list-item id=n-currentevents><a title="Important community news"href=/wiki/Wikibooks:Reading_room/Bulletin_Board> <span> Bulletin Board </span> </a><li class=mw-list-item id=n-maintenance><a title="Frequent tasks that you can help with"href=/wiki/Wikibooks:Maintenance> <span> Help out! </span> </a><li class=mw-list-item id=n-Policies-and-guidelines><a title="Pages detailing important rules and procedures"href=/wiki/Wikibooks:Policies_and_guidelines> <span> Policies and guidelines </span> </a><li class=mw-list-item id=n-contact><a title="Alternative methods of communication"href=/wiki/Wikibooks:Contact_us> <span> Contact us </span> </a></ul></div></nav><nav class="mw-portlet mw-portlet-tb vector-menu vector-menu-portal portal"aria-labelledby=p-tb-label id=p-tb role=navigation><h3 aria-label class=vector-menu-heading id=p-tb-label><span> Tools </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list><li class=mw-list-item id=t-whatlinkshere><a title="A list of all wiki pages that link here [j]"accesskey=j href=/wiki/Special:WhatLinksHere/Windows_Programming/Device_Driver_Introduction> <span> What links here </span> </a><li class=mw-list-item id=t-recentchangeslinked><a title="Recent changes in pages linked from this page [k]"accesskey=k href=/wiki/Special:RecentChangesLinked/Windows_Programming/Device_Driver_Introduction rel=nofollow> <span> Related changes </span> </a><li class=mw-list-item id=t-upload><a title="Upload files [u]"accesskey=u href=//commons.wikimedia.org/wiki/Special:UploadWizard?uselang=en> <span> Upload file </span> </a><li class=mw-list-item id=t-specialpages><a title="A list of all special pages [q]"accesskey=q href=/wiki/Special:SpecialPages> <span> Special pages </span> </a><li class=mw-list-item id=t-permalink><a title="Permanent link to this revision of the page"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&oldid=3744218> <span> Permanent link </span> </a><li class=mw-list-item id=t-info><a title="More information about this page"href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&action=info> <span> Page information </span> </a><li class=mw-list-item id=t-cite><a title="Information on how to cite this page"href=/w/index.php?title=Special:CiteThisPage&page=Windows_Programming%2FDevice_Driver_Introduction&id=3744218&wpFormIdentifier=titleform> <span> Cite this page </span> </a></ul></div></nav><nav class="mw-portlet mw-portlet-Sister_projects vector-menu vector-menu-portal portal"aria-labelledby=p-Sister_projects-label id=p-Sister_projects role=navigation><h3 aria-label class=vector-menu-heading id=p-Sister_projects-label><span> Sister projects </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list><li class=mw-list-item id=n-Wikipedia><a href=https://en.wikipedia.org/wiki/Main_Page> <span> Wikipedia </span> </a><li class=mw-list-item id=n-Wikiversity><a href=https://en.wikiversity.org/wiki/Wikiversity:Main_Page> <span> Wikiversity </span> </a><li class=mw-list-item id=n-Wiktionary><a href=https://en.wiktionary.org/wiki/Wiktionary:Main_Page> <span> Wiktionary </span> </a><li class=mw-list-item id=n-Wikiquote><a href=https://en.wikiquote.org/wiki/Main_Page> <span> Wikiquote </span> </a><li class=mw-list-item id=n-Wikisource><a href=https://en.wikisource.org/wiki/Main_Page> <span> Wikisource </span> </a><li class=mw-list-item id=n-Wikinews><a href=https://en.wikinews.org/wiki/Main_Page> <span> Wikinews </span> </a><li class=mw-list-item id=n-Wikivoyage><a href=https://en.wikivoyage.org/wiki/Main_Page> <span> Wikivoyage </span> </a><li class=mw-list-item id=n-Commons><a href=https://commons.wikimedia.org/wiki/Main_Page> <span> Commons </span> </a><li class=mw-list-item id=n-Wikidata><a href=https://www.wikidata.org/wiki/Wikidata:Main_Page> <span> Wikidata </span> </a><li class=mw-list-item id=n-MediaWiki><a href=https://www.mediawiki.org/wiki/Main_Page> <span> MediaWiki </span> </a><li class=mw-list-item id=n-Meta-Wiki><a href=https://meta.wikimedia.org/wiki/Main_Page> <span> Meta-Wiki </span> </a></ul></div></nav><nav class="mw-portlet mw-portlet-coll-print_export vector-menu vector-menu-portal portal"aria-labelledby=p-coll-print_export-label id=p-coll-print_export role=navigation><h3 aria-label class=vector-menu-heading id=p-coll-print_export-label><span> Print/export </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list><li class=mw-list-item id=coll-create_a_book><a href=/w/index.php?title=Special:Book&bookcmd=book_creator&referer=Windows+Programming%2FDevice+Driver+Introduction> <span> Create a collection </span> </a><li class=mw-list-item id=coll-download-as-rl><a href=/w/index.php?title=Special:DownloadAsPdf&page=Windows_Programming%2FDevice_Driver_Introduction&action=show-download-screen> <span> Download as PDF </span> </a><li class=mw-list-item id=t-print><a title="Printable version of this page [p]"accesskey=p href=/w/index.php?title=Windows_Programming/Device_Driver_Introduction&printable=yes> <span> Printable version </span> </a></ul></div></nav><nav class="mw-portlet mw-portlet-lang vector-menu vector-menu-portal portal"aria-labelledby=p-lang-label id=p-lang role=navigation><h3 aria-label class=vector-menu-heading id=p-lang-label><span> In other languages </span></h3><div class=vector-menu-content><ul class=vector-menu-content-list></ul><div class="after-portlet after-portlet-lang"><span class=uls-after-portlet-link> </span><span class="wb-langlinks-add wb-langlinks-link"> <a title="Add interlanguage links"class=wbc-editpage href=https://www.wikidata.org/wiki/Special:NewItem?site=enwikibooks&page=Windows+Programming%2FDevice+Driver+Introduction> Add links </a> </span></div></div></nav></div></div><footer class=mw-footer id=footer role=contentinfo><ul id=footer-info><li id=footer-info-lastmod>This page was last edited on 30 September 2020, at 18:47.<li id=footer-info-copyright>Text is available under the <a href=//creativecommons.org/licenses/by-sa/3.0/> Creative Commons Attribution-ShareAlike License. </a> ; additional terms may apply. By using this site, you agree to the <a href=//foundation.wikimedia.org/wiki/Terms_of_Use> Terms of Use </a> and <a href=//foundation.wikimedia.org/wiki/Privacy_policy> Privacy Policy. </a></ul><ul id=footer-places><li id=footer-places-privacy><a title="wmf:Privacy policy"class=extiw href=https://foundation.wikimedia.org/wiki/Privacy_policy> Privacy policy </a><li id=footer-places-about><a href=/wiki/Wikibooks:Welcome title=Wikibooks:Welcome> About Wikibooks </a><li id=footer-places-disclaimer><a title="Wikibooks:General disclaimer"href=/wiki/Wikibooks:General_disclaimer> Disclaimers </a><li id=footer-places-mobileview><a class="noprint stopMobileRedirectToggle"href=//en.m.wikibooks.org/w/index.php?title=Windows_Programming/Device_Driver_Introduction&mobileaction=toggle_view_mobile> Mobile view </a><li id=footer-places-developers><a href=https://www.mediawiki.org/wiki/Special:MyLanguage/How_to_contribute> Developers </a><li id=footer-places-statslink><a href=https://stats.wikimedia.org/#/en.wikibooks.org> Statistics </a><li id=footer-places-cookiestatement><a href=https://foundation.wikimedia.org/wiki/Cookie_statement> Cookie statement </a></ul><ul class=noprint id=footer-icons><li id=footer-copyrightico><a href=https://wikimediafoundation.org/> <img alt="Wikimedia Foundation"srcset="/static/images/footer/wikimedia-button-1.5x.png 1.5x, /static/images/footer/wikimedia-button-2x.png 2x"height=31 loading=lazy src=/static/images/footer/wikimedia-button.png width=88> </a><li id=footer-poweredbyico><a href=https://www.mediawiki.org/> <img alt="Powered by MediaWiki"srcset="/static/images/footer/poweredby_mediawiki_132x47.png 1.5x, /static/images/footer/poweredby_mediawiki_176x62.png 2x"height=31 loading=lazy src=/static/images/footer/poweredby_mediawiki_88x31.png width=88> </a></ul></footer><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgPageParseReport":{"limitreport":{"cputime":"0.048","walltime":"0.061","ppvisitednodes":{"value":133,"limit":1000000},"postexpandincludesize":{"value":646,"limit":2097152},"templateargumentsize":{"value":461,"limit":2097152},"expansiondepth":{"value":11,"limit":40},"expensivefunctioncount":{"value":0,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":0,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00%   47.042      1 Template:BookCat","100.00%   47.042      1 -total"," 28.64%   13.473      1 Template:Evalx"," 10.19%    4.793      1 Template:BOOKCATEGORY","  5.10%    2.398      1 Template:NAIVEBOOKNAME"]},"scribunto":{"limitreport-timeusage":{"value":"0.020","limit":"10.000"},"limitreport-memusage":{"value":841843,"limit":52428800}},"cachereport":{"origin":"mw1369","timestamp":"20211028232334","ttl":1814400,"transientcontent":false}}});mw.config.set({"wgBackendResponseTime":103,"wgHostname":"mw1456"});});</script>