<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7859045228002919282</id><updated>2012-02-15T23:30:27.124-08:00</updated><category term='wdm device driver development tutorial'/><category term='Asp.net'/><category term='computer troubleshooting tips and virus protection tips'/><category term='c/c++/timer'/><category term='c / c++'/><title type='text'>AMIT KUMAR SINGH 'S BLOG</title><subtitle type='html'>I AM PURS. ENGINEERING FROM BPIT.HERE ARE MY SOLUTIONS TO SOME VARIOUS PROBLEMS.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://amitbpit.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://amitbpit.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>amit kumar singh</name><uri>http://www.blogger.com/profile/11463278763395570850</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7859045228002919282.post-3368957085152519884</id><published>2010-12-09T02:32:00.000-08:00</published><updated>2010-12-10T06:32:36.909-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wdm device driver development tutorial'/><title type='text'>Device driver tutorial: basic device  driver concepts and how to write a wdm driver?</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;&amp;nbsp; The article is an attempt to cover all device driver and wdm concepts in a simplified way&amp;nbsp; .&lt;span style="font-size: large;"&gt;&lt;m:dispdef&gt;&lt;m:lmargin m:val="0"&gt;&lt;m:rmargin m:val="0"&gt;&lt;m:defjc m:val="centerGroup"&gt;&lt;m:wrapindent m:val="1440"&gt;&lt;m:intlim m:val="subSup"&gt;&lt;m:narylim m:val="undOvr"&gt;&lt;/m:narylim&gt;&lt;/m:intlim&gt;&lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/span&gt;&lt;/m:smallfrac&gt;&lt;m:smallfrac m:val="off"&gt;&lt;m:dispdef&gt;&lt;m:lmargin m:val="0"&gt;&lt;m:rmargin m:val="0"&gt;&lt;m:defjc m:val="centerGroup"&gt;&lt;m:wrapindent m:val="1440"&gt;&lt;m:intlim m:val="subSup"&gt;&lt;m:narylim m:val="undOvr"&gt;&lt;/m:narylim&gt;&lt;/m:intlim&gt;&lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: black;"&gt;It starts with a brief description of device drivers thereafter discussing its historical development leading to the development of WDM drivers. It describes basic device driver types and device driver concepts. It describes how OS interacts with the device driver. The&amp;nbsp; main focus is on general discussion on development and implementation of WDM device drivers such as how a WDM driver is loaded when it is plugged, how it’s loaded by OS and how a request travels down through the driver layers as it is processed by each one of them. It describes why WDM device driver development is an aspect of kernel programming. The two basic WDM structures for describing device object and driver object have been discussed in detail thereafter how a WDM driver is made up of various routines and how these routines are called based on certain requests is explained.&amp;nbsp; The basic routines of WDM drivers have been described with their implementation in c language. An explanation runs parallelly with coding illustrating how it’s being done. The first routine of device driver driverinit is discussed such as its purpose and its implementation is shown in c language with a brief explanation how this code is being written. Similarly another add device routine is also described and implemented in c language. The focus is then shifted towards I/O requests .They are described in detail such as how they are developed , processed by driver and how they move from one driver to another in driver layers. Thereafter another routine which handles this request are being discussed. All the general cases of how a routine processes these request are being described and their implementation is shown in c language. It finishes up with how we can install our device driver and how we can load it using a tool.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;m:smallfrac m:val="off"&gt;&lt;span style="font-size: large;"&gt;&lt;m:dispdef&gt;&lt;m:lmargin m:val="0"&gt;&lt;m:rmargin m:val="0"&gt;&lt;m:defjc m:val="centerGroup"&gt;&lt;m:wrapindent m:val="1440"&gt;&lt;m:intlim m:val="subSup"&gt;&lt;m:narylim m:val="undOvr"&gt;&lt;b&gt;What is a device driver?&lt;/b&gt;&lt;/m:narylim&gt;&lt;/m:intlim&gt;&lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/span&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;m:smallfrac m:val="off"&gt;&lt;span style="font-size: large;"&gt;&lt;m:dispdef&gt;&lt;m:lmargin m:val="0"&gt;&lt;m:rmargin m:val="0"&gt;&lt;m:defjc m:val="centerGroup"&gt;&lt;m:wrapindent m:val="1440"&gt;&lt;m:intlim m:val="subSup"&gt;&lt;m:narylim m:val="undOvr"&gt;&lt;span style="font-size: small;"&gt;A device driver is a software or computer program which is used by a an OS to communicate or&lt;/span&gt;&lt;/m:narylim&gt;&lt;/m:intlim&gt;&lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/span&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;m:smallfrac m:val="off"&gt;&lt;span style="font-size: large;"&gt;&lt;m:dispdef&gt;&lt;m:lmargin m:val="0"&gt;&lt;m:rmargin m:val="0"&gt;&lt;m:defjc m:val="centerGroup"&gt;&lt;m:wrapindent m:val="1440"&gt;&lt;m:intlim m:val="subSup"&gt;&lt;m:narylim m:val="undOvr"&gt;&lt;span style="font-size: small;"&gt;interact with a device&lt;b&gt; &lt;/b&gt;for e.g. your usb drive driver is used by os to communicate with usb drive&lt;/span&gt;&lt;/m:narylim&gt;&lt;/m:intlim&gt;&lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/span&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;m:smallfrac m:val="off"&gt;&lt;span style="font-size: large;"&gt;&lt;m:dispdef&gt;&lt;m:lmargin m:val="0"&gt;&lt;m:rmargin m:val="0"&gt;&lt;m:defjc m:val="centerGroup"&gt;&lt;m:wrapindent m:val="1440"&gt;&lt;m:intlim m:val="subSup"&gt;&lt;m:narylim m:val="undOvr"&gt;&lt;span style="font-size: small;"&gt; for reading /writing files in it i.e. a driver provides an interface for os to communicate with device.&amp;nbsp;&lt;/span&gt; &lt;/m:narylim&gt;&lt;/m:intlim&gt;&lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/span&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;br /&gt;&lt;m:smallfrac m:val="off"&gt;&lt;m:dispdef&gt;&lt;m:lmargin m:val="0"&gt;&lt;m:rmargin m:val="0"&gt;&lt;m:defjc m:val="centerGroup"&gt;&lt;m:wrapindent m:val="1440"&gt;&lt;m:intlim m:val="subSup"&gt;&lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;b&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 20pt;"&gt;History&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;History of device drivers is directly related to the development of hardware and operating system.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;The hardware development started with intel 8086 which operates in real mode (a mode in which you have an access to 1 MB of main memory and you have an direct access to all i/o addresses and there is no paging). At this point of time the drivers were in real mode and MS-DOS incorporated a scheme based on the CONFIG.SYS file where end user could load real mode drivers. Here the plug n play features were not available and user has to manually configure his device using a map of i/o instructions.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;After it Intel launched 80286 which can operate in protected mode(the mode in which there is virtual memory concept, paging and memory of 4 GB was available) and it can also switch back to real mode by setting a value in control register but it was having many drawbacks in protected mode and also there was no advancement from operating system side and ms dos still worked with real mode device drivers.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;The intel 80386 was the leading change in computing history when it removed all the drawbacks of intel 80286 and protected mode functionality is now ease to use but the ms dos still worked with real mode device drivers.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Microsoft launched windows 3.0 to cope up with hardware development which processed application in protected mode with 32-bit virtual addressing. On the driver part&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Vxd(virtual device driver) was the new concept was launched but it still used a real mode device driver and cpu has to be switched to real mode to process it.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;On the other hand , windows was working with IBM and developed windows NT which used a new kernel based&amp;nbsp; technology which neither used real mode nor protected mode.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Windows 2000 and xp was successor of windows NT and windows 95 and 98 was successor of windows 3.0&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Ok here was the problem for the device driver developer , he have to develop driver for windows NT and keep worrying for developing real mode drivers because some users do not want to upgrade from windows 3.0.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;So microsoft launched a new technology WDM(WINDOWS DRIVER MODEL) and incorporated it with both windows 3.0 and NT .This can be used by a driver developer and need not to worry for real mode driver because the wdm technology was same on all platforms and just one driver can work on all platforms. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 20pt;"&gt;Classification of Window Device Drivers&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 12pt;"&gt;:-&lt;/span&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCyxd3cqNI/AAAAAAAAABA/CM_eWDZuLoc/s1600/image+1.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="245" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCyxd3cqNI/AAAAAAAAABA/CM_eWDZuLoc/s400/image+1.bmp" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;classification of drivers&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;                                   &lt;b&gt;1. Virtual device drivers&lt;/b&gt; - Virtual device drivers are device drivers that are used to emulate a hardware device in&lt;span style="color: black;"&gt; &lt;a href="http://www.blogger.com/wiki/Virtual_machine"&gt;&lt;span style="color: black; text-decoration: none;"&gt;virtualization&lt;/span&gt;&lt;/a&gt; environments, for example when a &lt;a href="http://www.blogger.com/wiki/DOS"&gt;&lt;span style="color: black; text-decoration: none;"&gt;DOS&lt;/span&gt;&lt;/a&gt; program is run on a &lt;a href="http://www.blogger.com/wiki/Microsoft_Windows"&gt;&lt;span style="color: black; text-decoration: none;"&gt;Microsoft Windows&lt;/span&gt;&lt;/a&gt; it uses virtual device drivers.&lt;/span&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;2.Kernel Mode Drivers&lt;/b&gt;  - Kernel mode drivers are the drivers in which the executing code has  complete and unrestricted access to the underlying hardware. It can  execute any CPU instruction and reference any memory address because they actually execute in kernel memory.&lt;/div&gt;&lt;div style="text-align: left;"&gt;The Kernel  mode drivers are further classified as-&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp; &lt;b&gt;a) File system drivers&lt;/b&gt; - A &lt;i&gt;file system driver&lt;/i&gt;  handles I/O independent of any underlying physical device. File system  drivers include drivers for the NTFS and file allocation  table (FAT) file systems.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp; &lt;b&gt;b) Legacy device drivers&lt;/b&gt; - Legacy device drivers are kernel-mode drivers that directly control a hardware device without help from other drivers i.e. they doesn't use layered structure .&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&amp;nbsp; &lt;b&gt;c) PnP Drivers &lt;/b&gt;- Plug and Play drivers provide:&lt;span style="font-family: Symbol;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Automatic and dynamic recognition of installed hardware&lt;span style="font-family: Symbol;"&gt;·&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Hardware resource allocation (and reallocation)&lt;span style="font-family: Symbol;"&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Loading of appropriate drivers&lt;span style="font-family: Symbol;"&gt;·&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;An interface for drivers to interact with the PnP system&lt;span style="font-family: Symbol;"&gt;·&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Mechanisms for drivers and applications to learn of changes in the hardware environment&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;To  just explain in simple way take an example of your usb drive. As soon  as you plug it in , the kernel reads a signature(which gives the  information of the drive and is embedded on your drive) . The os finds  out a particular driver from registry using this information whereupon  it loads it in memory.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;This  above is a example of pnp driver where there is no need of manually  loading a driver. It’s the work of I/O manager while in legacy drivers  you have to manually load your driver after plugging it in using add new  hardware in windows .&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&lt;b&gt;WDM driver&lt;/b&gt;  - A WDM driver is a PnP driver that actually is developed using WDM specification. provided by microsoft. The specifications actually defines two aspects for wdm .The first aspect&amp;nbsp; defines it core model&amp;nbsp; which describes     &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;describes how device drivers are installed and started, and how they should service user requests and interact with hardware. A &lt;b&gt;WDM&lt;/b&gt; device driver must fit into the &lt;b&gt;Plug and Play (PnP)&lt;/b&gt; system that lets users plug in devices that can be configured in software. The second aspect is &lt;/span&gt;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;span style="color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;series of bus and class drivers for common types of devices provided by microsoft which we can use in our driver to communicate with devices for e.g. if we have to develop a&amp;nbsp; driver to perform some work on usb we can use usb&amp;nbsp; class driver provided&amp;nbsp; by microsoft to access functionality provided by it whereupon reducing work for developer .&lt;/span&gt;All versions of Microsoft Windows after  Windows 95 have implemented WDM, which has continued to evolve for  Windows XP, Windows 2000, and Windows Me. With a few special-case  statements in the code, WDM drivers for supported device classes can be  source-code compatible across Windows XP/Windows 2000 and Windows 98/Me  operating systems. Binary compatibility is possible on processors that  are compatible with the Intel Architecture. Achieving a single binary  still requires rigorous testing on all versions of all operating  systems. &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;The different WDM drivers are&lt;/b&gt;-&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Class Drivers&lt;/b&gt;  – are the drivers which are used to define some common functionality  and these drivers are used by other drivers to access there  functionality.&amp;nbsp; Microsoft provides its class drivers for e.g.&amp;nbsp; usb class drivers whose functionality can be accessed by the function drivers.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Miniport drivers&lt;/b&gt;:  These are function drivers for USB, Audio, SCSI and network adapters.  They should usually be source and binary compatible between Windows 98  and Windows 2000 and are hardware specific but control access to the  hardware through a specific bus class driver(this can be the one provided by microsoft). These miniport drivers  actually are defined over the class drivers to access their  functionality. A programmar basically builds this driver and place it  over class driver.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Monolithic Function Drivers&lt;/b&gt; – are the drivers that does not use the layered structure i.e. to communicate with hardware&amp;nbsp; it does not use the bus class driver as compared to miniport drivers instead it directly drives a hardware device. &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Filter drivers &lt;/b&gt;-  Filter drivers are optional drivers that add value to or modify the  behavior of a device driver i.e. it’s used to just filter your I/O  request to driver below it (for e.g. to check incorrect parameters to  usb class driver we can place a filter driver to check for the same and  filter out the request). A filter driver service one or more devices.  Upper level filter drivers sit above the primary driver for the device  (the function driver), while lower level filter drivers sit below the  function driver and above the bus driver.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;3) &lt;b&gt;Windows Driver Foundation&lt;/b&gt; - WDM has been criticized by driver software developers because of the following reasons:-&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * WDM has a very steep learning curve.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&amp;nbsp; *  Interactions with power management events and plug and play are  difficult. This leads to a variety of situations where Windows machines  cannot go to sleep or wake up correctly due to bugs in driver code.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * I/O cancellation is almost impossible to get right.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Thousands of lines of support code are required for every driver.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * No support for writing pure user-mode drivers.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;Because  of these issues, Microsoft has released a new framework to replace WDM,  called the Windows Driver Foundation, which includes Kernel-Mode Driver  Framework (KMDF) and User-Mode Driver Framework (UMDF). Windows Vista  supports both WDM and the newer Windows Driver Foundation. KMDF is also  available for download for Windows XP and even Windows 2000, while UMDF  is available for Windows XP and above.&amp;nbsp; &lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-color: -moz-use-text-color -moz-use-text-color -moz-use-text-color windowtext; border-style: none none none solid; border-width: medium medium medium 1pt; padding: 0in; text-align: left;"&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in;"&gt;&lt;b&gt;&lt;span style="font-size: 14pt;"&gt;OS / DRIVER INTERACTION:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_GvW8UOo5ICs/TQCy5cSOayI/AAAAAAAAABE/wzzVP9BknuE/s1600/image+2.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="430" src="http://2.bp.blogspot.com/_GvW8UOo5ICs/TQCy5cSOayI/AAAAAAAAABE/wzzVP9BknuE/s640/image+2.bmp" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;os/driver interaction&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;The application requests windows to access your driver for e.g. reading or writing a certain file in device.&amp;nbsp; Its done by using a api call (here api is of win32 and its being called by application called as win32 api calls). The win 32 subsystem interprets the request and using the system service interface communicates with I/O manager to handle it. &amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;An IRP is actually an&amp;nbsp; I/O REQUEST PACKET that is used to represent a request such as whether it’s a read or write request or pnp request using major function code for e.g. IRP with IRP_MJ_PNP as major function code is used for representing a pnp request and the minor function code as IRP_MN_START_DEVICE will further elaborate the request that it’s a PNP request for starting a device.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;The I/O manager issues an I/O REQUEST PACKET short form IRP(identifies your i/o request ) pertaining to the request and passes it to the device driver whereupon its processed by device driver . A device driver may eventually need to actually access its hardware to perform  an IRP for the same it uses&amp;nbsp; HAL(HARDWARE ABSTRACTION LAYER) calls&amp;nbsp; . The result is returned back to application. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="description"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 16pt;"&gt;Layering of devices and drivers in the Windows ­Driver Model:&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_GvW8UOo5ICs/TQCy9ERAggI/AAAAAAAAABI/6bqLj198wxg/s1600/image+3.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_GvW8UOo5ICs/TQCy9ERAggI/AAAAAAAAABI/6bqLj198wxg/s1600/image+3.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;layering of drivers and devices&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;The IRP is passed to the upper filter driver and after processing it is passed to the&lt;br /&gt;function driver and then to the lower filter device driver and then finally to the bus&lt;br /&gt;driver.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;Device objects actually represents device at a particular driver layer. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 5pt 0in 5pt 0.5in; text-align: left; text-indent: -0.25in;"&gt;&lt;b&gt;PDO &lt;/b&gt;- a physical device object represents device at the lowest layer and also&lt;br /&gt;representing your physical device.&lt;/div&gt;&lt;div class="MsoNormal" style="margin: 5pt 0in 5pt 0.5in; text-align: left; text-indent: -0.25in;"&gt;&lt;b&gt;FDO&lt;/b&gt; - a function device object at function driver layer and is used by function&lt;br /&gt;drivers to manage device functionality &lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FiDO&lt;/b&gt; - a filter device object used by WDM filter drivers to store information&lt;br /&gt;about hardware&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&amp;nbsp; The IRP after processed by the bus driver is returned back in the same order.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;b&gt;How the System Finds and Loads Drivers:&lt;/b&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;A Plug and Play&lt;/b&gt; device has an electronic signature that the system can detect. For&lt;br /&gt;Plug and Play devices, a system bus driver detects the existence of the hardware(when&lt;br /&gt;it's plugged)&amp;nbsp; and reads this signature to determine what kind of hardware it is.&lt;br /&gt;Thereafter, an automatic process based on reading the registry or locating the INF files&lt;br /&gt;allows the system to find the correct driver for this device and then loading it.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;Here are the steps explaining the whole procedure:&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp; &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;step 1&lt;/b&gt; : When a bus driver detects the insertion or removal of hardware, it calls &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IoInvalidateDeviceRelations&lt;/span&gt;&lt;/span&gt; to notify the PnP Manager that new physical device&lt;br /&gt;has been plugged and create a PDO relevant to it.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;step 2&lt;/b&gt;: the pnp manager as a result of step 1,&amp;nbsp; has to update the list of physical device&lt;br /&gt;object by retrieving its information from bus driver, for this it sends an IRP with major&lt;br /&gt;function code &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IRP_MJ_PNP and minor function code IRP_MN_QUERY_DEVICE_&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;RELATIONS to bus driver. (major and minor functions codes are used to identify&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;the type of request ,here it’s a IRP_MJ_PNP request as a major function code to&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt; identify it’s a request for plug and play manager and the minor function code IRP_MN_QUERY_DEVICE_RELATIONS further identifies this request as it is&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;requesting for information of newly updated physical device represented by PDO )&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;Step 3&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;: &lt;/span&gt;&lt;/span&gt;In response to the bus relations query, the bus driver returns the information to&lt;br /&gt;the pnp manger..&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Step 4&lt;/b&gt;: the pnp manager using the information send by bus driver searches registry or&lt;br /&gt;locates inf file for installing device driver.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Step 5&lt;/b&gt;:&amp;nbsp; after loading of driver the pnp manager calls addevice to initialize your device.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Step 6&lt;/b&gt;: thereafter the pnp manager configures your driver and start your driver by&lt;br /&gt;sending an IRP with &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IRP_MJ_PNP(major function code)&lt;/span&gt;&lt;/span&gt; to your driver with the&lt;br /&gt;minor function code &amp;nbsp;&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IRP_MN_START_DEVICE.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-color: -moz-use-text-color -moz-use-text-color -moz-use-text-color windowtext; border-style: none none none solid; border-width: medium medium medium 1pt; padding: 0in; text-align: left;"&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=7859045228002919282&amp;amp;postID=3368957085152519884" name="BM20c5db80_0e63_4234_ab4a_71cb651e95f9"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;Interrupt Request Level&lt;/span&gt;&lt;/b&gt;:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;The OS assigns an interrupt request level to each hardware interrupt and to a &lt;br /&gt;few software events. The processor actually executes at a particular interrupt&lt;br /&gt;request level. When an interrupt occurs, the kernel raises the IRQL on the&lt;br /&gt;interrupting CPU to the level associated with that interrupt . The different&lt;br /&gt;levels with their assigned priority is shoen below.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCy_6qKYTI/AAAAAAAAABM/nEEPAoDjqw0/s1600/image+4.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCy_6qKYTI/AAAAAAAAABM/nEEPAoDjqw0/s1600/image+4.bmp" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/td&gt;&lt;td style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Interrupt request level&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;The activity of processing an interrupt is only to process an interrupt at a higher&lt;br /&gt;IRQL but never to process an interrupt at the same or a lower IRQL. To make&lt;br /&gt;it more clear suppose a thread is executing at PASSIVE_LEVEL and an another&lt;br /&gt;thread wants to interrupt it so this can be only done if the thread that is generating&lt;br /&gt;an interrupt is at higher level than PASSIVE_ LEVEL like APC_LEVEL or&lt;br /&gt;DISPATCH_LEVEL.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Significance of DISPATCH_LEVEL:&lt;/b&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;i&gt;Code executing at or above DISPATCH_LEVEL must not cause page faults. &lt;/i&gt;i.e. code or thread executing at DISPATCH_LEVEL OR above it needs to be in non-paged memory. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;To summarize, drivers are normally concerned with three interrupt request levels:&lt;/div&gt;&lt;ul style="text-align: left;" type="disc"&gt;&lt;li class="MsoNormal"&gt;PASSIVE_LEVEL,      at which many dispatch routines and a few special routines execute&lt;/li&gt;&lt;li class="MsoNormal"&gt;DISPATCH_LEVEL,      at which StartIo and DPC routines execute&lt;/li&gt;&lt;li class="MsoNormal"&gt;DIRQL,      at which an interrupt service routine executes&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&amp;nbsp;&lt;b&gt;&lt;span style="font-size: 14pt;"&gt;Spin Locks:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 14pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; font-family: inherit; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;To synchronize access to shared data in multiprocessor environment spin locks are&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt; used. In multiprocessor environment when many cpus try to access the shared data&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;can create problems as&amp;nbsp; more than one cpu may simultaneously access the shared&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;data. To avoid this we use spin locks , a processor can have access to shared data&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;only if it has acquired the spin lock for it and the other cpu has to wait.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCzFXRr4qI/AAAAAAAAABQ/EArI0KHoqN0/s1600/image+5.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="342" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCzFXRr4qI/AAAAAAAAABQ/EArI0KHoqN0/s640/image+5.bmp" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;mechanism for spin locks&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;The image above explains mechanism for spin locks .Cpu A acquires the spin lock&lt;br /&gt;at time t1 using the test and set mechanism . In test and set mechanism the cpu tests&lt;br /&gt;on a variable whether its free or not , if its free it sets the variable and acquires the&lt;br /&gt;spin lock. Now at time t2 cpu B tries to acquire spin lock using test and set&lt;br /&gt;mechanism , it tests for the variable and as it is set by cpu A it waits for it in a loop&lt;br /&gt;i.e it tests it again and again until it founds the variable free i.e. it spins between time&lt;br /&gt;interval of t2 and t3 and that’s why its called spin lock. Cpu A release the spin lock&lt;br /&gt;at t3 whereupon the cpu B&amp;nbsp; gets access to the shared variable.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;Spin lock are acquired at DISPATCH_LEVEL that means code acquiring the spin&lt;br /&gt;lock needs to be in non paged memory i.e. your shared data needs to be in non&lt;br /&gt;paged memory.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;WDM Driver Data Structures&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;This section introduces the data structures used in Windows drivers as well as how&lt;br /&gt;they are linked together to create a larger structure, which in turn provides a lot of&lt;br /&gt;functionality for device drivers. It is critical during initial driver routines that these&lt;br /&gt;structures are allocated, linked together, and accessed properly to avoid crashing&lt;br /&gt;the system (null pointers, malformed linked lists, etc).&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;b&gt;Driver and Device Objects&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Driver Objects:&lt;/b&gt; The I/O manager uses a DRIVER_OBJECT structure to represent each device driver. &lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQCzLoPgFbI/AAAAAAAAABU/Dbxcv0yVW-Q/s1600/image+6.bmp" style="margin-left: auto; margin-right: auto;" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;driver object structure&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQCzLoPgFbI/AAAAAAAAABU/Dbxcv0yVW-Q/s1600/image+6.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt; &lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;The structure is partially opaque i.e. in above image there are two fields, one&lt;br /&gt;with grey background and other with white background. The grey background&lt;br /&gt;field can’t be accessed directly and you can change these fields while the fields&lt;br /&gt;with white background can be accessed directly and can be modified , it’s just&lt;br /&gt;like private(grey background) and public members(white background).&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Device object(PDEVICE_OBJECT):&lt;/b&gt; points to your device which is to be&lt;br /&gt;handled by this driver .&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;PDEVICE_OBJECT actually specifies &amp;nbsp;type name of this field , that it’s a&lt;br /&gt;pointer to a device object similarly you can understand&amp;nbsp; for other type fields.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Driver extension(PDRIVER_EXTENSION):&lt;/b&gt; points to the add device routine&lt;br /&gt;and other initialization of your driver which is needed for creating device objects&lt;br /&gt;for your driver i.e. it is used by plug n play manager to load your device and&lt;br /&gt;creating it’s device object when it’s plugged.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="normal" style="text-align: left;"&gt;The basic responsibility of &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;AddDevice&lt;/span&gt;&lt;/span&gt; in a function driver is to create a device object&lt;br /&gt;and link it to the lower device object of this current device object( this is how stack&lt;br /&gt;is created). The steps involved are as follows:&lt;/div&gt;&lt;div class="normal" style="margin-left: 0.5in; text-align: left; text-indent: -0.25in;"&gt;1.&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Call &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IoCreateDevice&lt;/span&gt;&lt;/span&gt; to create a device object and an instance of your own&lt;br /&gt;device extension object.&lt;/div&gt;&lt;div class="normal" style="margin-left: 0.5in; text-align: left; text-indent: -0.25in;"&gt;2.&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Register one or more device interfaces so that applications know about the&lt;br /&gt;existence of your device. Alternatively, give the device object a name and then&lt;br /&gt;create a symbolic link.&lt;/div&gt;&lt;div class="normal" style="margin-left: 0.5in; text-align: left; text-indent: -0.25in;"&gt;3.&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Next initialize your device extension and the &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;Flags&lt;/span&gt;&lt;/span&gt; member of the device object.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;4.&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Call &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IoAttachDeviceToDeviceStack&lt;/span&gt;&lt;/span&gt; to put your new device object into the stack.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;HardwareDatabase (PUNICODE_STRING) &lt;/b&gt;describes a string that names a hardware&lt;br /&gt;database registry key for the device. This is a name like \Registry\Machine\Hardware\&lt;br /&gt;Description\System and names the registry key within which resource allocation&lt;br /&gt;information resides. WDM drivers have no need to access the information below this&lt;br /&gt;key because the PnP Manager performs resource allocation automatically. The name&lt;br /&gt;is stored in Unicode. (In fact, all kernel-mode string data uses Unicode.)&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;DriverInit(PDRIVER_INIT): &lt;/b&gt;points to your init routine of your driver.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;DriverStartIo (PDRIVER_STARTIO)&lt;/b&gt; :points to a function in your driver that&lt;br /&gt;processes I/O requests that the I/O Manager has serialized for you.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;FastIoDispatch (PFAST_IO_DISPATCH)&lt;/b&gt;: points to a table of function pointers&lt;br /&gt;that file system and network drivers export..&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;DriverStartIo (PDRIVER_STARTIO):&lt;/b&gt; points to your start io routine of your driver.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;DriverUnload(PDRIVER_UNLOAD):&lt;/b&gt; points to your unload routine for unloading&lt;br /&gt;your driver.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;MajorFunction (array of PDRIVER_DISPATCH):&lt;/b&gt; is a table of pointers to&lt;br /&gt;functions in your driver that handle each of the roughly two dozen types of&lt;br /&gt;I/O requests. For e.g. for an IRP with major function code such as&lt;br /&gt;IRP_MJ_READ it will contain a pointer to a dispatch read routine(which will&lt;br /&gt;process it) and similar other IRP’s with other routines.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Device object: &lt;/b&gt;points to your device and store information about it.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCzTBZJ3nI/AAAAAAAAABY/xOgxlr-3Nnw/s1600/image+7.bmp" style="margin-left: auto; margin-right: auto;" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;device object&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;b&gt;DriverObject (PDRIVER_OBJECT):&lt;/b&gt; points to the driver related to your device.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;NextDevice (PDEVICE_OBJECT): &lt;/b&gt;points to the next device object that belongs&lt;/div&gt;&lt;div style="text-align: left;"&gt;to the same driver as this one(for e.g. more then one usb drives will actually need&lt;/div&gt;&lt;div style="text-align: left;"&gt;only one driver to process it so we will use this nextdevice field of one usb drive&lt;/div&gt;&lt;div style="text-align: left;"&gt;to point to the other usb drive which will also be processed by the driver of the current&lt;/div&gt;&lt;div style="text-align: left;"&gt;usb drive). This field is the one that links device objects together starting from the driver&lt;/div&gt;&lt;div style="text-align: left;"&gt;object’s &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;DeviceObject&lt;/span&gt;&lt;/span&gt; member.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;CurrentIrp&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;PIRP&lt;/span&gt;&lt;/span&gt;):&lt;/b&gt; is used by the Microsoft IRP queuing routines &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;StartPacket&lt;/span&gt;&lt;/span&gt; and &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;StartNextPacket&lt;/span&gt;&lt;/span&gt; to record the IRP most recently sent to your &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;StartIo&lt;/span&gt;&lt;/span&gt; routine.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;b&gt;Flags (ULONG):&lt;/b&gt; contains a collection of flag bits(actually used to convey some type&lt;br /&gt;of information ). Table 2-2 lists the bits that are accessible to driver writers.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;(ULONG&amp;nbsp; : Unsigned 32-bit integer)&lt;/div&gt;&lt;table border="0" cellpadding="0" class="MsoNormalTable" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;thead&gt;&lt;tr&gt;    &lt;td colspan="2" style="padding: 0.75pt;"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;b&gt;Table 2-2. Flags in a DEVICE_OBJECT Data    Structure &lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Flag&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/thead&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;DO_BUFFERED_IO   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Reads   and writes use the buffered method&lt;br /&gt;(system copy buffer) for accessing   user-mode&lt;br /&gt;data.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;DO_EXCLUSIVE   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Only   one thread at a time is allowed to open&lt;br /&gt;a ­handle.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;DO_DIRECT_IO   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Reads   and writes use the direct method (memory&lt;br /&gt;descriptor list) for accessing   user-mode data.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;DO_DEVICE_INITIALIZING   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Device   object isn’t initialized yet.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;DO_POWER_PAGABLE   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;IRP_MJ_PNP   must be handled at PASSIVE_LEVEL.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;DO_POWER_INRUSH&lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Device   requires large inrush of current during power-on&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="border-color: -moz-use-text-color -moz-use-text-color -moz-use-text-color windowtext; border-style: none none none solid; border-width: medium medium medium 1pt; padding: 0in; text-align: left;"&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid;"&gt;&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;Characteristics&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;ULONG&lt;/span&gt;&lt;/span&gt;):&lt;/b&gt; is another collection of flag bits describing various&lt;br /&gt;optional&amp;nbsp; characteristics of the device. (See Table 2-3.) The I/O Manager&lt;br /&gt;initializes these flags based on an argument&lt;br /&gt;to &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IoCreateDevice(used to create device object related to driver)&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;Filter drivers propagate some of them upward in the device stack.&lt;/div&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" class="MsoNormalTable" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;thead&gt;&lt;tr&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Flag&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/thead&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_REMOVABLE_MEDIA   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Media   can be removed from device.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_READ_ONLY_DEVICE   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Media   can only be read, not written.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_FLOPPY_DISKETTE   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Device   is a floppy disk drive.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_WRITE_ONCE_MEDIA   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Media   can be written once.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_REMOTE_DEVICE   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Device   accessible through network ­&lt;br /&gt;connection.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_DEVICE_IS_MOUNTED   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Physical   media is present in device.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_VIRTUAL_VOLUME   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;This   is a virtual volume.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_AUTOGENERATED_DEVICE_NAME   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;I/O   Manager should automatically ­&lt;br /&gt;generate a name for this device.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;FILE_DEVICE_SECURE_OPEN   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Force   security check during open&lt;b&gt;.&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="border-color: -moz-use-text-color -moz-use-text-color -moz-use-text-color windowtext; border-style: none none none solid; border-width: medium medium medium 1pt; padding: 0in; text-align: left;"&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid;"&gt;&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;DeviceExtension&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;PVOID&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;: points to a data structure you define that will hold per&lt;br /&gt;-instance information about the device.(PVOID :Generic pointers)&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;The I/O Manager allocates space for the structure, but its name and contents&lt;br /&gt;are entirely up to you. A common convention is to declare a structure with the type name DEVICE_EXTENSION.&lt;br /&gt;To access it given a pointer (for example, fdo) to the&lt;br /&gt;device object, use a statement like this one:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;PDEVICE_EXTENSION&amp;nbsp;pdx&amp;nbsp;=&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&amp;nbsp;&amp;nbsp;(PDEVICE_EXTENSION)&amp;nbsp;fdo-&amp;gt;DeviceExtension;//&amp;nbsp; note this statement we will use&lt;br /&gt;//to access&lt;br /&gt;//the&amp;nbsp; driver extension of current driver.&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;DeviceType&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;DEVICE_TYPE&lt;/span&gt;&lt;/span&gt;):&lt;/b&gt; is an enumeration constant describing what type of&lt;br /&gt;device this is. The I/O Manager initializes this member based on an argument to&lt;br /&gt;&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IoCreateDevice&lt;/span&gt;&lt;/span&gt;.&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;StackSize&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;CHAR&lt;/span&gt;&lt;/span&gt;):&lt;/b&gt; counts the number of device objects starting from this one&lt;br /&gt;and descending all the way to the PDO (i.e. counting the device objects in driver&lt;br /&gt;layers .Refer diagram of driver layers and see the FiDO, FDO, PDO and we&lt;br /&gt;have to count all of them down the stack). The purpose of this field is to inform&lt;br /&gt;interested parties regarding how many stack locations should be created for an&lt;br /&gt;IRP that will be sent first to this device’s driver.&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;span class="programelement"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;AlignmentRequirement&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;ULONG&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;:specifies the required alignment for data&lt;br /&gt;buffers used in read or write requests to this device.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&amp;nbsp;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;THE WHOLE SCENARIO OF DRIVER OBJECT AND DEVICE OBJECT&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 12pt;"&gt;See how the device object maintains a queue and driver object relates to device object.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; page-break-after: avoid; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCzfGoM6EI/AAAAAAAAABc/3LOzJAuYjng/s1600/image+8.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="361" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCzfGoM6EI/AAAAAAAAABc/3LOzJAuYjng/s400/image+8.bmp" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;b&gt;DEVICE AND DRIVER OBJECTS RELATED TO EACH OTHER&lt;/b&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQCzlbDr7OI/AAAAAAAAABg/nOhnUYe-v8o/s1600/image+9.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;Working with Spin Locks :&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;To use a spin lock explicitly, allocate storage for a KSPIN_LOCK object in nonpaged&lt;br /&gt;memory. Then call KeInitializeSpinLock to initialize the object. Later, while running at or&lt;br /&gt;below DISPATCH_LEVEL, acquire the lock, perform the work that needs to be&lt;br /&gt;protected from interference, and then release the lock. For example, suppose your&lt;br /&gt;device extension contains a spin lock named QLock that you use for guarding access&lt;br /&gt;to a special IRP queue you’ve set up. You’ll initialize this lock in your AddDevice function:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;typedef&amp;nbsp;struct&amp;nbsp;_DEVICE_EXTENSION&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;KSPIN_LOCK&amp;nbsp;QLock;//definition of spin lock in&amp;nbsp; device extension&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;DEVICE_EXTENSION,&amp;nbsp;*PDEVICE_EXTENSION;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;NTSTATUS&amp;nbsp;AddDevice(...)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx&amp;nbsp;=&amp;nbsp;...;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;KeInitializeSpinLock(&amp;amp;pdx-&amp;gt;QLock);//this function initializes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;//&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;the spin lock for our device.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;Having&amp;nbsp; defining the spin lock we can acquire it for the shared data using &lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;KeAcquireSpinLock&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; and&lt;/span&gt;after working with it we release it using &lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;KeReleaseSpinLock.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;NTSTATUS&amp;nbsp;DispatchSomething(...)&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;KIRQL&amp;nbsp;oldirql;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx&amp;nbsp;=&amp;nbsp;...;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;KeAcquireSpinLock(&amp;amp;pdx-&amp;gt;QLock,&amp;nbsp;&amp;amp;oldirql);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;//the code between these two functions is the shared data for &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; //&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;which spin &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;lock has to be acquired&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;KeReleaseSpinLock(&amp;amp;pdx-&amp;gt;QLock,&amp;nbsp;oldirql);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;1.When      KeAcquireSpinLock acquires the spin lock, it also raises IRQL to&lt;/div&gt;&lt;div style="text-align: left;"&gt;DISPATCH_LEVEL and returns the current (that is, preacquisition) level in      the&lt;/div&gt;&lt;div style="text-align: left;"&gt;variable to which the second argument points.&lt;/div&gt;&lt;div style="text-align: left;"&gt;2.When      KeReleaseSpinLock releases the spin lock, it also lowers IRQL back to&lt;/div&gt;&lt;div style="text-align: left;"&gt;the      value specified in the second argument &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;Why device driver is an aspect of kernel programming?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;It is because it uses kernel routines for e.g. it will use Memory Manager (prefix Mm)&lt;/div&gt;&lt;div style="text-align: left;"&gt;component of windows to manage memory (prefix Mm means the name of the routine&lt;/div&gt;&lt;div style="text-align: left;"&gt;of this component will start with Mm) &amp;nbsp;and similarly the executive (prefix Ex) component&lt;/div&gt;&lt;div style="text-align: left;"&gt;of windows &amp;nbsp;supplies heap management and synchronization routines which we can use&lt;/div&gt;&lt;div style="text-align: left;"&gt;in our device drivers and to use any routine of executive and it will be having prefix Ex&lt;/div&gt;&lt;div style="text-align: left;"&gt;for e.g. like ExAllocatePool routine with prefix Ex defines it is a part of executive&lt;/div&gt;&lt;div style="text-align: left;"&gt;component. Here are components of windows that we use:&lt;/div&gt;&lt;div style="text-align: left;"&gt;1.The      I/O Manager (prefix Io) contains many service functions that drivers use.&lt;/div&gt;&lt;div style="text-align: left;"&gt;2.The      Process Structure module (prefix Ps) creates and manages kernel-mode      threads.&lt;/div&gt;&lt;div style="text-align: left;"&gt;An ordinary WDM driver might use an independent thread to      repeatedly poll a device&lt;/div&gt;&lt;div style="text-align: left;"&gt;incapable of generating interrupts, and for other      purposes.&lt;/div&gt;&lt;div style="text-align: left;"&gt;3.The      Memory Manager (prefix Mm) controls the page tables that define the      mapping&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp; of virtual addresses onto physical memory.&lt;/div&gt;&lt;div style="text-align: left;"&gt;4.The      executive (prefix Ex) supplies heap management and synchronization      services. &lt;/div&gt;&lt;div style="text-align: left;"&gt;5.The      Object Manager (prefix Ob) provides centralized control over the many data&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp; objects with which Windows XP works. WDM drivers rely on the Object      Manager&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp; for keeping a reference count that prevents an object from      disappearing while someone&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp; is still using it and to convert object handles      to pointers to the objects the handles represent.&lt;/div&gt;&lt;div style="text-align: left;"&gt;6.The      Security Reference Monitor (prefix Se) allows file system drivers to      perform security&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp; checks. &lt;/div&gt;&lt;div style="text-align: left;"&gt;7.The      so-called run-time library component (prefix Rtl) contains utility      routines, such as list&lt;/div&gt;&lt;div style="text-align: left;"&gt;and string-management routines, that kernel-mode      drivers can use instead of regular ANSI&lt;/div&gt;&lt;div style="text-align: left;"&gt;-standard library routines such as      RtlInitUnicodeString() routine. For the most part, the&lt;/div&gt;&lt;div style="text-align: left;"&gt;operation of these      functions is obvious from their names, and you would pretty much know&lt;/div&gt;&lt;div style="text-align: left;"&gt;how      to use them in a program if you just were aware of them. &lt;/div&gt;&lt;div style="text-align: left;"&gt;8.Windows      XP implements the native API for kernel-mode callers using routine names      that&lt;/div&gt;&lt;div style="text-align: left;"&gt;begin with the prefix Zw. The DDK documents just a few of the&amp;nbsp; ZwXxx      functions, namely&lt;/div&gt;&lt;div style="text-align: left;"&gt;the ones that pertain to registry and file access. &lt;/div&gt;&lt;div style="text-align: left;"&gt;9.The      Windows XP kernel (prefix Ke) is where all the low-level synchronization      of activities&lt;/div&gt;&lt;div style="text-align: left;"&gt;between threads and processors occurs  &lt;b&gt;&lt;span style="font-size: 16pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;Basic components of WDM driver:-&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;A driver can be considered as a container for a collection of subroutines that the&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; operating system calls to perform various operations that relate to your hardware. These &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; routines can be broadly classified into three categories namely Basic Driver Routines ,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I/O Control Routines and Dispatch Routine.   &lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQCzlbDr7OI/AAAAAAAAABg/nOhnUYe-v8o/s1600/image+9.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="343" src="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQCzlbDr7OI/AAAAAAAAABg/nOhnUYe-v8o/s400/image+9.bmp" width="400" /&gt;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/a&gt;&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;How operating system calls subroutines of driver:&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;1. The user plugs in your device, so the system loads your driver executable into virtual&lt;br /&gt;memory and calls your DriverEntry routine. DriverEntry does a few things&amp;nbsp; and returns.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;2. The Plug and Play Manager (PnP Manager) calls your AddDevice routine, which does&lt;br /&gt;a few things and returns.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;3. The PnP Manager sends you a few IRPs. Your dispatch function processes each IRP in&lt;br /&gt;turn and returns.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;4. An application opens a handle to your device, whereupon the system sends you&amp;nbsp; another&lt;br /&gt;IRP. Your dispatch routine does a little work and returns.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;5. The application tries to read some data, whereupon the system sends you an IRP. Your&lt;br /&gt;dispatch routine puts the IRP in a queue and returns.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;6. A previous I/O operation finishes by signaling a hardware interrupt to which your driver is&lt;br /&gt;connected. Your interrupt routine does a little bit of work, schedules a DPC , and returns.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;7. Your DPC routine runs. Among other things, it removes the IRP you queued at step 5 , send&lt;br /&gt;it to your driver and programs your hardware to read the data. Then the DPC routine returns&lt;br /&gt;to the system.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;8. Time passes, during which the system makes many other brief calls into your subroutines.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;9. Eventually, the end user unplugs your device. The PnP Manager sends you some IRPs, which&lt;br /&gt;you process and return. The operating system calls your DriverUnload routine, which usually&lt;br /&gt;just does a tiny amount of work and returns. Then the system removes your driver code from&lt;br /&gt;virtual memory.&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;Basic Driver Routine-&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;b&gt;Driver Entry Routine -&lt;/b&gt; Every WDM driver, regardless of its purpose, has to expose&lt;br /&gt;a routine whose name is &lt;b&gt;DriverEntry&lt;/b&gt;. This is the routine called when pnp manager loads&lt;br /&gt;your driver for the first device object.This routine is used for global initialization of your&lt;br /&gt;driver by initializing&amp;nbsp; various driver data structures and prepares the environment for all the&lt;br /&gt;other driver components.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;Syntax of DriverEntry routine:&lt;/div&gt;&lt;pre&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;extern "C" NTSTATUS&amp;nbsp;DriverEntry(IN&amp;nbsp;PDRIVER_OBJECT&amp;nbsp;DriverObject,&lt;/span&gt;&lt;/pre&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;IN&amp;nbsp;PUNICODE_STRING&amp;nbsp;RegistryPath)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span class="keyword"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IN&lt;/span&gt;&lt;/span&gt; parameter, you’re supposed to infer that it’s purely input to your function.&lt;br /&gt;The first argument to DriverEntry is a pointer to a barely initialized driver&lt;br /&gt;object that represents your driver.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;The second argument to DriverEntry is the name of the service key in the registry&lt;br /&gt;that means this key in your registry stores information about your driver service like&lt;br /&gt;its name , path of files etc.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;A WDM driver’s main job in DriverEntry is to fill in the various function pointers in&lt;br /&gt;the driver object. These pointers indicate to the operating system where to find the&lt;br /&gt;subroutines you’ve decided to place in your driver container. They include these pointer&lt;br /&gt;members of the driver object:&lt;/div&gt;&lt;ul style="text-align: left;" type="disc"&gt;&lt;li class="MsoNormal"&gt;&lt;b&gt;DriverUnload &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;Set this to point to whatever cleanup routine you create. The I/O Manager will&lt;br /&gt;call this routine just prior to unloading the driver. If there’s nothing to clean up,&lt;br /&gt;you need to have a DriverUnload function for the system to be able to unload&lt;br /&gt;your driver dynamically.&lt;/div&gt;&lt;ul style="text-align: left;" type="disc"&gt;&lt;li class="MsoNormal"&gt;&lt;b&gt;DriverExtension-&amp;gt;AddDevice &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;Set this to point to your AddDevice function. The PnP Manager will call AddDevice&lt;br /&gt;once for each hardware instance you’re responsible for. &lt;/div&gt;&lt;ul style="text-align: left;" type="disc"&gt;&lt;li class="MsoNormal"&gt;&lt;b&gt;DriverStartIo &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;If your driver uses the standard method of queuing I/O requests, you’ll set this&lt;br /&gt;member of the driver object to point to your StartIo routine.&amp;nbsp; It is discussed&lt;br /&gt;about queuing I/O requests in IRP processing.&lt;/div&gt;&lt;ul style="text-align: left;" type="disc"&gt;&lt;li class="MsoNormal"&gt;&lt;b&gt;MajorFunction &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;The I/O Manager initializes various IRP requests based upon their major&lt;br /&gt;function codes to point to dispatch function that will serve this request. &lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;For e.g. this statement in driver entry routine &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp; DriverObject-&amp;gt;MajorFunction[IRP_MJ_PNP]&amp;nbsp;=&amp;nbsp;DispatchPnp;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;Will initialize the IRP with major function code IRP_MJ_PNP&amp;nbsp;&amp;nbsp; to be&lt;br /&gt;processed by a dispatch routine named DispatchPnp.&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in; text-align: left;"&gt;Here is the driver entry routine defined in init.cpp module:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span style="font-size: 20pt;"&gt;&amp;nbsp;Init.cpp&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// init.cpp:Driver initialization code&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;///////////////////////////////////////////////////////////////////////////////////////////////&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//DriverEntryInitialization entry point&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//Wdm1UnloadUnload driver routine&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//////////////////////////////////////////////////////////////////////////////////////////////&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// Version history&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#include “wdm1.h” //including header file which contains the definition of functions and&lt;br /&gt;//definition of&amp;nbsp; driver extension which we have included here. &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#pragma code_seg(”INIT”) // we have to assign our code and data in paged pool or non paged&lt;br /&gt;//pool. We use pragma code_seg(“INIT”) to define the code “INIT"&amp;nbsp; in paged pool and the code is&lt;br /&gt;//starting after this definition and ending till another #pragma code_seg() definiton.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;/////////////////////////////////////////////////////////////////////////////////////////////&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// DriverEntry;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//Description;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// This function initializes the driver, and creates&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// any object needed to process I/O requests.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//Arguments;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// Pointer to the driver object&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// registry path string for driver service key&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// Return Value;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// This function returns STATUS_XXX&amp;nbsp; , it is discussed&amp;nbsp; in add driver routine.. &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;extern “C”&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;NTSTATUS DriverEntry( IN PRIVER_OBJECT DriverObject,&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;IN PUNICODE_STRING RegistryPath)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;NTSTATUS status = STATUS_SUCCESS;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#if DBG//a driver is build using check or free build . DBG is used how we want to build our&lt;br /&gt;//driver (checked or build).&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrintInit(“Wdm1 checked”);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#else&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrintInit(“Wdm1 free”);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#endif&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrint(“RegistryPath is %T”, RegistryPath);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// Export other driver entry points...&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;DriverExtension-&amp;gt;AddDevice=Wdm1AddDevice;//initializing the add device&lt;br /&gt;//routine as Wdm1AddDevice and storing its pointer at&lt;br /&gt;//DriverObject-&amp;gt;DriverExtension-&amp;gt;AddDevice&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;DriverUnload=Wdm1Unload;//initializing the unload routine.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;MajorFunction[IRP_MJ_CREATE]=Wdm1Create;//this will initialize an IRP&lt;br /&gt;//with major function code[IRP_MJ_CREATE] to be processed by Wdm1Create routine.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;MajorFunction[IRP_MJ_CLOSE]=Wdm1Close;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;MajorFunction[IRP_MJ_PNP]=Wdm1Pnp;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;MajorFunction[IRP_MJ_CREATE]=Wdm1Power;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;MajorFunction[IRP_MJ_READ]=Wdm1Read;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;MajorFunction[IRP_MJ_WRITE]=Wdm1Write;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;MajorFunction[IRP_MJ_DEVICE_CONTROL]=Wdm1DeviceControl;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DriverObject-&amp;gt;MajorFunction[IRP_MJ_SYSTEM_CONTROL]=Wdm1SystemControl;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//Initialise spin lock with protects acess to shared memory buffer. Spin locks are used to avoid&lt;br /&gt;//various synchronization problems and other problems caused when many processors tries to&lt;br /&gt;//access same variable.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;keInitializeSpinLock(&amp;amp;BufferLock);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrintMsg(“DriverEntry completed”);//its just like your printf(“”) in c and is used to print &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//messages on kernel.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;return status;//return status whether the code completed with success or error.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;}&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#pragma code_seg() //end INIT section&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//////////////////////////////////////&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//Wdmunload&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//description&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//unload the driver by removing any remaining objects, etc.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//arguments:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//pointer to the driver object//&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//return value:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//none&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#pragma code_seg(“PAGE”) // start PAGE section&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;VOID Wdm1Unload(IN PDRIVER-OBJECT DriverObject)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//free buffer(do not need to acquire spin lock)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;If(Buffer!=NULL)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;ExFreePool(Buffer);// ExFreePool(Buffer) is used to free the memory occupied by buffer and&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;// similiarly for occupying the memory we use ExAllocatePool() or ExAllocatePoolWithTag().&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrintMsg(“WDM1Unload”);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrintClose();&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;}&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//////////////////////////////////////////////////////////////////////&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#pragma code_seg() // end PAGE section&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=7859045228002919282&amp;amp;postID=3368957085152519884" name="BM62115d7b_f064_4616_a499_6d8d2490ad78"&gt;&lt;/a&gt; &lt;b&gt;The Add Device Routine:&amp;nbsp; &lt;/b&gt;&lt;br /&gt;The adddevice routine is basically used to initialize&amp;nbsp; every device associated with&lt;br /&gt;your device driver. The DriverEntry routine is basically used to globally initialize your&lt;br /&gt;driver and each time a device relating to this driver is plugged the PNP manager calls&lt;br /&gt;your AddDevice routine to initialize your device.&lt;br /&gt;The function has the following skeleton:&lt;br /&gt;&lt;br /&gt;NTSTATUS&amp;nbsp;AddDevice(PDRIVER_OBJECT&amp;nbsp;DriverObject, PDEVICE_OBJECT&amp;nbsp;pdo)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&amp;nbsp;STATUS_SOMETHING;&amp;nbsp;&amp;nbsp;//&amp;nbsp;e.g.,&amp;nbsp;STATUS_SUCCESS&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;The DriverObject argument points to the same driver object that you initialized&lt;br /&gt;in your DriverEntry routine. The pdo argument is the address of the physical device&lt;br /&gt;object at the bottom of the device stack.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;b&gt;The basic responsibility of AddDevice in a function driver is to create a device&lt;/b&gt;&lt;br /&gt;&lt;b&gt;object and link it into the stack rooted in this PDO.&lt;/b&gt;&lt;br /&gt;The steps involved are as follows:&lt;/div&gt;&lt;ol start="1" style="text-align: left;" type="1"&gt;&lt;li class="MsoNormal"&gt;Call      IoCreateDevice to create a device object and an instance of your own&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;      device extension object.&lt;/li&gt;&lt;li class="MsoNormal"&gt;Register      one or more device interfaces so that applications know about the &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;      existence of your device. Alternatively, give the device object a name and      then&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create a symbolic link.&lt;/li&gt;&lt;li class="MsoNormal"&gt;Next      initialize your device extension and the Flags member of the device      object.&lt;/li&gt;&lt;li class="MsoNormal"&gt;Call      IoAttachDeviceToDeviceStack to put your new device object into the stack.&lt;/li&gt;&lt;/ol&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;b&gt;Creating a Device Object&lt;/b&gt; &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;You create a device object by calling IoCreateDevice.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;For example:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;PDEVICE_OBJECT&amp;nbsp;fdo;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;NTSTATUS&amp;nbsp;status&amp;nbsp;=&amp;nbsp;IoCreateDevice(DriverObject,&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;sizeof(DEVICE_EXTENSION),&amp;nbsp;NULL,&amp;nbsp;FILE_DEVICE_UNKNOWN,&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;FILE_DEVICE_SECURE_OPEN,&amp;nbsp;FALSE,&amp;nbsp;&amp;amp;fdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;The first argument DriverObject&amp;nbsp; establishes the connection between your driver&lt;br /&gt;and the new device object, thereby allowing the I/O Manager to send you IRPs&lt;br /&gt;intended for the device.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;The second argument is the size of your device extension structure.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;The third argument, which is NULL in this example, can be the address of a&lt;br /&gt;UNICODE_STRING providing a name for the device object.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;The fourth argument (FILE_DEVICE_UNKNOWN) is one of the device&lt;br /&gt;types defined in WDM.H&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;The fifth argument (FILE_DEVICE_SECURE_OPEN) provides the&lt;br /&gt;Characteristics flag for the device object.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;The sixth argument to IoCreateDevice (FALSE in my example) indicates&lt;br /&gt;whether the device is exclusive. The I/O Manager allows only one handle to be&lt;br /&gt;opened by normal means to an exclusive device.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;The last argument (&amp;amp;fdo) points to a location where IoCreateDevice will store&lt;br /&gt;the address of the device object it creates.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&lt;b&gt;How to check IoCreateDevice for an error whether it has successfully created&lt;/b&gt;&lt;br /&gt;&lt;b&gt;a device or not.&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;For this we use a NTSTATUS&amp;nbsp;code.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;An NTSTATUS code actually stores certain status codes returned by a function&lt;br /&gt;indicating it has completed successfully or some type of error has occurred.&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;The format for it is like:&lt;/div&gt;&lt;pre&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;NTSTATUS&amp;nbsp;status&amp;nbsp;=&amp;nbsp;IoCreateDevice(...); //general syntax of NTSTATUS code&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//status stores the status code.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: small;"&gt;Here are certain status codes :&lt;/span&gt;&lt;/pre&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;STATUS_SUCCESS&amp;nbsp;&amp;nbsp;&amp;nbsp; //indicates that function completed successfully.&lt;/div&gt;&lt;div class="normal" style="text-align: left;"&gt;STATUS_INVALID_PARAMETER&amp;nbsp; //indicating an error has occurred relating to invalid&lt;br /&gt;//parameter&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;There are other certain status codes each identifying a particular error as shown below:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;STATUS_NO_SUCH_FILE &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;STATUS_ACCESS_DENIED &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;STATUS_INVALID_DEVICE_REQUEST &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;ERROR_BUFFER_TOO_SMALL &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;STATUS_DATA_ERROR &lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;pre&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;Now we can check for error by using the value of status.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;if&amp;nbsp;(!NT_SUCCESS(status))// NT_SUCCESS(status) returns true if it completes&amp;nbsp; successfully&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; {&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;status;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;}&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;if&amp;nbsp;(&amp;lt;some&amp;nbsp;other&amp;nbsp;error&amp;nbsp;discovered&amp;gt;)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;IoDeleteDevice(fdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;status;&lt;/div&gt;&lt;pre&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt;"&gt;NT_SUCCESS macro is actually used to check whether the function completed without error.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: small;"&gt;&lt;b&gt;The second function of add device routine is to name your&lt;br /&gt;device so that an application can access it.&amp;nbsp;&lt;/b&gt;The earlier version used naming your device and then creating a symbolic&lt;br /&gt;link which can be used by application to access it. For e.g. c:\ is a symbolic&lt;br /&gt;name &amp;nbsp;for your hard disk partition 1(device) and this will be pointing to your&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: small;"&gt;device as Device\HardDiskVolume1(name of your device).&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: small;"&gt;The application will actually access your device using symbolic name c:\ but&lt;br /&gt;this scheme has drawbacks. So we use a new technique of naming a device called&lt;br /&gt;interfaces. We actually register an interface with a device which creates a&lt;br /&gt;symbolic name for it. It does it by using GUID. GUID is a 128 –bit value which&lt;br /&gt;is generated by running tools like UUIDGEN or GUIDGEN. Just run GUIDGEN and it&lt;br /&gt;will generate a 128 –bit value for your device which we can use in our&lt;br /&gt;interface. We use this 128- bit generated GUID with the help of DEFINE_GUID&lt;br /&gt;macro , assigns a better mnemonic for this value and place it in our header&lt;br /&gt;file to say “ guids.h”.&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;For e.g.&lt;/pre&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//&amp;nbsp;{CAF53C68-A94C-11d2-BB4A-00C04FA330A6} is generated GUID by GUIDGEN&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//we will use it by using DEFINE_GUID macro. &lt;br /&gt;DEFINE_GUID(&amp;lt;&amp;lt;name&amp;gt;&amp;gt;,&lt;br /&gt;0xcaf53c68,&amp;nbsp;0xa94c,&amp;nbsp;0x11d2,&amp;nbsp;0xbb,&amp;nbsp;0x4a,&amp;nbsp;0x0,&amp;nbsp;0xc0,&amp;nbsp;0x4f,&lt;br /&gt;0xa3,&amp;nbsp;0x30,&amp;nbsp;0xa6);&lt;br /&gt;// name can be replaced by GUID_DEVINTERFACE_SIMPLE&lt;br /&gt;//Now we can define our interface using this GUID.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#include "guids.h"&amp;nbsp; //the header file containing&amp;nbsp; the DEFINE_GUID or&lt;br /&gt;//GUID_DEVINTERFACE_SIMPLE definition&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;NTSTATUS&amp;nbsp;AddDevice(...)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IoRegisterDeviceInterface(pdo,&amp;nbsp;&amp;amp;GUID_DEVINTERFACE_SIMPLE,&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in 5pt 0.25in; padding: 0in; text-align: left; text-indent: -0.25in;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,&amp;nbsp;&amp;amp;pdx-&amp;gt;ifname);&amp;nbsp;&amp;nbsp; }&lt;br /&gt;IoRegisterDeviceInterface registers your interface . The first parameter is pdo&lt;br /&gt;representing your physical device object , and GUID_DEVINTERFACE_SIMPLE&lt;br /&gt;is for GUID as represented by this mnemonic , the third parameter additional qualified&lt;br /&gt;names that further subdivide your interface. The last argument is the address of a&lt;br /&gt;UNICODE_STRING structure that will receive the name of a symbolic link that&lt;br /&gt;resolves to this device object( the address of this symbolic name is in device extension&lt;br /&gt;structure's field "ifname"so we access it as pdx -&amp;gt;ifname).&lt;/div&gt;&lt;div class="normal" style="text-align: left;"&gt;The return value from &lt;span class="programelement"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;IoRegisterDeviceInterface&lt;/span&gt;&lt;/span&gt; is a Unicode string that applications&lt;br /&gt;will be able to determine without knowing anything special about how you coded your&lt;br /&gt;driver and will then be able to use in opening a handle to the device. The name is pretty&lt;br /&gt;ugly, by the way; here’s an example . \\?\ROOT#UNKNOWN#0000#{b544b9a2-6995-11d3-81b5-00c04fa330a6}..&lt;/div&gt;&lt;div class="normal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal" style="text-align: left;"&gt;&lt;b&gt;The third task is to initialize the device extension structure&lt;/b&gt;. To initialize the device&lt;br /&gt;extension structure we should know what is a device extension structure.&lt;/div&gt;&lt;div class="normal" style="text-align: left;"&gt;It has the following syntax.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;typedef&amp;nbsp;struct&amp;nbsp;_DEVICE_EXTENSION&amp;nbsp;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PDEVICE_OBJECT&amp;nbsp;DeviceObject;// points to related device&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PDEVICE_OBJECT&amp;nbsp;LowerDeviceObject; //address for lower device object&lt;br /&gt;//attached to this device (recall device and driver layers)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PDEVICE_OBJECT&amp;nbsp;Pdo;// points to the physical device (lowest in stack)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UNICODE_STRING&amp;nbsp;ifname;//here we store the symbolic name for our&lt;br /&gt;//driver(as we have done in interface)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IO_REMOVE_LOCK&amp;nbsp;RemoveLock;// this is used to decide when it is safe to&lt;br /&gt;//remove the device object&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DEVSTATE&amp;nbsp;devstate;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // for remembering &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEVSTATE&amp;nbsp;prevstate;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // certain&amp;nbsp; &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DEVICE_POWER_STATE&amp;nbsp;devpower;&amp;nbsp; // power and device &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SYSTEM_POWER_STATE&amp;nbsp;syspower; //states.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DEVICE_CAPABILITIES&amp;nbsp;devcaps;//stores certain capabilities of a certain&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//device as initialized by pnp manger&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;DEVICE_EXTENSION,&amp;nbsp;*PDEVICE_EXTENSION;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;so it's pretty clear what a device extension structure actually contains. &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;Here is how to initialize the value of these fields:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;NTSTATUS&amp;nbsp;AddDevice(...)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;PDEVICE_OBJECT&amp;nbsp;fdo;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;IoCreateDevice(...,&amp;nbsp;sizeof(DEVICE_EXTENSION),&amp;nbsp;...,&amp;nbsp;&amp;amp;fdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx&amp;nbsp;=&amp;nbsp;(PDEVICE_EXTENSION)&amp;nbsp;fdo-&amp;gt;DeviceExtension;&lt;br /&gt;//getting access to device extension using fdo which is passed in parameter.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;pdx-&amp;gt;DeviceObject&amp;nbsp;=&amp;nbsp;fdo;// initializing the first field with device&lt;br /&gt;//object(fdo)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;pdx-&amp;gt;Pdo&amp;nbsp;=&amp;nbsp;pdo;//initializing the pdo&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;IoInitializeRemoveLock(&amp;amp;pdx-&amp;gt;RemoveLock,&amp;nbsp;...);//function is used to&lt;br /&gt;//initialize the removelcok field &lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;pdx-&amp;gt;devstate&amp;nbsp;=&amp;nbsp;STOPPED;//setting device state as stopped&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;pdx-&amp;gt;devpower&amp;nbsp;=&amp;nbsp;PowerDeviceD0;//setting the state of device power&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;pdx-&amp;gt;syspower&amp;nbsp;=&amp;nbsp;PowerSystemWorking;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;IoRegisterDeviceInterface(...,&amp;nbsp;&amp;amp;pdx-&amp;gt;ifname);//storing the symbolic name&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;pdx-&amp;gt;LowerDeviceObject&amp;nbsp;=&amp;nbsp;IoAttachDeviceToDeviceStack(...);//attaching it to&lt;br /&gt;//the lower device object.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;b&gt;The fourth task of add device routine is of attaching it to the lower device object&lt;/b&gt;&lt;br /&gt;&lt;b&gt;and building the stack.&lt;/b&gt; For this we use IoAttachDeviceToDeviceStack and pass&lt;br /&gt;the current device object and PDO and in turn it returns the address of lower&lt;br /&gt;device object which is just below this one&lt;b&gt;.&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;NTSTATUS&amp;nbsp;AddDevice(...,&amp;nbsp;PDEVICE_OBJECT&amp;nbsp;pdo)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;PDEVICE_OBJECT&amp;nbsp;fdo;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;IoCreateDevice(...,&amp;nbsp;&amp;amp;fdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;pdx-&amp;gt;LowerDeviceObject&amp;nbsp;=&amp;nbsp;IoAttachDeviceToDeviceStack(fdo,&amp;nbsp;pdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div class="normal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal" style="text-align: left;"&gt;Now putting all the above pieces together :&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;b&gt;&lt;span style="font-size: 18pt;"&gt;Pnp.cpp&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#define INITGUID // containing your GUID definition.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#include “wdm1.h”&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;#pragma code_seg(“PAGE”) // start page section&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//Wdm1ADDDevice:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//description&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//cope with a new pnp device being added here usually just attach to the top of driver stack&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//do not talk to device here&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// arguments:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//pointers to driver object&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//pointer to physical device object&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//return value:&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;NTSTATUS Wdm1ADDDevice(IN PDRIVER-OBJECT DriverObject IN&lt;br /&gt;PDEVICE_OBJECT pdo)&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrint(“ADDDevice”);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;NTSTATUS status;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;PDEVICE_OBJECT fdo;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//create our functional device object in fdo&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;Status = IoCreateDevice(DriverObject, Sizeof(WDM1_DEVICE-EXTENSION);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;NULL ,// no name&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;FILE_DEVICE_UNKNOWN,&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;FALSE, // NOT EXCLUSIVE&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&amp;amp;fdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;If(!NT_SUCESS(status))&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;Return status;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//remember fdo in our device extension&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;PWDM1-&amp;gt;DEVICE_EXTENSION dx= (PWDM1-&amp;gt;DEVICE_EXTENSION)&lt;br /&gt;fdo-&amp;gt;DeviceExtension;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;dx-&amp;gt;fdo=fdo;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrint(“FDO is %x”, fdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;// register and enable our device interface&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;Status = IoRegisterDeviceInterface(pdo,&amp;amp;WDM1_GUID,NULL,&amp;amp;dx-&amp;gt;ifSymLinkName);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;If(!NT_SUCECC(status))&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;{&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;IoDeleteDevice(fdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;Return status;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;}&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;IoSetDeviceInterfaceState(&amp;amp;dx-&amp;gt;ifSymLinkName);// starting the interface&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;DebugPrint(“symbolic link name is %t”, &amp;amp;dx-&amp;gt; ifSysLinkName);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//attach to the driver stack below us&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;dx-&amp;gt;NextStackDevice = IoAttachDeviceToDeviceStack(fdo,pdo);&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;//Set fdo flags apporiately&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;fdo-&amp;gt;Flags &amp;amp;= DO_DEVICE_INITIALIZING;// initializing the flags&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;fdo-&amp;gt;Flags = DO_BUFFERED_IO;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;return STATUS_SUCESS;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;}&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&amp;nbsp;&lt;span style="font-size: 16pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="border: medium none; margin: 5pt 0in; padding: 0in; text-align: left;"&gt;&lt;span style="font-size: 16pt;"&gt;I/O Control Routine&lt;/span&gt;- &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;The StartIo routine&lt;/b&gt; – &amp;nbsp;The driver StartIo field points to this routine. I/O&lt;br /&gt;Manager calls the StartIo routine to process one IRP at a time and mark it&lt;br /&gt;as busy thereafter if any IRP arrives it is placed in queue i.e. it is used in queuing&lt;br /&gt;IRP. The StartIo routine needs to access hardware registers that are also used&lt;br /&gt;by the interrupt service routine (ISR) and, perhaps by other routines in the driver.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The OnInterrupt routine&lt;/b&gt; - It is an interrupt service routine (ISR) and is used to&lt;br /&gt;process an interrupt. Suppose when device finishes processing IRP it will generate&lt;br /&gt;a interrupt that its now free and send it any more queued IRP .This interrupt will be&lt;br /&gt;serviced by ISR which is registered to this interrupt using OnInterrupt routine.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;The DpcForlsr routine&lt;/b&gt; - This ISR also registers a DPC(DEFFERED&lt;br /&gt;PROCEDURE CALL) routine with it using DpcforIsr routine. This DPC routine&lt;br /&gt;actually is responsible for finishing the current IRP that caused interrupt thereafter&lt;br /&gt;dequeueing the next IRP and sending it to the startio routine.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dispatch Routine&lt;/b&gt;- A Dispatch routine is actually used to process an IRP based&lt;br /&gt;upon driver entry routine. We have registered this routines in our driver entry routine with&lt;br /&gt;certain MAJOR FUNCTION code.Every IRP with a major function code will point to a&lt;br /&gt;certain dispatch routine. The dispatch routine processes the IRP and may pass it to the&lt;br /&gt;lower driver. If not needed it may queue it for later processing.&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;I/O REQUEST PACKET:&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;irp actually contains the user request i.e it represents a request for e.g. it can be &lt;/div&gt;&lt;div class="MsoNormal"&gt;a read/write request which has to be processed by the device driver. It is passed&lt;br /&gt;to the driver which is on the top of stack . The irp is processed by this driver and after processing&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;it is passed to the lower driver.&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQDCG1wPMlI/AAAAAAAAABk/zWQ1G1WOBzA/s1600/image+10.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="284" src="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQDCG1wPMlI/AAAAAAAAABk/zWQ1G1WOBzA/s320/image+10.bmp" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;irp processed by driver layers&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;There are two data structures to handle I/O requests: the I/O request packet itself and the &lt;span class="programelement"&gt;IO_STACK_LOCATION&lt;/span&gt; structure.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&lt;b&gt;STRUCTURE OF I/O REQUEST/PACKET:&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_GvW8UOo5ICs/TQDCs3GhWBI/AAAAAAAAABo/wrO9MLVEu9Q/s1600/image+11.bmp" style="margin-left: auto; margin-right: auto;" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;structure of i/o request packet&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="http://1.bp.blogspot.com/_GvW8UOo5ICs/TQDCs3GhWBI/AAAAAAAAABo/wrO9MLVEu9Q/s1600/image+11.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Here in the above image you can see two types of fields : one with grey background&lt;br /&gt;and other with white background. The grey background fields are the one which cannot be &lt;/div&gt;&lt;div class="MsoNormal"&gt;Accessed by us just like private members of the class while the&amp;nbsp; fields with white&lt;br /&gt;background are the one which can be accessed directly and can be modified by us&lt;br /&gt;just like to public members.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;IRP data structure actually is called as IRP HEADER and contains . The header&lt;br /&gt;of each IRP contains data that is used by each driver handling the IRP.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;The header of each IRP contains pointers to the following: &lt;br /&gt;&lt;ul type="disc"&gt;&lt;li class="MsoNormal"&gt;Buffers to read the input and      write the output of the IRP.&lt;/li&gt;&lt;li class="MsoNormal"&gt;A memory area for the driver      that currently owns the IRP.&lt;/li&gt;&lt;li class="MsoNormal"&gt;A routine, supplied by the      driver that currently owns the IRP, which the &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; operating system calls if      the IRP is cancelled.&lt;/li&gt;&lt;li class="MsoNormal"&gt;The parameters for the      current sub-request.&lt;/li&gt;&lt;li class="MsoNormal"&gt;In addition to the pointers,      the IRP header contains other data that describes &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; the nature and state of      the request.&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="programelement"&gt;&lt;b&gt;MdlAddress&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;PMDL&lt;/span&gt;) and &lt;span class="programelement"&gt;UserBuffer&lt;/span&gt; (&lt;span class="programelement"&gt;PVOID&lt;/span&gt;):&lt;/b&gt;&amp;nbsp; fields are basically Buffers&lt;br /&gt;to read the input and write the output of the IRP.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&lt;span class="programelement"&gt;&lt;b&gt;Flags&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;ULONG&lt;/span&gt;) , &lt;span class="programelement"&gt;IoStatus&lt;/span&gt; (&lt;span class="programelement"&gt;IO_STATUS_BLOCK&lt;/span&gt;) ,&lt;span class="programelement"&gt; RequestorMode ,&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="programelement"&gt; PendingReturned&lt;/span&gt; (&lt;span class="programelement"&gt;BOOLEAN&lt;/span&gt;) &amp;nbsp;:&lt;/b&gt; contains other data that describes the&lt;br /&gt;nature and state of the request.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="programelement"&gt;&lt;b&gt;AssociatedIrp&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (union):&lt;/b&gt; A memory area for the driver that currently owns the IRP.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="programelement"&gt;&lt;b&gt;Cancel&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;BOOLEAN&lt;/span&gt;) , &lt;span class="programelement"&gt;CancelIrql&lt;/span&gt; (&lt;span class="programelement"&gt;KIRQL&lt;/span&gt;) , &lt;span class="programelement"&gt;CancelRoutine&lt;/span&gt; (&lt;span class="programelement"&gt;PDRIVER_CANCEL&lt;/span&gt;):&lt;/b&gt;&lt;br /&gt;fields are actually used for a routine, supplied by the driver that currently owns the&lt;br /&gt;IRP, which the operating system calls if the IRP is cancelled.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Tail: &lt;/b&gt;field is actually the&amp;nbsp; parameters for the current sub-request and is a union of&lt;br /&gt;ail.overlay and tail.apc and tail.completionkey and here it’s described in image.&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQDDXqNxJGI/AAAAAAAAABs/zqk-WJOT43E/s400/image+12.bmp" style="margin-left: auto; margin-right: auto;" width="382" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;structure of union object&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQDDXqNxJGI/AAAAAAAAABs/zqk-WJOT43E/s1600/image+12.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Its having three parts&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Tail.overlay:&lt;/b&gt; items at the same level as you read left to right are alternatives&lt;br /&gt;within a union i.e in tail.overlay notice tail.overlay.devicequeueentry and&lt;br /&gt;tail.overlay.drivercontext are at same level so they are alternatives of each other and&lt;br /&gt;anyone of them can be used for same type of work.Tail.overlay.listentry is actually&lt;br /&gt;used as a&amp;nbsp; linking field for irp and is used in linking an irp to another as a linked list.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;I/O STACK.&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;With every irp there is always an associated array of &lt;span class="programelement"&gt;IO_STACK_LOCATION&lt;/span&gt;&lt;br /&gt;structures.This structure actually consists of&amp;nbsp; one stack location for each driver as&lt;br /&gt;it will be processed downwards.This stack location actually consists of type&lt;br /&gt;codes(i.e to know which type of request is the IRP for eg as read/write and these&lt;br /&gt;are called major requests or minor requests) and parameter information for the IRP&lt;br /&gt;as well as the address of a completion routine.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Here the image describes I/O stack and its relation with drivers.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQDDwd4NvdI/AAAAAAAAABw/aTFytsgErBY/s1600/image+13.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQDDwd4NvdI/AAAAAAAAABw/aTFytsgErBY/s1600/image+13.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;relation between driver and i/o stack location&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="description"&gt;&lt;b&gt;I/O stack location data structure.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="programelement"&gt;As IRP data structure comes in IRP header part I/O data structure&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; comes in IRP parmeters section.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;IO_STACK_LOCATION&lt;/b&gt; structure includes the following: &lt;br /&gt;&lt;ul type="disc"&gt;&lt;li class="MsoNormal"&gt;The major and minor function      codes for the IRP.&lt;/li&gt;&lt;li class="MsoNormal"&gt;Arguments specific to these      codes.&lt;/li&gt;&lt;li class="MsoNormal"&gt;A pointer to the device      object for the corresponding driver.&lt;/li&gt;&lt;li class="MsoNormal"&gt;A pointer to an &lt;i&gt;IoCompletion&lt;/i&gt;      routine if the driver has set one.&lt;/li&gt;&lt;li class="MsoNormal"&gt;A pointer to the file object      associated with the request.&lt;/li&gt;&lt;li class="MsoNormal"&gt;Various flags and context      areas.&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_GvW8UOo5ICs/TQDEW3eHSvI/AAAAAAAAAB0/qI-FF2f47k8/s1600/image+14.bmp" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_GvW8UOo5ICs/TQDEW3eHSvI/AAAAAAAAAB0/qI-FF2f47k8/s1600/image+14.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;i/o stack location structure&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;span class="programelement"&gt;&lt;b&gt;MajorFunction&lt;/b&gt;&lt;/span&gt;&lt;b&gt; (&lt;span class="programelement"&gt;UCHAR&lt;/span&gt;):&lt;/b&gt; actually is in I/O stack and is used to identify what type&lt;br /&gt;of request is it for e.g. whether it’s a read request by using IRP_MJ_READ.code and&lt;br /&gt;using this code a paticular dispatch routine is called which has registered itself in driver&lt;br /&gt;object using init routine and &lt;span class="programelement"&gt;MinorFunction&lt;/span&gt; (&lt;span class="programelement"&gt;UCHAR&lt;/span&gt;) is actually used to further elaborate&lt;br /&gt;your major request i.e. suppose if&amp;nbsp; &lt;span class="programelement"&gt;IRP_MJ_PNP&amp;nbsp; is major request then it can be again&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;elaborated whether it’s a type of start device request or remove device request using IRP_MN_START_DEVICE&lt;/span&gt;, &lt;span class="programelement"&gt;IRP_MN_REMOVE_DEVICE as minor function codes.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="http://2.bp.blogspot.com/_GvW8UOo5ICs/TQDEW3eHSvI/AAAAAAAAAB0/qI-FF2f47k8/s1600/image+14.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;div class="MsoNormal"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Parameters field:&lt;/b&gt; Arguments specific to these codes&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Device object: &lt;/b&gt;pointer to the device object for the corresponding driver.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;CompletionRoutine :&lt;/b&gt;&amp;nbsp; pointer to an &lt;i&gt;IoCompletion&lt;/i&gt; routine if the driver has set one.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;File object:&lt;/b&gt; pointer to the file object associated with the request.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;The standard model for IRP processing:&lt;/b&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQDEzpcMx2I/AAAAAAAAAB4/2BRAcyhTtwY/s1600/image+15.bmp" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TQDEzpcMx2I/AAAAAAAAAB4/2BRAcyhTtwY/s1600/image+15.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;irp processing by routines&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;IRP is first created by I/O manager and after&amp;nbsp; it a particular dispatch routine is called&lt;br /&gt;to process it depending on the major function code&amp;nbsp; of the IRP that have been registered&lt;br /&gt;with this routine in driver object. IRP in dispatch routine depending on whether the driver&lt;br /&gt;is busy or not is forwarded to startio routine of driver where it is processed by a particular&lt;br /&gt;ISR(INTERRUPT SERVICE ROUTINE) depending on the type of interrupt occurred&lt;br /&gt;whereupon a particular DPC routine is called for finishing its completion and removing the&lt;br /&gt;another waiting IRP from the queue and forwarding to startio routine until the queue ie empty.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Creating an IRP&lt;/b&gt;:&lt;/div&gt;&lt;div class="MsoNormal"&gt;We can actually use these four routines to create a IRP:&lt;/div&gt;&lt;div class="normal" style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol; font-size: 10pt;"&gt;·&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span class="programelement"&gt;IoBuildAsynchronousFsdRequest&lt;/span&gt; builds an IRP on whose completion you don’t&lt;br /&gt;plan to wait. This function and the next are appropriate for building only certain types of IRP.&lt;/div&gt;&lt;div class="normal" style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol; font-size: 10pt;"&gt;·&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span class="programelement"&gt;IoBuildSynchronousFsdRequest&lt;/span&gt; builds an IRP on whose completion you &lt;span class="emphasis"&gt;do&lt;/span&gt; plan to wait.&lt;/div&gt;&lt;div class="normal" style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol; font-size: 10pt;"&gt;·&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span class="programelement"&gt;IoBuildDeviceIoControlRequest&lt;/span&gt; builds a synchronous &lt;span class="programelement"&gt;IRP_MJ_DE­VICE_CONTROL&lt;/span&gt; or &lt;span class="programelement"&gt;IRP_MJ_INTERNAL_DEVICE_CONTROL&lt;/span&gt; request.&lt;/div&gt;&lt;div class="normal" style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol; font-size: 10pt;"&gt;·&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span class="programelement"&gt;IoAllocateIrp&lt;/span&gt; builds an asynchronous IRP of any type&lt;/div&gt;&lt;div class="MsoNormal"&gt;Synchronous IRP: Its actually a IRP which depends on the&amp;nbsp; thread in which it is created i.e.&lt;br /&gt;if the thread in which it is created terminates all the synchronous IRP will automatically will be cancelled.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" class="MsoNormalTable" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;thead&gt;&lt;tr&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="normal"&gt;Support Function&lt;/div&gt;&lt;/td&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="normal"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;Types of IRP You Can Create&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/thead&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IoBuildSynchronousFsdRequest&lt;/span&gt;   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRP_MJ_READ&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRP_MJ_WRITE&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRP_MJ_FLUSH_BUFFERS&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRP_MJ_SHUTDOWN&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRP_MJ_PNP&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRP_MJ_POWER&lt;/span&gt; (but only for&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="programelement"&gt;IRP_MN_POWER_SEQUENCE&lt;/span&gt;)&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IoBuildDeviceIoControlRequest &amp;nbsp;&lt;/span&gt;   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IRP_MJ_DEVICE_CONTROL&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IRP_MJ_INTERNAL_DEVICE_CONTROL&lt;/span&gt;   &lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Asynchronous IRP: Its actually an IRP which does not depends on the thread in which it is&lt;br /&gt;created i.e.&amp;nbsp; the thread&amp;nbsp; termination does not leads to IRP cancellation and the IRP has its&lt;br /&gt;completion routine to complete it rather than synchronous IRP whose completion depends&lt;br /&gt;on completion routine of thread.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span id="goog_1901564318"&gt;&lt;/span&gt;&lt;span id="goog_1901564319"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="MsoPlainText" style="text-align: left;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" class="MsoNormalTable" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;thead&gt;&lt;tr&gt;    &lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" class="MsoNormalTable"&gt;&lt;thead&gt;&lt;tr&gt;    &lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;div class="normal"&gt;Support Function&lt;/div&gt;&lt;/td&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="normal"&gt;Types of IRP You Can Create&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/thead&gt;  &lt;tbody&gt;&lt;tr style="height: 71.4pt;"&gt;   &lt;td style="height: 71.4pt; padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IoBuildAsynchronousFsdRequest&lt;/span&gt;   &lt;/div&gt;&lt;/td&gt;   &lt;td style="height: 71.4pt; padding: 0.75pt;"&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IRP_MJ_READ&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IRP_MJ_WRITE&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IRP_MJ_FLUSH_BUFFERS&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IRP_MJ_SHUTDOWN&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IRP_MJ_PNP&lt;/span&gt; &lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IRP_MJ_POWER&lt;/span&gt; (but only for &lt;span class="programelement"&gt;IRP_MN_POWER_SEQUENCE&lt;/span&gt;)&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;span class="programelement"&gt;IoAllocateIrp&lt;/span&gt; &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;Any (but you must initialize the &lt;span class="programelement"&gt;MajorFunction&lt;/span&gt;   field of the first stack location)&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/thead&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Handling by dispatch routine:&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;When an IRP is forwarded to an dispatch routine it handles it process it in three general ways.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol start="1" style="margin-top: 0in;" type="1"&gt;&lt;li class="MsoNormal"&gt;&lt;b&gt;Immediately completing it with a return code.&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.Pass down to the lower device driver in stack&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; -with completion routine&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Or&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&amp;nbsp; -without completion routine&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.Queue for&amp;nbsp; later processing.&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt; 1.Completing it in a dispatch routine&lt;/b&gt;:&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_GvW8UOo5ICs/TQDW2hDeLTI/AAAAAAAAACg/5Ow3F1IrZ64/s1600/image+16.bmp" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_GvW8UOo5ICs/TQDW2hDeLTI/AAAAAAAAACg/5Ow3F1IrZ64/s1600/image+16.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;completing in dispatch routine&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;m:smallfrac m:val="off"&gt;&lt;m:dispdef&gt;&lt;m:lmargin m:val="0"&gt;&lt;m:rmargin m:val="0"&gt;&lt;m:defjc m:val="centerGroup"&gt;&lt;m:wrapindent m:val="1440"&gt;&lt;m:intlim m:val="subSup"&gt;&lt;m:narylim m:val="undOvr"&gt;&lt;/m:narylim&gt;&lt;/m:intlim&gt;&lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;Here you complete the IRP in dispatch routine and do not pass to the lower&lt;br /&gt;driver i.e. when&amp;nbsp; your dispatch routine is called and sometimes you may in case&lt;br /&gt;find an error has occurred or you may need to complete the IRP &amp;nbsp;&amp;nbsp;in dispatch&lt;br /&gt;routine then you can complete the IRP using IoCompleteRequest and also&lt;br /&gt;when you complete the IRP you set the status(for reporting whether IRP has&lt;br /&gt;been completed with an error or success) and information fields(for storing any&lt;br /&gt;information) of the IoStatus field of&amp;nbsp; the IRP datastructure.&lt;br /&gt;&lt;br /&gt;And here is the code for &amp;nbsp;it.&lt;br /&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;NTSTATUS&amp;nbsp;DispatchSomething(PDEVICE_OBJECT&amp;nbsp;fdo,&amp;nbsp;PIRP&amp;nbsp;Irp)&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;{&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx&amp;nbsp;=&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(PDEVICE_EXTENSION)&amp;nbsp;fdo-&amp;gt;DeviceExtension;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;//&amp;lt;process&amp;nbsp;the&amp;nbsp;IRP&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;Irp-&amp;gt;IoStatus.Status&amp;nbsp;=&amp;nbsp;STATUS_XXX;;//setting the value of status field of&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //IoStatus field of the IRP with a status code(see below for type of status&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//codes).&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; Irp-&amp;gt;IoStatus.Information&amp;nbsp;=&amp;nbsp;Information; ;//setting the value of&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//information field of&amp;nbsp; IoStatus field of the IRP (for e.g. the no. of&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//bytes transferred)&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;IoCompleteRequest(Irp,&amp;nbsp;IO_NO_INCREMENT);//for completing the IRP&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;status;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" class="MsoNormalTable"&gt;&lt;thead&gt;&lt;tr&gt;    &lt;td colspan="2" style="padding: 0.75pt;"&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;Some Commonly Used    NTSTATUS Codes &lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;tr&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Status Code&lt;/div&gt;&lt;/td&gt;    &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Description&lt;/div&gt;&lt;/td&gt;   &lt;/tr&gt;&lt;/thead&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_SUCCESS   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Normal   completion.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_UNSUCCESSFUL   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Request   failed, but no other status code&lt;br /&gt;describes the reason specifically.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_NOT_IMPLEMENTED   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;A   function hasn’t been implemented.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_INVALID_HANDLE   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;An   invalid handle was supplied for an ­operation.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_INVALID_PARAMETER   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;A   parameter is in error.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_INVALID_DEVICE_REQUEST   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;The   request is invalid for this device.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_END_OF_FILE   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;End-of-file   marker reached.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_DELETE_PENDING   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;The   device is in the process of being removed&lt;br /&gt;from the system.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;STATUS_INSUFFICIENT_RESOURCES   &lt;/div&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;div class="MsoNormal"&gt;Not   enough system resources (often ­memory) to&lt;br /&gt;perform an operation.&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&amp;nbsp;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;b&gt;2. Pass down to lower driver&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;b&gt;- without completion routine&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQDXao5w9KI/AAAAAAAAACk/F3PVzZWG0_I/s1600/image+17.bmp" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQDXao5w9KI/AAAAAAAAACk/F3PVzZWG0_I/s1600/image+17.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Pass down to lower driver&lt;br /&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;- without completion routine&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In this scenario you just pass down the driver to lower driver without&lt;br /&gt;setting a completion routine in the lower stack. We actually set a completion&lt;br /&gt;routine when we do care for IRP after passing to the lower driver i.e. we&lt;br /&gt;actually want to check for an IRP whether it is completed successfully&lt;br /&gt;or some error has been occurred during its processing by the lower&lt;br /&gt;driver and depending on this checking we determine whether a IRP&lt;br /&gt;requires some extra processing after being returned from the lower&lt;br /&gt;driver..It is actually done by setting a completion routine in the lower&lt;br /&gt;driver stack (note we actually set the completion routine&lt;br /&gt;for the current driver not in its stack location but in lower driver&lt;br /&gt;stack location).It means of course there will be no completion&lt;br /&gt;routine for the lower most driver.&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;How to pass an IRP to the lower driver in stack?&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;The first thing is that we have to initialize the lower stack in I/O_&lt;br /&gt;STACK_LOCATION data structure for the lower driver&amp;nbsp; such&lt;br /&gt;as major function codes&amp;nbsp; , minor function codes,&amp;nbsp; parameters&lt;br /&gt;so that an IRP can be processed by the lower driver.&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;For the same purpose we use &amp;nbsp;&lt;span class="programelement"&gt;IoCopyCurrentIrpStackLocationToNext(Irp) .&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;It simply copies the current major function and minor function codes&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; to the next stack location&amp;nbsp; but does not copies the current completion&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; routine to the next location i.e. the next stack location will have its&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; own completion routine and then we call IoCallDriver routine to&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; pass it to the lower driver . IoCallDriver advances the current stack&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; pointer and now the IRP stack pointer points&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;to the next lower stack location.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;span class="programelement"&gt;Here is the code:&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;IoCopyCurrentIrpStackLocationToNext(Irp);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status&amp;nbsp;=&amp;nbsp;IoCallDriver(pdx-&amp;gt;LowerDeviceObject,&amp;nbsp;Irp);//here&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//IoCallDriver has two parameters ..first one is the address of the&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//lower&lt;/pre&gt;&lt;pre&gt;//driver . note that pdx-&amp;gt;LowerDeviceObject points to the lower&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;//driver which we have attached to our device in add device routine&lt;/pre&gt;&lt;pre&gt;// using&amp;nbsp;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//pdx-&amp;gt;LowerDeviceObject&amp;nbsp;=&amp;nbsp;IoAttachDeviceToDeviceStack(fdo,&amp;nbsp;pdo&lt;/pre&gt;&lt;pre&gt;) and other&lt;/pre&gt;&lt;pre&gt;//points the IRP which is being passed.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;span class="programelement"&gt;&amp;nbsp;But actually in this scenario we actually do not care for the IRP after&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; being passed to the lower&amp;nbsp; driver that means we actually do not need&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;&amp;nbsp;a completion routine. So there is no need of setting&amp;nbsp; a new completion&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;routine&amp;nbsp; in the lower stack location.We therefore use&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; IoSkipCurrentIrpStackLocation(Irp) which does not copies the&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;current major and minor functions&amp;nbsp; code to the lower device stack&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; location instead it retards the stack pointer and which is again&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; advanced by IoCallDriver so lower driver stack location&amp;nbsp; points&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;to the current stack location&amp;nbsp; and uses the same current minor&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; and major&amp;nbsp; function code and same completion routine without&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; copying it. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&amp;nbsp;&amp;nbsp;Here is the complete code for this &amp;nbsp;scenario:&lt;/div&gt;&lt;pre&gt;NTSTATUS&amp;nbsp;ForwardAndForget(PDEVICE_EXTENSION&amp;nbsp;pdx,&amp;nbsp;PIRP&amp;nbsp;Irp)&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;{&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx&amp;nbsp;=&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(PDEVICE_EXTENSION)&amp;nbsp;fdo-&amp;gt;DeviceExtension;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;NTSTATUS&amp;nbsp;status&amp;nbsp;=&amp;nbsp;IoAcquireRemoveLock(&amp;amp;pdx-&amp;gt;RemoveLock,&amp;nbsp;Irp);&lt;/pre&gt;&lt;pre&gt;//acquiring&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//lock&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!NT_SUCCESS(status))&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;CompleteRequest(Irp,&amp;nbsp;status);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;IoSkipCurrentIrpStackLocation&amp;nbsp;(Irp);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;status&amp;nbsp;=&amp;nbsp;IoCallDriver(pdx-&amp;gt;LowerDeviceObject,&amp;nbsp;Irp);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;IoReleaseRemoveLock(&amp;amp;pdx-&amp;gt;RemoveLock,&amp;nbsp;Irp);//releasing lock&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;status;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;For more details here is the image :&lt;/pre&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQDIpsEA4wI/AAAAAAAAACE/sdsEcqz34L4/s1600/image18.bmp" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="246" src="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQDIpsEA4wI/AAAAAAAAACE/sdsEcqz34L4/s400/image18.bmp" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-size: small;"&gt;difference between &lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;IoCopyCurrentIrpStackLocationToNext and IoSkipCurrentIrpStackLocation&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-Pass Down with Completion Routine&lt;/b&gt;:&lt;br /&gt;As we have discussed earlier we need completion routine when we actually&lt;br /&gt;care for the IRP after passing down to the lower driver. So here we set up&lt;br /&gt;a completion routine as we want to check what happened to the IRP which&lt;br /&gt;we have passed below(always remember that we setthe&amp;nbsp; completion routine&lt;br /&gt;in lower driver stack location).&lt;span class="programelement"&gt;IoSetCompletionRoutine is used for the very&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;purpose as&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;IoSetCompletionRoutine(Irp,&amp;nbsp;CompletionRoutine,&amp;nbsp;context,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;InvokeOnSuccess,&amp;nbsp;InvokeOnError,&amp;nbsp;InvokeOnCancel);&lt;/pre&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Here Irp points the IRP , completion routine points to the routine which we want&lt;br /&gt;called and context is is an arbitrary pointer-size value you want passed as an&lt;br /&gt;argument to the completion routine. InvokeOnXXX actually means when we want&lt;br /&gt;our completion routine to be called for e.g. InvokeOnSuccess means we want&lt;br /&gt;our completion routine to be called when an IRP has been completed successfully&lt;br /&gt;and similiarly InvokeOnerror means we want our completion routine to be called&lt;br /&gt;when an IRP has been completed with an error and InvokeOnCancel means we&lt;br /&gt;want completion routine to be called when someone has cancelled the IRP.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;A completion routine which we have set looks like this:&lt;/div&gt;&lt;pre&gt;NTSTATUS&amp;nbsp;CompletionRoutine(PDEVICE_OBJECT&amp;nbsp;fdo,&amp;nbsp;PIRP&amp;nbsp;Irp,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;PVOID&amp;nbsp;context)&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;{&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;span class="emphasis"&gt;&amp;lt;some&amp;nbsp;status&amp;nbsp;code&amp;gt;&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;There are really just two possible return values from a completion routine:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="programelement"&gt;STATUS_MORE_PROCESSING_REQUIRED: when this value is returned&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;IoCompleteRequest aborts its completion routine and transfers control to the&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;current driver so that it can do anymore processing required.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Anything else, which allows the completion process to continue.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Now lets look at the completion process of the IRP down the driver .The&lt;br /&gt;completion process is usually initiated by IoCompleteRequest . This routine&lt;br /&gt;actually commence its process by using the&lt;br /&gt;following flowchart.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQDKOmAnXeI/AAAAAAAAACM/uMOqdcO2KLk/s1600/image20.bmp" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_GvW8UOo5ICs/TQDKOmAnXeI/AAAAAAAAACM/uMOqdcO2KLk/s1600/image20.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;how iocompleterequest works?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It&lt;br /&gt;actually checks the for the current completion routine and if it founds one it&lt;br /&gt;executes it and if completion routine returns &lt;span class="programelement"&gt;STATUS_MORE_&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;PROCESSING_REQUIRED&amp;nbsp; there is more processing required by&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;the current driver and control transfers to the current driver and&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;IoCompleteRequest stops its execution.&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;While if&amp;nbsp; anything else is returned the IoCompleteRequest moves to the next&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt; stack location and again&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="programelement"&gt;repeat the whole procedure until it moves to the top of the stack. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=7859045228002919282&amp;amp;postID=3368957085152519884" name="c041336d-91a5-4e07-9671-34193fca5f42"&gt;&lt;b&gt;3.Queue for Later Processing&lt;/b&gt;&lt;/a&gt;&lt;b&gt;:&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The third alternative action for a dispatch routine is to queue the IRP for&lt;br /&gt;later processing.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_GvW8UOo5ICs/TQDMLEh_owI/AAAAAAAAACY/nQyQ1uiu5pU/s1600/image31.bmp" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_GvW8UOo5ICs/TQDMLEh_owI/AAAAAAAAACY/nQyQ1uiu5pU/s1600/image31.bmp" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;queuing for later processing&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&amp;nbsp;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;br /&gt;Here&lt;br /&gt;when the driver is busy you move the IRP in a queue for later processing.When&lt;br /&gt;the driver becomes free we remove the IRP from the queue and pass it to the&lt;br /&gt;StartIo routine of the driver where it is processed by a ISR(INTERRUPT SERVICE&lt;br /&gt;ROUTINE) depending upon the interrupt and is completed by a DPC(DEFFERRED&lt;br /&gt;PROCEDURE CALL)&amp;nbsp; and after completing it DPC routine removes the another&lt;br /&gt;waiting IRP&amp;nbsp; from the queue and pass it to the StartIo routine which has registered&lt;br /&gt;itself in startio field of&lt;br /&gt;driver object.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Here is the code illustrating it:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;//First we have to define the queue for maintaining the IRP queue:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;typedef&amp;nbsp;struct&amp;nbsp;_DEVICE_EXTENSION&amp;nbsp;{&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;DEVQUEUE&amp;nbsp;dqReadWrite;//DEVQUEUE actually represents a queue&lt;/pre&gt;&lt;pre&gt;// and is not the part of wdm header . it’s a user defined object&lt;/pre&gt;&lt;pre&gt;// , here dqReadWrite is defined as queue for queuing IRP.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;DEVICE_EXTENSION,&amp;nbsp;*PDEVICE_EXTENSION;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;NTSTATUS&amp;nbsp;AddDevice(PDRIVER_OBJECT&amp;nbsp;DriverObject,&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;PDEVICE_OBJECT&amp;nbsp;pdo)&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;{&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;InitializeQueue(&amp;amp;pdx-&amp;gt;dqReadWrite,&amp;nbsp;StartIo);//note queue is&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;//initialized in adddevice routine and the StartIo routine is&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//initialized with it .&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;IoInitializeDpcRequest(fdo,&amp;nbsp;(PIO_DPC_ROUTINE)&amp;nbsp;DpcForIsr);&lt;/pre&gt;&lt;pre&gt;//dpc request is&lt;/pre&gt;&lt;pre&gt;//also initialized ,fdo is our device object and second is&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//pointer to dpc&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//routine.&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;div class="MsoNormal"&gt;//now dispatch routine for handling request &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;b&gt;NTSTATUS&amp;nbsp;DispatchReadWrite(PDEVICE_OBJECT&amp;nbsp;fdo,&amp;nbsp;PIRP&amp;nbsp;Irp)&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;{&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx&amp;nbsp;=&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(PDEVICE_EXTENSION)&amp;nbsp;fdo-&amp;gt;DeviceExtension;//accessing the driver&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt; //extension&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;IoMarkIrpPending(Irp);&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;//whenever we return STATUS_PENDING we call IoMarkIrpPending(Irp)&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;// to avoid&amp;nbsp;&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;//an internal race condition.&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt; &lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;StartPacket(&amp;amp;pdx-&amp;gt;dqReadWrite,&amp;nbsp;fdo,&amp;nbsp;Irp,&amp;nbsp;CancelRoutine);&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;//startpacket routine actually pass the IRP to the StartIo routine&amp;nbsp;&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;//if the device is not busy and if its busy it moves it to the queue.&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;//It also registers a cancel routine.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;return&amp;nbsp;STATUS_PENDING;//&lt;/b&gt; to tell our caller that we’re not done&lt;/pre&gt;&lt;pre&gt;// with this IRP yet.&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;}&lt;/b&gt;&lt;/pre&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;//cancel routine that we have registered.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;b&gt;VOID&amp;nbsp;CancelRoutine(PDEVICE_OBJECT&amp;nbsp;fdo,&amp;nbsp;PIRP&amp;nbsp;Irp)&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;{&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx&amp;nbsp;=&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(PDEVICE_EXTENSION)&amp;nbsp;fdo-&amp;gt;DeviceExtension;&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;CancelRequest(&amp;amp;pdx-&amp;gt;dqReadWrite,&amp;nbsp;Irp);//it automatically handles&amp;nbsp;&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;//cancelling of your requests.&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;}&lt;/b&gt;&lt;/pre&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;//startio routine of driver.&lt;/div&gt;&lt;pre&gt;VOID&amp;nbsp;StartIo(PDEVICE_OBJECT&amp;nbsp;fdo,&amp;nbsp;PIRP&amp;nbsp;Irp)&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;{&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;pre&gt;//ISR routine to handle interrupt occurred.&lt;/pre&gt;&lt;pre&gt;BOOLEAN&amp;nbsp;OnInterrupt(PKINTERRUPT&amp;nbsp;junk,&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx)&lt;/pre&gt;&lt;pre&gt;//the first&lt;/pre&gt;&lt;pre&gt;//argument is interrupt on which it will execute , second is device&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//extension&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;{&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;PIRP&amp;nbsp;Irp&amp;nbsp;=&amp;nbsp;GetCurrentIrp(&amp;amp;pdx-&amp;gt;dqReadWrite);//retrieving the current IRP&lt;/pre&gt;&lt;pre&gt;//from the queue.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;Irp-&amp;gt;IoStatus.Status&amp;nbsp;=&amp;nbsp;STATUS_XXX;//setting the status using&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//IoStatus.Status&amp;nbsp;field of IRP whether it is completed with error or&lt;/pre&gt;&lt;pre&gt;//without error.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;Irp-&amp;gt;IoStatus.Information&amp;nbsp;=&amp;nbsp;YYY;//setting the information using&lt;/pre&gt;&lt;pre&gt;//IoStatus.Information field of IRP.&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;IoRequestDpc(pdx-&amp;gt;DeviceObject,&amp;nbsp;NULL,&amp;nbsp;pdx);//calling the dpc routine for&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//further processing.&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;div class="normal"&gt;//The &lt;span class="programelement"&gt;DpcForIsr&lt;/span&gt; routine requested by your ISR receives control at &lt;span class="programelement"&gt;DISPATCH_LEVEL&lt;/span&gt;.&lt;br /&gt;//Generally, its job is to finish up the processing of the IRP that caused the most recent&lt;br /&gt;//interrupt. Often that job entails calling &lt;span class="programelement"&gt;IoComplete­Request&lt;/span&gt; to complete this IRP and&lt;br /&gt;//&lt;span class="programelement"&gt;StartNextPacket&lt;/span&gt; to remove the next IRP from your device queue for forwarding to startio. &lt;/div&gt;&lt;pre&gt;VOID&amp;nbsp;DpcForIsr(PKDPC&amp;nbsp;Dpc&amp;nbsp;PDEVICE_OBJECT&amp;nbsp;fdo,&amp;nbsp;PIRP&amp;nbsp;junk,&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;PDEVICE_EXTENSION&amp;nbsp;pdx)// the first argument is device object , second is&lt;/pre&gt;&lt;pre&gt;//your IRP that has to be processed , third is device extension.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;{&lt;/pre&gt;&lt;pre style="margin-left: 0.5in;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;StartNextPacket(&amp;amp;pdx-&amp;gt;dqSomething,&amp;nbsp;fdo);&lt;/pre&gt;&lt;pre&gt;//&lt;span class="programelement"&gt;StartNextPacket&lt;/span&gt; to remove the next IRP from your device queue for&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//forwarding to &lt;span class="programelement"&gt;StartIo&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;IoCompleteRequest(Irp,&amp;nbsp;boost);&lt;/pre&gt;&lt;pre&gt;&lt;span class="programelement"&gt;//IoCompleteRequest&lt;/span&gt; completes the IRP you specify as the first argument.&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//The second argument specifies a priority boost for the thread that has&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;//been waiting for this IRP.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;div class="normal"&gt;Now we&amp;nbsp; should see the general implementation of&amp;nbsp; dispatch routine .Recall that we&lt;br /&gt;have registered certain dispatch routines&amp;nbsp; with major function codes . These dispatch&lt;br /&gt;routines are discussed here how they generally process certain IRP with major function&lt;br /&gt;codes. Every routine will process IRP in the ways that we have discussed above.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 16pt;"&gt;DISPATCH.Cpp&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;// dispatch.cpp.other IRP handler&lt;/div&gt;&lt;div class="MsoNormal"&gt;#include “wdm1.h”//including general definition of certain functions and device extension.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;#include “Ioctl.h”//conatin certain control codes to control IRP.&lt;/div&gt;&lt;div class="MsoNormal"&gt;KSPIN_LOCK BufferLock;//defining spin lock .&lt;/div&gt;&lt;div class="MsoNormal"&gt;PUCHAR Buffer = NULL;// defining buffer which we will use in read/ write request.&lt;/div&gt;&lt;div class="MsoNormal"&gt;ULONG BufferSize = 0;//defining the buffer size.&lt;/div&gt;&lt;div class="MsoNormal"&gt;///////////////////////////////////////////////////////////////////////////////////&lt;/div&gt;&lt;div class="MsoNormal"&gt;//Wdm1Create:&lt;/div&gt;&lt;div class="MsoNormal"&gt;//&lt;/div&gt;&lt;div class="MsoNormal"&gt;//description:&lt;/div&gt;&lt;div class="MsoNormal"&gt;//handle IRP_MJ_CREATE requests&lt;/div&gt;&lt;div class="MsoNormal"&gt;//&lt;/div&gt;&lt;div class="MsoNormal"&gt;//arguments:&lt;/div&gt;&lt;div class="MsoNormal"&gt;// pointers to our FDO&lt;/div&gt;&lt;div class="MsoNormal"&gt;// pointers to the IRP&lt;/div&gt;&lt;div class="MsoNormal"&gt;//IrpStack-&amp;gt;Parameters.Create.xxx has create parameters&lt;/div&gt;&lt;div class="MsoNormal"&gt;// IrpStack-&amp;gt;FileObject-&amp;gt;FileName has file name of device&lt;/div&gt;&lt;div class="MsoNormal"&gt;////&lt;/div&gt;&lt;div class="MsoNormal"&gt;//return value:&lt;/div&gt;&lt;div class="MsoNormal"&gt;//This function returns STATUS_XXX&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;NTSTATUS Wdm1Create(IN PDEVICE_OBJECT, IN PIRP Irp)//recall IN specifies it’s&lt;br /&gt;//INPUT&amp;nbsp; to function&lt;/div&gt;&lt;div class="normal"&gt;{&lt;/div&gt;&lt;div class="normal"&gt;PIO_STACK_LOCATION&amp;nbsp; IrpStack = IoGetCurrentIrpStackLocation(Irp);&lt;/div&gt;&lt;div class="normal"&gt;DebugPrint(“Create File is %T”,&amp;amp;(IrpStack-&amp;gt;FileObject-&amp;gt;FileName));&lt;br /&gt;//printing on kernel&lt;br /&gt;//the file name of device object.&lt;/div&gt;&lt;div class="normal"&gt;// Complete successfully.&lt;/div&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;}&lt;/div&gt;&lt;div class="normal"&gt;//here &amp;nbsp;the first scenario of IRP handling is done i.e. it is completed here in dispatch&lt;/div&gt;&lt;div class="normal"&gt;&amp;nbsp;//routine without passing to the lower driver. Just see&amp;nbsp; this dispatch routine will be called&lt;br /&gt;//whenever an IRP with major function code IRP_MJ_CREATE is passed to the driver. The&lt;br /&gt;//driver uses the information in I/O STACK to process the IRP .See how it uses&lt;br /&gt;//IrpStack-&amp;gt;FileObject-&amp;gt;FileName to print the name of device object. This is just a demo&lt;br /&gt;//how an IRP is processed , how we use IO STACK information to process it. Here we&lt;br /&gt;//have simply use it for printing.&lt;/div&gt;&lt;div class="normal"&gt;//now moving to another MAJOR_REQUEST&lt;/div&gt;&lt;div class="normal"&gt;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;/div&gt;&lt;div class="normal"&gt;//Wdm1Read:&lt;/div&gt;&lt;div class="normal"&gt;//&lt;/div&gt;&lt;div class="normal"&gt;//Description:&lt;/div&gt;&lt;div class="normal"&gt;//Handle IRP_MJ_READ request&lt;/div&gt;&lt;div class="MsoNormal"&gt;//// Arguments:&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Pointers to our FDO&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Pointers to the IRP&lt;/div&gt;&lt;div class="MsoNormal"&gt;// IrpStack-&amp;gt;Parameters.Read.xxx has read parameters&lt;/div&gt;&lt;div class="MsoNormal"&gt;//User Buffer at:AssociatedIrp.SystemBuffer(buffered I/O)&lt;/div&gt;&lt;div class="MsoNormal"&gt;// MDIAddress(direct I/O)&lt;/div&gt;&lt;div class="MsoNormal"&gt;//&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Return Value:&lt;/div&gt;&lt;div class="MsoNormal"&gt;// This function returns STATUS_XXX&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;NTSTATUS Wdm1Read(IN PDEVICE_OBJECT fdo,&lt;/div&gt;&lt;div class="MsoNormal"&gt;IN PIRP Irp)&lt;/div&gt;&lt;div class="MsoNormal"&gt;{&lt;/div&gt;&lt;div class="MsoNormal"&gt;PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);&lt;/div&gt;&lt;div class="MsoNormal"&gt;NTSTATUS status = STATUS_SUCCESS;&lt;/div&gt;&lt;div class="MsoNormal"&gt;LONG BytesTxd = 0;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Get call parameters&lt;/div&gt;&lt;div class="MsoNormal"&gt;LONGLONG FilePointer = IrpStack-&amp;gt;Parameters.Read.ByteOffset.QuadPart;&lt;br /&gt;//setting a //pointer to the file which we have to read.&lt;/div&gt;&lt;div class="MsoNormal"&gt;ULONG ReadLen = IrpStack-&amp;gt;Parameters.Read.Length;&lt;br /&gt;//retrieving the length of the data //that we have to read.&lt;/div&gt;&lt;div class="MsoNormal"&gt;DebugPrint(“Read %d bytes from file pointer %d”, (int)ReadLen,(int)FilePointer);&lt;br /&gt;//printing&lt;br /&gt;//the length and both file pointer&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Get access to the shared buffer&lt;/div&gt;&lt;div class="MsoNormal"&gt;KIROL irql;// defining the interrupt request level&lt;/div&gt;&lt;div class="MsoNormal"&gt;KeAcquireSpinLock(&amp;amp;BufferLock,&amp;amp;irql);// &lt;span class="programelement"&gt;KeAcquireSpinLock&lt;/span&gt; acquires the spin lock, it&lt;br /&gt;//also raises IRQL to &lt;span class="programelement"&gt;DISPATCH_LEVEL&lt;/span&gt; and returns the current (that is, preacquisition)&lt;br /&gt;//level in the variable to which the second argument points.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Check File pointer&lt;/div&gt;&lt;div class="MsoNormal"&gt;If(FilePointer&amp;lt;0)&lt;/div&gt;&lt;div class="MsoNormal"&gt;status=STATUS_INVALID_PARAMETER;&lt;/div&gt;&lt;div class="MsoNormal"&gt;if(FilePointer&amp;gt;=(LONGLONG)BufferSize)&lt;/div&gt;&lt;div class="MsoNormal"&gt;status=STATUS_END_OF_FILE;&lt;/div&gt;&lt;div class="MsoNormal"&gt;if(status=STATUS_SUCCESS)&lt;/div&gt;&lt;div class="MsoNormal"&gt;{&lt;/div&gt;&lt;div class="MsoNormal"&gt;//Get transfer count&lt;/div&gt;&lt;div class="MsoNormal"&gt;If(((ULONG)FilePointer)+ReadLen&amp;gt;BufferSize&lt;/div&gt;&lt;div class="MsoNormal"&gt;{&lt;/div&gt;&lt;div class="MsoNormal"&gt;Bytes Txd = BufferSize – (ULONG)FilePointer;&lt;/div&gt;&lt;div class="MsoNormal"&gt;If (Bytes Txd&amp;lt;0)&amp;nbsp; &lt;/div&gt;&lt;div class="MsoNormal"&gt;Bytes Txd=0;&lt;/div&gt;&lt;div class="MsoNormal"&gt;}&lt;/div&gt;&lt;div class="MsoNormal"&gt;else&lt;/div&gt;&lt;div class="MsoNormal"&gt;BytesTxd = ReadLen;&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Read from shared buffer&lt;/div&gt;&lt;div class="MsoNormal"&gt;If (Bytes Txd&amp;gt;0 &amp;amp;&amp;amp; Buffer!=NULL)&lt;/div&gt;&lt;div class="MsoNormal"&gt;RtlCopyMemory(Irp-&amp;gt;AssociatedIrp.SystemBuffer , Buffer+FilePointer , BytesTxd);&lt;/div&gt;&lt;div class="MsoNormal"&gt;}&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Relaease shared buffer&lt;/div&gt;&lt;div class="MsoNormal"&gt;KeReleaseSpinLock(&amp;amp;BufferLock.irql);&lt;/div&gt;&lt;div class="MsoNormal"&gt;DebugPrint(“Read: %d bytes returned”, (int) BytesTxd);&lt;/div&gt;&lt;div class="MsoNormal"&gt;// Complete Irp&lt;/div&gt;&lt;div class="MsoNormal"&gt;Return CompleteIrp(Irp,status, BytesTxd);&lt;/div&gt;&lt;div class="MsoNormal"&gt;}&lt;/div&gt;&lt;div class="MsoNormal"&gt;//////////////////////////////////////////////////////////////////////////////////////////////////&lt;/div&gt;&lt;div class="MsoNormal"&gt;//here in the above routine we have processed an IRP with major function code&lt;br /&gt;//IRP_MAJOR_READ. In the previous dispatch routine we have only used&lt;br /&gt;//parameters to print an information on kernel while here we are processing&lt;br /&gt;//the information passed as parameter. We are checking the size of&amp;nbsp; data that&lt;br /&gt;//has to be read and checking it with the size of the buffer thereafter doing some&lt;br /&gt;//compensation if its more than the size of buffer and then finally copying the data&lt;br /&gt;//to buffer. The whole thing is that we actually use the parameters as&lt;br /&gt;//information and after processing on this information we pass it to the lower driver&lt;/div&gt;&lt;div class="normal"&gt;&lt;b&gt;How to build driver:&lt;/b&gt;&lt;/div&gt;&lt;div class="normal"&gt;To build our driver from our source code we need to install DDK and then&lt;br /&gt;run build command .&lt;br /&gt;We specify the path of source code in a file named SOURCES:&lt;/div&gt;&lt;div class="normal"&gt;&lt;b&gt;SOURCES:&lt;/b&gt;&lt;/div&gt;&lt;div class="normal"&gt;TARGETNAME = Wdm1&lt;/div&gt;&lt;div class="normal"&gt;TARGETTYPE=DRIVER&lt;/div&gt;&lt;div class="normal"&gt;DRIVERTYPE=WDM&lt;/div&gt;&lt;div class="normal"&gt;TARGETPATH=DBJ&lt;/div&gt;&lt;div class="normal"&gt;INCLUDES=$(BASEDIR) \inc&lt;/div&gt;&lt;div class="normal"&gt;SOURCES=init.cpp \&lt;/div&gt;&lt;div class="normal"&gt;Dispatch.cpp \&lt;/div&gt;&lt;div class="normal"&gt;Pnp.cpp \&lt;/div&gt;&lt;div class="normal"&gt;Here we specify the path of source code (init.cpp,dispatch.cpp,pnp.cpp) which&lt;br /&gt;is compiled by build utility and a .sys file is build with a name Wdm1 as we have&lt;br /&gt;specified in TARGETNAME.The Wdm1.sys file is actually our device driver.&lt;br /&gt;Besides this we also include a makefile which isused in defining the driver entry&lt;br /&gt;of our driver. This file is also used in building our device driver.&lt;/div&gt;&lt;div class="normal"&gt;&lt;b&gt;Installing device driver:&lt;/b&gt;&lt;/div&gt;&lt;div class="normal"&gt;After successfully compiling our device driver we have to install this driver .&lt;br /&gt;Installation of device driver can be done manually using registry editing. We&lt;br /&gt;&amp;nbsp;add the details of our driver in our registry. The details include creating a&lt;br /&gt;&amp;nbsp;registry key which will specify the name of our device driver as a service. &lt;br /&gt;We create attributes in this registry key specifying more information of our&lt;br /&gt;&amp;nbsp;device driver such as the path of the compiled driver represented as&lt;br /&gt;Wdm1.sys which will be loaded by pnp manager. The other&lt;br /&gt;information such as how our driver will be loaded whether manually, at&lt;br /&gt;windows startup or automatically. We specify other information in subkeys&lt;br /&gt;also such as its security features.&amp;nbsp; So after building the device driver&lt;br /&gt;we supply a .inf file with it which contains all the information to be added in&lt;br /&gt;registry.&lt;/div&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="normal"&gt;&lt;b&gt;Loading/unloading your device driver:&lt;/b&gt;&lt;/div&gt;Once a driver has been registered as a system-service, it can be loaded&lt;br /&gt;(and unloaded) using the Service Control Manager. You can start a driver&lt;br /&gt;programmatically using the &lt;b&gt;StartService &lt;/b&gt;API call, but it is far&lt;br /&gt;easier to goto the command-prompt and type:&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;net start hello // the name of our device driver&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;The following output will then be displayed:&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;The hello service was started successfully.&lt;/pre&gt;Nothing else will appear to happen though because drivers don't (and can't)&lt;br /&gt;output any data to the console.&lt;br /&gt;&lt;div class="normal"&gt;&lt;br /&gt;&lt;/div&gt;Stopping (and unloading) a driver is as simple as starting it:&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;net stop hello &lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;it will call our device driver unload routine to unload&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;our device driver.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;Note :The all above work registering , loading , or&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;unloading can be done&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;automatically using a tool &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;"&gt;Driver Loader .&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;span id="goog_1901564365"&gt;&lt;/span&gt;&lt;span id="goog_1901564366"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;span id="goog_1901564361"&gt;&lt;/span&gt;&lt;span id="goog_1901564362"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;div class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.75pt; width: 163.5pt;" width="218"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;td style="padding: 0.75pt;"&gt;&lt;br /&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7859045228002919282-3368957085152519884?l=amitbpit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitbpit.blogspot.com/feeds/3368957085152519884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amitbpit.blogspot.com/2010/12/device-driver-tutorial-basic-device.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/3368957085152519884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/3368957085152519884'/><link rel='alternate' type='text/html' href='http://amitbpit.blogspot.com/2010/12/device-driver-tutorial-basic-device.html' title='Device driver tutorial: basic device  driver concepts and how to write a wdm driver?'/><author><name>amit kumar singh</name><uri>http://www.blogger.com/profile/11463278763395570850</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_GvW8UOo5ICs/TQCyxd3cqNI/AAAAAAAAABA/CM_eWDZuLoc/s72-c/image+1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7859045228002919282.post-8353666933691752538</id><published>2010-11-24T05:27:00.000-08:00</published><updated>2010-12-07T08:54:30.384-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computer troubleshooting tips and virus protection tips'/><title type='text'>Computer troubleshooting:"handling various problems of your pc and virus protection"</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_GvW8UOo5ICs/TO0QyXopAqI/AAAAAAAAAAk/chhvv8yT-yE/s1600/blue+screen+of+death.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;    &lt;m:smallfrac m:val="off"&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val="0"&gt;    &lt;m:rmargin m:val="0"&gt;    &lt;m:defjc m:val="centerGroup"&gt;    &lt;m:wrapindent m:val="1440"&gt;    &lt;m:intlim m:val="subSup"&gt;    &lt;m:narylim m:val="undOvr"&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Problem no. 1&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;There is no power in mainboard after switching on&amp;nbsp; cpu.&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Solution 1:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;This can be due to your mainboard touching the cpu body.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;So what you have to do &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;make it isolated..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;i.e remove mainboard and smps from the cpu..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;and put it on a wooden table or any insulating material..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;as shown in image...&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_GvW8UOo5ICs/TO0Q4hBwNPI/AAAAAAAAAAo/ksLsMAdlsKU/s1600/computer+and+smps+on+wooden+table.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="203" src="http://1.bp.blogspot.com/_GvW8UOo5ICs/TO0Q4hBwNPI/AAAAAAAAAAo/ksLsMAdlsKU/s320/computer+and+smps+on+wooden+table.bmp" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;also see your cpu fan is not loose..&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;now power on the smps..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;the mainboard will surely start if earthing is problem&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Solution 2:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;if the problem is not solved by above solution then this can be due to fault in smps&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;i.e. u have to check your smps whether it’s working fine..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;first supply the power to your smps n then see the image below how to test it..&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TO0RPF7nqVI/AAAAAAAAAA8/4j3rNLzSClI/s1600/testing+smps.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://4.bp.blogspot.com/_GvW8UOo5ICs/TO0RPF7nqVI/AAAAAAAAAA8/4j3rNLzSClI/s320/testing+smps.bmp" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;just use the tester as above(note that the tester should touch that silver metal inside the hole of power connector ) and similiarly test every power connector from smps to devices and mainboard. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;if the light glows in tester it means there is power ..and the connector is fine.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Problem 2:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;There is a power in mainboard&amp;nbsp; but there is no display i.e there is light in keyboard n mouse n cpu but no display in monitor..(and monitor and its cable is working fine)&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;solution 1:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;this can be due to faulty settings made in bios or cmos settings by an virus or any other application ,, or accidently by you..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;to restore this you have to reset the jumpers...&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;i.e. as shown below in image..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;its the initial position&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_GvW8UOo5ICs/TO0RISRg0oI/AAAAAAAAAA0/xvESjd1P8w4/s1600/jumper+initial+position.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://2.bp.blogspot.com/_GvW8UOo5ICs/TO0RISRg0oI/AAAAAAAAAA0/xvESjd1P8w4/s320/jumper+initial+position.bmp" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;and u have to set it to this position&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;as shown in image...&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://4.bp.blogspot.com/_GvW8UOo5ICs/TO0RDoiBXPI/AAAAAAAAAAw/hzZvi0_qqJY/s1600/jumper+final+position.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://4.bp.blogspot.com/_GvW8UOo5ICs/TO0RDoiBXPI/AAAAAAAAAAw/hzZvi0_qqJY/s320/jumper+final+position.bmp" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;you can also break your cmos password by it.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;solution 2:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;if the problem is not solved by above solution 1, then the problem is actually due to ram ,either its loose or might be physically damaged..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;if its loose unplug it and clean its below portion from both sides as shown in image with an eraser,,&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_GvW8UOo5ICs/TO0RLrYl8oI/AAAAAAAAAA4/6qzeEOVTPzI/s1600/ram+carbon+cleaning.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_GvW8UOo5ICs/TO0RLrYl8oI/AAAAAAAAAA4/6qzeEOVTPzI/s320/ram+carbon+cleaning.bmp" width="269" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Re plug it and restart your cpu..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;if the problem still persists you need to replace your ram.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Problem 3:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;The computer restarts again and again after working for a specific period of time&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;this can be due to loose wiring in your cpu or loose cards like ram or loose cpu fan...so tight every bus and power wire from smps to mainboard and other devices...also plug out your ram and replug it as done in above solution..and do not forget to tight your cpu fan also if you are finding it loose...&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;restart your cpu and if the problem persists you may need to check your smps as explained before...&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;check every power connector from smps to mainboard to other devices with a tester..and you may find a particular wire with a fault if the wiring and other cards are not loose.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Problem 4:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;The windows get stuck every time with a blue screen after working for a certain period of time..&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;this is mainly due to a virus or an application that tries to acess your physical memory in an unauthorised way ,,leading to a crash in kernel memory..which gives rise to bsod(blue screen of death)..&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://2.bp.blogspot.com/_GvW8UOo5ICs/TO0QyXopAqI/AAAAAAAAAAk/chhvv8yT-yE/s1600/blue+screen+of+death.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="http://2.bp.blogspot.com/_GvW8UOo5ICs/TO0QyXopAqI/AAAAAAAAAAk/chhvv8yT-yE/s320/blue+screen+of+death.bmp" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;to solve this first uninstall newly installed applications after which this problem arise&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;..and then again restart your cpu..or restore your cpu to an earlier point using system restore when it was working fine..Sometimes it’s also due to windows error so just repair your windows also...&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;and then you have to remove virus from your cpu by using a good antivirus ..just scan and remove it..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;if the problem still persists reinstall your ram as explained above....and if the problem still persists there might be a physical damage to your ram..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;Protecting your pc from viruses and other malicious programs..&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Tip 1:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Always disable autorun.inf file after installing windows.&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;This will prevent viruses from running automatically.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;To do it…&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Just go to start -&amp;gt; run -&amp;gt; type regedit&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;And then go to this path&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;&amp;nbsp;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Right click and create&amp;nbsp; a new key.. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Give it a name autorun.inf&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;And give it a value @sys:doesnotexist&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_GvW8UOo5ICs/TO0Q-zHhErI/AAAAAAAAAAs/HjpcrnCD5uA/s1600/disabling+autorun.inf.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="436" src="http://3.bp.blogspot.com/_GvW8UOo5ICs/TO0Q-zHhErI/AAAAAAAAAAs/HjpcrnCD5uA/s640/disabling+autorun.inf.bmp" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Tip 2:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;25% viruses spread from mass storage devices and usb/cd&amp;nbsp; drives .&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;So you have to always check it before opening it.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;You can do it manually by using cmd and attrib command but there is a good software available which will also perform the same task, its&amp;nbsp; called usb disk security..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;You can download it from this link..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.ziddu.com/download/12663145/usbsecurity.rar.html"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;http://www.ziddu.com/download/12663145/usbsecurity.rar.html&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Tip 3:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Always after surfing internet delete all temporary internet files..&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;There are chances when viruses spread from&amp;nbsp; the temporary folder of your browser. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Goto run type %temp% select all and delete all…&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Tip 4:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Now apart from above the only source of spreading &amp;nbsp;of virus left is from sharing or downloading of infected files and softwares..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;&lt;u&gt;For this you need to create a restore point using system restore&lt;/u&gt; &amp;nbsp;and keep updated it with weak by weak basis and at any time you feel you have been infected with virus or any sort of malicious program, restore your windows to your so created restore point.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;In system restore you do not loose any audio /&amp;nbsp; video data&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Only your exe , .bat file will be restored to that particular time of restore point.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;Also sometimes there are problem like &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;“task manager has been disabled by your administrator”&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;“registry editing has been disabled by your administrator”&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;“no folder options”&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;And any other problem like created by virus..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;You can solve them manually but here is a good software..&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;To solve them without much effort.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.ziddu.com/download/12663004/RRT.rar.html"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;http://www.ziddu.com/download/12663004/RRT.rar.html&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7859045228002919282-8353666933691752538?l=amitbpit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitbpit.blogspot.com/feeds/8353666933691752538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amitbpit.blogspot.com/2010/11/computer-troubleshootinghandling.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/8353666933691752538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/8353666933691752538'/><link rel='alternate' type='text/html' href='http://amitbpit.blogspot.com/2010/11/computer-troubleshootinghandling.html' title='Computer troubleshooting:&quot;handling various problems of your pc and virus protection&quot;'/><author><name>amit kumar singh</name><uri>http://www.blogger.com/profile/11463278763395570850</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_GvW8UOo5ICs/TO0Q4hBwNPI/AAAAAAAAAAo/ksLsMAdlsKU/s72-c/computer+and+smps+on+wooden+table.bmp' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7859045228002919282.post-3368702857380691494</id><published>2010-09-03T07:38:00.000-07:00</published><updated>2010-09-07T07:48:02.599-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c/c++/timer'/><title type='text'>how can i write a program or application  in c / c++ to set timer for my computer to shut down</title><content type='html'>sometimes you want to set timer for your pc after which it automatically shutdown,,,suposse&lt;br /&gt;when you are copying files and you know it will be completed in 2 hours and you want to sleep&lt;br /&gt;...here is where you can set your timer for 2.30 hours after which it will automatically shutdown&lt;br /&gt;&lt;div style="background-color: white;"&gt;your pc....&lt;/div&gt;&lt;span style="background-color: lime;"&gt;&lt;/span&gt;&lt;br /&gt;here is link of source code and compiled exe file....&lt;br /&gt;&lt;a href="http://www.ziddu.com/download/11516935/timer.rar.html"&gt;http://www.ziddu.com/download/11516935/timer.rar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;the program is written in c/c++....&lt;br /&gt;&lt;br /&gt;and here is the source code......in c++.....&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;#include&amp;lt;iostream.h&amp;gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;#include&amp;lt;conio.h&amp;gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;#include&amp;lt;stdio.h&amp;gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;#include&amp;lt;dos.h&amp;gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;#include&amp;lt;process.h&amp;gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;#include&amp;lt;stdlib.h&amp;gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;void main()&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;signed int hours,minutes,seconds;&lt;/div&gt;&lt;div style="color: blue;"&gt;textcolor(GREEN);&lt;/div&gt;&lt;div style="color: blue;"&gt;clrscr();&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\t\t|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TIMER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |\n";&lt;/div&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\n \n \n \n\n\n\tPLEASE ENTER THE TIME IN";&lt;/div&gt;&lt;div style="color: blue;"&gt;textcolor(WHITE);&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;" HOURS::MINUTE::SECOND ";&lt;/div&gt;&lt;div style="color: blue;"&gt;textcolor(GREEN);&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"FORMAT TO SET THE TIMER ";&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\n\n\n\n\tPLEASE ENTER&amp;nbsp; HOURS ::";&lt;/div&gt;&lt;div style="color: blue;"&gt;cin&amp;gt;&amp;gt;hours;&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\n\tPLEASE ENTER MINUTES ::";&lt;/div&gt;&lt;div style="color: blue;"&gt;cin&amp;gt;&amp;gt;minutes;&lt;/div&gt;&lt;div style="color: blue;"&gt;if(minutes &amp;gt;60)&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;do&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\n\tPLEASE ENTER MINUTES LESS THAN 60 ::";&lt;/div&gt;&lt;div style="color: blue;"&gt;cin&amp;gt;&amp;gt;minutes;&lt;/div&gt;&lt;div style="color: blue;"&gt;}while(minutes &amp;gt;60);&lt;/div&gt;&lt;div style="color: blue;"&gt;}&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\n\tPLEASE ENTER SECONDS ::";&lt;/div&gt;&lt;div style="color: blue;"&gt;cin&amp;gt;&amp;gt;seconds;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;if(seconds &amp;gt;60)&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;do&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\n\tPLEASE ENTER SECONDSS LESS THAN 60 ::";&lt;/div&gt;&lt;div style="color: blue;"&gt;cin&amp;gt;&amp;gt;seconds;&lt;/div&gt;&lt;div style="color: blue;"&gt;}while(seconds &amp;gt;60);&lt;/div&gt;&lt;div style="color: blue;"&gt;}&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;if(!(hours==0 &amp;amp;&amp;amp; minutes==0 &amp;amp;&amp;amp; seconds ==0))&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;clrscr();&lt;/div&gt;&lt;span style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\t\t|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TIMER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |\n";&lt;/span&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\n\n\n\n\n\t\tYOUR SYSTEM WILL SHUTDOWN AFTER";&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;do{&lt;/div&gt;&lt;div style="color: blue;"&gt;if(hours==0 &amp;amp;&amp;amp; minutes==0 &amp;amp;&amp;amp; seconds ==0)&lt;/div&gt;&lt;div style="color: blue;"&gt;break;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;if(minutes!=0 || hours!=0)&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;if(seconds==0)&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;seconds=60;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;if(minutes == 0 &amp;amp;&amp;amp; hours!=0)&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;minutes=60;&lt;/div&gt;&lt;div style="color: blue;"&gt;hours--;&lt;/div&gt;&lt;div style="color: blue;"&gt;}&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;minutes--;&lt;/div&gt;&lt;div style="color: blue;"&gt;}&lt;/div&gt;&lt;div style="color: blue;"&gt;}&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;seconds--;&lt;/div&gt;&lt;div style="color: blue;"&gt;delay(1000);&lt;/div&gt;&lt;div style="color: blue;"&gt;gotoxy(30,15);&lt;/div&gt;&lt;div style="color: blue;"&gt;if(hours&amp;lt;10)&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"0"&amp;lt;&amp;lt;hours;&lt;/div&gt;&lt;div style="color: blue;"&gt;else&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;hours;&lt;/div&gt;&lt;div style="color: blue;"&gt;if(minutes&amp;lt;10)&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"::0"&amp;lt;&amp;lt;minutes;&lt;/div&gt;&lt;div style="color: blue;"&gt;else&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"::"&amp;lt;&amp;lt;minutes;&lt;/div&gt;&lt;div style="color: blue;"&gt;if(seconds&amp;lt;10)&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"::0"&amp;lt;&amp;lt;seconds;&lt;/div&gt;&lt;div style="color: blue;"&gt;else&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"::"&amp;lt;&amp;lt;seconds;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;}while(seconds &amp;gt; -1);&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&amp;nbsp;system("shutdown -s -f");&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;}&lt;/div&gt;&lt;div style="color: blue;"&gt;else&lt;/div&gt;&lt;div style="color: blue;"&gt;{&lt;/div&gt;&lt;div style="color: blue;"&gt;cout&amp;lt;&amp;lt;"\nPLEASE ENTER A VALID INPUT";&lt;/div&gt;&lt;div style="color: blue;"&gt;}&lt;/div&gt;&lt;div style="color: blue;"&gt;clrscr();&lt;/div&gt;&lt;span style="color: blue;"&gt;}&lt;/span&gt;&lt;iostream.h&gt;&lt;conio.h&gt;&lt;stdio.h&gt;&lt;dos.h&gt;&lt;process.h&gt;&lt;stdlib.h&gt;&lt;hours;&gt;&lt;hours;&gt;&lt;minutes;&gt;&lt;minutes;&gt;&lt;seconds;&gt;&lt;seconds;&gt;&lt;br /&gt;&lt;br /&gt;&lt;hours;&gt;&lt;hours;&gt;&lt;minutes;&gt;&lt;minutes;&gt;&lt;seconds;&gt;&lt;seconds;&gt; &lt;iostream.h&gt;&lt;conio.h&gt;&lt;stdio.h&gt;&lt;dos.h&gt;&lt;process.h&gt;&lt;stdlib.h&gt;&lt;hours;&gt;&lt;hours;&gt;&lt;minutes;&gt;&lt;minutes;&gt;&lt;seconds;&gt;&lt;seconds;&gt;&lt;iostream.h&gt;&lt;conio.h&gt;&lt;stdio.h&gt;&lt;dos.h&gt;&lt;process.h&gt;&lt;stdlib.h&gt;&lt;iostream.h&gt;&lt;conio.h&gt;&lt;stdio.h&gt;&lt;dos.h&gt;&lt;process.h&gt;&lt;stdlib.h&gt;&lt;hours;&gt;&lt;hours;&gt;&lt;minutes;&gt;&lt;minutes;&gt;&lt;seconds;&gt;&lt;seconds;&gt;thanks&lt;/seconds;&gt;&lt;/seconds;&gt;&lt;/minutes;&gt;&lt;/minutes;&gt;&lt;/hours;&gt;&lt;/hours;&gt;&lt;/stdlib.h&gt;&lt;/process.h&gt;&lt;/dos.h&gt;&lt;/stdio.h&gt;&lt;/conio.h&gt;&lt;/iostream.h&gt;&lt;/stdlib.h&gt;&lt;/process.h&gt;&lt;/dos.h&gt;&lt;/stdio.h&gt;&lt;/conio.h&gt;&lt;/iostream.h&gt;&lt;/seconds;&gt;&lt;/seconds;&gt;&lt;/minutes;&gt;&lt;/minutes;&gt;&lt;/hours;&gt;&lt;/hours;&gt;&lt;/stdlib.h&gt;&lt;/process.h&gt;&lt;/dos.h&gt;&lt;/stdio.h&gt;&lt;/conio.h&gt;&lt;/iostream.h&gt;&lt;br /&gt;&lt;iostream.h&gt;&lt;conio.h&gt;&lt;stdio.h&gt;&lt;dos.h&gt;&lt;process.h&gt;&lt;stdlib.h&gt;&lt;hours;&gt;&lt;hours;&gt;&lt;minutes;&gt;&lt;minutes;&gt;&lt;seconds;&gt;&lt;seconds;&gt;&lt;iostream.h&gt;&lt;conio.h&gt;&lt;stdio.h&gt;&lt;dos.h&gt;&lt;process.h&gt;&lt;stdlib.h&gt;&lt;iostream.h&gt;&lt;conio.h&gt;&lt;stdio.h&gt;&lt;dos.h&gt;&lt;process.h&gt;&lt;stdlib.h&gt;&lt;hours;&gt;&lt;hours;&gt;&lt;minutes;&gt;&lt;minutes;&gt;&lt;seconds;&gt;&lt;seconds;&gt;amit kumar singh@bpit&lt;/seconds;&gt;&lt;/seconds;&gt;&lt;/minutes;&gt;&lt;/minutes;&gt;&lt;/hours;&gt;&lt;/hours;&gt;&lt;/stdlib.h&gt;&lt;/process.h&gt;&lt;/dos.h&gt;&lt;/stdio.h&gt;&lt;/conio.h&gt;&lt;/iostream.h&gt;&lt;/stdlib.h&gt;&lt;/process.h&gt;&lt;/dos.h&gt;&lt;/stdio.h&gt;&lt;/conio.h&gt;&lt;/iostream.h&gt;&lt;/seconds;&gt;&lt;/seconds;&gt;&lt;/minutes;&gt;&lt;/minutes;&gt;&lt;/hours;&gt;&lt;/hours;&gt;&lt;/stdlib.h&gt;&lt;/process.h&gt;&lt;/dos.h&gt;&lt;/stdio.h&gt;&lt;/conio.h&gt;&lt;/iostream.h&gt;&lt;/seconds;&gt;&lt;/seconds;&gt;&lt;/minutes;&gt;&lt;/minutes;&gt;&lt;/hours;&gt;&lt;/hours;&gt;&lt;/seconds;&gt;&lt;/seconds;&gt;&lt;/minutes;&gt;&lt;/minutes;&gt;&lt;/hours;&gt;&lt;/hours;&gt;&lt;/stdlib.h&gt;&lt;/process.h&gt;&lt;/dos.h&gt;&lt;/stdio.h&gt;&lt;/conio.h&gt;&lt;/iostream.h&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7859045228002919282-3368702857380691494?l=amitbpit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitbpit.blogspot.com/feeds/3368702857380691494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amitbpit.blogspot.com/2010/09/how-can-i-write-program-in-c-c-to-set.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/3368702857380691494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/3368702857380691494'/><link rel='alternate' type='text/html' href='http://amitbpit.blogspot.com/2010/09/how-can-i-write-program-in-c-c-to-set.html' title='how can i write a program or application  in c / c++ to set timer for my computer to shut down'/><author><name>amit kumar singh</name><uri>http://www.blogger.com/profile/11463278763395570850</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7859045228002919282.post-5435472245751474468</id><published>2010-01-15T06:06:00.000-08:00</published><updated>2011-02-06T07:09:43.545-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c / c++'/><title type='text'>HOW TO RUN TURBO C/C++ OR 16-BIT C/C++ IN WINDOWS VISTA, SEVEN AND XP.</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;To run c/c++ 16 bit in windows vista,xp,windows 7 with full screen and 16-bit graphics support..&lt;br /&gt;first download microsoft virtual pc(32-bit if your window vista is 32-bit edition else 64-bit version) from the following link..&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=04D26402-3199-48A3-AFA2-2DC0B40A73B6&amp;amp;displaylang=en"&gt;DOWNLOAD&lt;/a&gt;&lt;br /&gt;first intall the software cos another utility will not work without it.. and now download that another utility from the following link..&lt;br /&gt;&lt;a href="http://www.ziddu.com/download/13699081/tcforvistafullscreen.rar.html"&gt;DOWNLOAD&lt;/a&gt;&lt;br /&gt;run the software..&lt;br /&gt;if will extract a folder...&lt;br /&gt;open it,,,&lt;br /&gt;click on dosv2.0..&lt;br /&gt;thats,,it..it will open you a c/c++ compiler..&lt;br /&gt;divesh pal @akgec&lt;br /&gt;amit kumar singh@bpit&lt;br /&gt;&lt;br /&gt;please leave your response..and suggestion&lt;br /&gt;as it can help others.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7859045228002919282-5435472245751474468?l=amitbpit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitbpit.blogspot.com/feeds/5435472245751474468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amitbpit.blogspot.com/2010/01/how-to-run-turbo-cc-or-16-bit-cc-in.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/5435472245751474468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/5435472245751474468'/><link rel='alternate' type='text/html' href='http://amitbpit.blogspot.com/2010/01/how-to-run-turbo-cc-or-16-bit-cc-in.html' title='HOW TO RUN TURBO C/C++ OR 16-BIT C/C++ IN WINDOWS VISTA, SEVEN AND XP.'/><author><name>amit kumar singh</name><uri>http://www.blogger.com/profile/11463278763395570850</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7859045228002919282.post-4152870693614953855</id><published>2009-07-07T10:34:00.000-07:00</published><updated>2011-02-06T07:01:12.701-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net'/><title type='text'>UNABLE TO CONNECT TO ASP.NET DEVELOPMENT SERVER</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;hi..to solve the problem of unable to connect to asp.net development server problem u can read this out.&lt;br /&gt;&lt;br /&gt;sometimes during debugging of our website code..we get a message&lt;br /&gt;unable to connect to asp.net sever&lt;br /&gt;here is a trick to resolve it&lt;br /&gt;first download the file from following link&lt;br /&gt;&lt;a href="http://www.ziddu.com/download/13699026/WebDev.WebServer.rar.html"&gt;http://www.ziddu.com/download/13699026/WebDev.WebServer.rar.html&lt;/a&gt;extract the file ..&lt;br /&gt;u will get an exe named WebDev.WebServer.exe&lt;br /&gt;simply right click and copy it..&lt;br /&gt;now..&lt;br /&gt;goto your drive containing windows...&lt;br /&gt;by deault this is c drive..&lt;br /&gt;so open&lt;br /&gt;the following path...&lt;br /&gt;C:\Program Files\Common Files\microsoft shared\DevServer\9.0&lt;br /&gt;you will find already a file named WebDev.WebServer.exe..&lt;br /&gt;so what you have to do is simply replace this file...&lt;br /&gt;by right click and paste...&lt;br /&gt;and click yes on the message that you want to replace the file..&lt;br /&gt;yes its done ...&lt;br /&gt;&lt;br /&gt;amit kumar singh@bpit&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7859045228002919282-4152870693614953855?l=amitbpit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitbpit.blogspot.com/feeds/4152870693614953855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amitbpit.blogspot.com/2009/07/unable-to-connect-to-aspnet-sever.html#comment-form' title='41 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/4152870693614953855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7859045228002919282/posts/default/4152870693614953855'/><link rel='alternate' type='text/html' href='http://amitbpit.blogspot.com/2009/07/unable-to-connect-to-aspnet-sever.html' title='UNABLE TO CONNECT TO ASP.NET DEVELOPMENT SERVER'/><author><name>amit kumar singh</name><uri>http://www.blogger.com/profile/11463278763395570850</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>41</thr:total></entry></feed>
