<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>driver writing != bus driving : Windows</title><link>http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx</link><description>Tags: Windows</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Driver Developer Conference - DDC 2008</title><link>http://blogs.msdn.com/iliast/archive/2008/09/25/driver-developer-conference-ddc-2008.aspx</link><pubDate>Fri, 26 Sep 2008 08:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8965981</guid><dc:creator>iliast</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/iliast/comments/8965981.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=8965981</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=8965981</wfw:comment><description>Next week (9/29 - 10/1) we'll have the &lt;a href="http://www.microsoft.com/whdc/491F34B0-E3D0-D1B1-0667-D4065525389C/default.mspx" mce_href="http://www.microsoft.com/whdc/491F34B0-E3D0-D1B1-0667-D4065525389C/default.mspx"&gt;Microsoft Windows Driver Developer Conference (DDC)&lt;/a&gt; in Redmond. We're expecting several driver developers. I'm excited about this, not only because it's the first time that I'll be participating in a Microsoft conference, but also because I'll be giving a talk! Indeed, &lt;a href="http://blogs.msdn.com/bobkjelgaard/" mce_href="http://blogs.msdn.com/bobkjelgaard/"&gt;Bob Kjelgaard&lt;/a&gt; and I are giving a talk titled "Packaging and Deploying KMDF and UMDF drivers". Actually, a better name for the talk would be "Everything technical that you ever wanted to know about the WDF coinstallers and were afraid to ask" (yes, I actually requested to have this title, however it didn't go through :) ). I think that right now the information that's externally available for the coinstallers is pretty limited. Actually, apart from the fact that "they are coinstallers and you need to have them with all your WDF drivers" and a few posts that Bob and I have written, I don't think that anything else is known about them. In our talk we'll try to show lots of light into this part of WDF.&lt;p&gt;The last several days we've been practising our talk and I'm pretty happy about it. There is enough technical information in the talk to explain all the common questions that people have and also there will be enough time in the end to answer all sorts of questions that might arise from the presentation. Also, we'll both be available to answer questions in the "Ask The Experts" session, in the panel discussion for WDF and of course we'll be talking to customers and partners in the corridors and in the halls, in order to answer the questions that they might have. I've been teasing Bob by telling him that I'll forward all the hard questions to him, however I've been really happy to work with Bob for such a long time. He's definately a really technical person and he's explaining all these advanced techniques of testing different parts of the framework that blow me away :)&lt;/p&gt;&lt;p&gt;Apart from our talk, there will be a series of presentations for WDF. I've actually sat through all the dry runs of the talks and I think that we have excellent material to present (yes, I know that it's kind of weird to praise the team that I'm part of, but I really believe it). I won't try to write down all the WDF presentations, however you can look at the &lt;a href="http://download.microsoft.com/download/2/9/e/29edfd7f-2ad8-480f-b06e-7aba65f8b029/DDC_2008_Agenda.xlsx" mce_href="http://download.microsoft.com/download/2/9/e/29edfd7f-2ad8-480f-b06e-7aba65f8b029/DDC_2008_Agenda.xlsx"&gt;agenda&lt;/a&gt; and the &lt;a href="http://www.microsoft.com/whdc/491F34B0-E3D0-D1B1-0667-D4065525389C/sessions.aspx" mce_href="http://www.microsoft.com/whdc/491F34B0-E3D0-D1B1-0667-D4065525389C/sessions.aspx"&gt;descriptions&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So, for those of you, who are coming to DDC and are interested in the WDF coinstallers, please come with all your questions and we'll be happy to answer them as best as we can! &lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8965981" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Drivers+_2800_General_2900_/default.aspx">Drivers (General)</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Code Quality: Windows vs Linux vs FreeBSD vs Solaris</title><link>http://blogs.msdn.com/iliast/archive/2008/05/16/code-quality-windows-vs-linux-vs-freebsd-vs-solaris.aspx</link><pubDate>Sat, 17 May 2008 06:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8516397</guid><dc:creator>iliast</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/iliast/comments/8516397.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=8516397</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=8516397</wfw:comment><description>
&lt;p class="MsoNormal"&gt;&lt;a href="http://www.spinellis.gr/" mce_href="http://www.spinellis.gr/"&gt;Diomidis
Spinellis&lt;/a&gt; has written a good paper for the &lt;a href="http://www.icse-conferences.org/" mce_href="http://www.icse-conferences.org/"&gt;“30&lt;sup&gt;th&lt;/sup&gt; International Conference on Software
Engineering” (ICSE ’08)&lt;/a&gt; that looks at the code quality of the source codes of Windows (WRK –
Research Kernel based on Windows Server 2003), Linux, Solaris and FreeBSD.
Diomidis has analyzed the source codes of these 4 kernels and uses some code
metrics, in order to measure the quality of each kernel in each area.&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;For those, who don’t like reading lengthy texts, a summary
of the results is at the end (section 5: summary and discussion). Each operating system has its own strengths and weaknesses, so there is no clear winner.&lt;br&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;The paper can be found at &lt;a href="http://www.spinellis.gr/pubs/conf/2008-ICSE-4kernel/html/Spi08b.pdf"&gt;http://www.spinellis.gr/pubs/conf/2008-ICSE-4kernel/html/Spi08b.pdf&lt;/a&gt;
and all the queries for the code analysis can be found at &lt;a href="http://www.spinellis.gr/sw/4kernel/"&gt;http://www.spinellis.gr/sw/4kernel/&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Finally, Diomidis has a very lengthy list of &lt;a href="http://www.spinellis.gr/bib/index.htm" mce_href="http://www.spinellis.gr/bib/index.htm"&gt;classic reads&lt;/a&gt; at his website.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8516397" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Linux/default.aspx">Linux</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Developing Windows Drivers With Visual Studio</title><link>http://blogs.msdn.com/iliast/archive/2008/01/29/developing-windows-drivers-with-visual-studio.aspx</link><pubDate>Wed, 30 Jan 2008 01:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7314269</guid><dc:creator>iliast</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/iliast/comments/7314269.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=7314269</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=7314269</wfw:comment><description>&lt;p&gt;Today morning I received an email from &lt;a href="http://blogs.msdn.com/888_umdf_4_you/" mce_href="http://blogs.msdn.com/888_umdf_4_you/"&gt;Patrick&lt;/a&gt; with a &lt;a href="http://www.generationxwing.members.winisp.net/intellisensational.png" mce_href="http://www.generationxwing.members.winisp.net/intellisensational.png"&gt;picture of Visual Studio with Intellisense on a WDF driver&lt;/a&gt;. Ok, I have to admit that in the beginning I thought that Patrick was using Photoshop! He's a guy, who just doesn't like GUIs in the first place! He can just go on and on about the advantages of using kd instead of windbg! He even refuses to look at the source code (even if it's available), since "he can look at the assembly"! I have to admit that until now I thought that he was doing "copy con driver.c" to write drivers... and then use edit.com from a full-screen command prompt to do additional editing. Anyway, it seems that I was wrong.&lt;/p&gt;&lt;p&gt;So, in order to be sure that Patrick hadn't used Photoshop (or just opened the screenshot with a hex editor and manually edited it, in order to add Intellisense!), I went to his office. Over there, indeed he showed me that it's really easy to Intellisense and help integration to Visual Studio (yay!). That's nice stuff! My next question was, if it's possible to load wudfext.dll (the UMDF windbg extension) from Visual Studio and use the UMDF extensions from the VS debugger, however it's not possible (even though there's some info on how to load windbg extensions at http://www.osronline.com/showThread.cfm?link=66160), because not all windbg interfaces are implemented by Visual Studio.&lt;/p&gt;&lt;p&gt;Anyway, Patrick has written a &lt;a href="http://blogs.msdn.com/888_umdf_4_you/archive/2008/01/29/7312079.aspx" mce_href="http://blogs.msdn.com/888_umdf_4_you/archive/2008/01/29/7312079.aspx"&gt;post&lt;/a&gt; saying that indeed he's been using Visual Studio for ever, in order to develop Windows Drivers. If more people ask him tips on how to make VS the best editor for Windows Drivers, he promised that he'll share a small part of his infinite wisdom :) So, feel free to ask him and/or send him an email!&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;DISCLAIMER: Visual Studio is not officially supported by Microsoft for driver development. The only currently supported build environment is the command window that comes with the WDK. Any opinions expressed in this article don't affect Microsoft's policy on this issue.&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7314269" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Debugging/default.aspx">Debugging</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Drivers+_2800_General_2900_/default.aspx">Drivers (General)</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Impressions from Seattle Code Camp v3.0</title><link>http://blogs.msdn.com/iliast/archive/2008/01/27/impressions-from-seattle-code-camp-v3-0.aspx</link><pubDate>Mon, 28 Jan 2008 07:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7280548</guid><dc:creator>iliast</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/iliast/comments/7280548.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=7280548</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=7280548</wfw:comment><description>&lt;p&gt;During this weekend I went to the &lt;a href="https://seattle.codecamp.us/default.aspx" mce_href="https://seattle.codecamp.us/default.aspx"&gt;Seattle Code Camp v3.0&lt;/a&gt;. The talks were mostly oriented towards .NET,so it was a good opportunity for me to get a better understanding of all those buzzwords that are unknown to the world of drivers. I also had the opportunity to talk to many interesting people and listen to their ideas about .NET and software development in general.&lt;/p&gt;&lt;p&gt;I started my first day at the code camp by going to &lt;a href="http://jasonhaley.com/" mce_href="http://jasonhaley.com/"&gt;Jason Haley&lt;/a&gt;'s talk, which focused on the .NET Reflector (nothing to do with the UMDF Reflector :) ), which is the most commonly used .NET dissassembler. Jason covered both the reflector, as well as some plug-ins. I had seen the Reflector in use before, however it was a nice overview. I've been reading Jason's link-blog very often and fortunately we had the time during the break to discuss a little bit more.&lt;/p&gt;&lt;p&gt;After his talk, it was time for me to understand what Silverlight and WPF (Windows Presentation Foundation) are. I've heard lots of good stuff about them, however I had no idea what they actually do (apart from the fact that they have to do with the way that applications look). So, after looking at some cool demos in &lt;a href="http://whitepdx.com/blogs/kelly/default.aspx" mce_href="http://whitepdx.com/blogs/kelly/default.aspx"&gt;Kelly White's&lt;/a&gt; talk, &lt;a href="http://adamkinney.com/" mce_href="http://adamkinney.com/"&gt;Adam Kinney&lt;/a&gt; explained all the theory behind it (what Silverlight is, what are the differences between v1.0 and 2.0, what are the differences between Silverlight, WPF and Flash etc). Adam also went through the development of a cool app that can be shown both in a web browser (using Silverlight) and in the Vista sidebar (using WPF).&lt;br&gt;&lt;/p&gt;&lt;p&gt;Then I decided to move to a bit more familiar space by going to &lt;a href="http://whatcom.kulshan.com/contact/author.asp?AuthorId=2" mce_href="http://whatcom.kulshan.com/contact/author.asp?AuthorId=2"&gt;Wayne Berry's&lt;/a&gt; talk on hashing. Wayne showed some practical aspects of how hashing is implemented in applications (as opposed to the mathematical theory behind it), as well as potential pitfalls that developers face. &lt;a href="http://www.davinciunltd.com/" mce_href="http://www.davinciunltd.com/"&gt;Jim McKeeth&lt;/a&gt; also had a very interesting talk on implementing cryptography using the Win32 CryptoAPI, however I  had to miss it, because I wanted to go to see the xUnit.NET talk from &lt;a href="http://bradwilson.typepad.com/" mce_href="http://bradwilson.typepad.com/"&gt;Brad Wilson&lt;/a&gt; and &lt;a href="http://jamesnewkirk.typepad.com/" mce_href="http://jamesnewkirk.typepad.com/"&gt;James Newkirk&lt;/a&gt;. The xUnit.NET talk presented some really cool ideas on unit testing, however I hope that Brad will upload his Cryptography presentation to the web, since he did the same with his &lt;a href="http://www.davinciunltd.com/code/advanced-downloads-with-delphi/" mce_href="http://www.davinciunltd.com/code/advanced-downloads-with-delphi/"&gt;"Advanced Downloads"&lt;/a&gt; presentation. Now that I'm thinking about it, the Cryptography talk was the only non-.NET talk of the event and I didn't go to it!&lt;/p&gt;&lt;p&gt;Anyway, the next morning, it was time to understand WCF (Windows Communication Foundation).&amp;nbsp; &lt;a href="http://www.mcwtech.com/" mce_href="http://www.mcwtech.com/"&gt;Robert Green&lt;/a&gt; gave an excellent presentation. He explained what WCF is and he created a service that could be reached both through TCP and through HTTP (depending on the client being local or remote) and showed how easy interoperability has become with the use of WCF.&lt;/p&gt;&lt;p&gt;The last talk that I went to was &lt;a href="http://blogs.msdn.com/charles_sterling/" mce_href="http://blogs.msdn.com/charles_sterling/"&gt;Charles Sterlings'&lt;/a&gt; talk on how Visual Studio 2008 Team System's features that are related to Application Lifecycle Management. Ok, first of all, I'd like to say that Charles is an excellent presenter. He had only demos and no slides (!) His whole talk was interactive and he actually asked us (the viewers) to do the demos for him (!) I also got a T-shirt with the Visual Studio logo :) Anyway, during his talk I couldn't prevent myself from (mentally) comparing the tools that are being used by application-developers to the ones that are being used by driver developers. Charles was showing all these cool features that VS2008 has and I just had to think that in order to compile a driver I need to go to a command prompt and type bcz (ok I know that I can use batch files, in order to call bcz from VS, however this is not the main point)... Also, I'm using an editor without Intellisense (and that's even more important than the previous issue)... No help-file integration... I was feeling like a prehistoric person in the middle of modern New York. I know that Doron has also &lt;a href="http://blogs.msdn.com/doronh/archive/2007/06/25/user-empathy-is-a-weird-thing.aspx" mce_href="http://blogs.msdn.com/doronh/archive/2007/06/25/user-empathy-is-a-weird-thing.aspx"&gt;blogged&lt;/a&gt; about this feeling. When I told a couple of .NET developers about the tools in driver-land they couln't believe their ears. Anyway, hopefully sometime in the future, driver developers might reach a critical mass and things might change... Until then...&lt;br&gt;&lt;/p&gt;&lt;p&gt;Unfortunately I had to leave before the end of the event, otherwise I would like to see more stuff about WCF and Ajax. However, the event was very well organized (kudos to everybody, who helped organize it). I understood several buzzworks (Silverlight, Moonlight, WPF, WCF, etc). All the talks were really interesting and I'm sure that all the visitors enjoyed it. I know that I'll definately go to Seattle Code Camp v4.0 :)&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7280548" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>My List of Top 5 Windows Books</title><link>http://blogs.msdn.com/iliast/archive/2008/01/23/my-list-of-top-5-windows-books.aspx</link><pubDate>Thu, 24 Jan 2008 03:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7213511</guid><dc:creator>iliast</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/iliast/comments/7213511.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=7213511</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=7213511</wfw:comment><description>&lt;p&gt;I've been reading quite a bit for the last couple of months and I compiled my list of the 5 Windows development books that I want to complete:&lt;/p&gt;&lt;p&gt;1) &lt;a href="http://www.amazon.com/Windows%C2%AE-Internals-Including-Windows-PRO-Developer/dp/0735625301/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-2" mce_href="http://www.amazon.com/Windows%C2%AE-Internals-Including-Windows-PRO-Developer/dp/0735625301/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-2"&gt;Windows Internals&lt;/a&gt; (finished): The classic book by Mark Russinovich and David Solomon is now in its 5th edition. I've read the 4th one and I think that it's a must-read for every windows developer.&lt;/p&gt;&lt;p&gt;2) &lt;a href="http://www.amazon.com/Developing-Drivers-Windows-Foundation-Developer/dp/0735623740/ref=pd_bbs_6?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-6" mce_href="http://www.amazon.com/Developing-Drivers-Windows-Foundation-Developer/dp/0735623740/ref=pd_bbs_6?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-6"&gt;Developing Drivers with the Windows Driver Foundation&lt;/a&gt; (finished): I just finished the book and I think that its the best book currently available to windows driver developers, especially for beginners. I'll write a review shortly, however I think that it's definately the most complete and at the same time easier to read book on windows drivers.&lt;/p&gt;&lt;p&gt;3) &lt;a href="http://www.amazon.com/Advanced-Debugging-Addison-Wesley-Microsoft-Technology/dp/0321374460/ref=pd_bbs_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-3" mce_href="http://www.amazon.com/Advanced-Debugging-Addison-Wesley-Microsoft-Technology/dp/0321374460/ref=pd_bbs_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-3"&gt;Advanced Windows Debugging&lt;/a&gt; (not started): After John Robbins decided not to write a debugging book for Win32 programming, I was wondering which book would take its place. I've read lots of good reviews about this book and I have it in my bookcase, so I'm eager to read it. Just with a first glance it seems to be exactly what I was searching for.&lt;/p&gt;&lt;p&gt;4) &lt;a href="http://www.amazon.com/Windows-via-C%2B%2B-Pro-Developer/dp/0735624240/ref=pd_bbs_7?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-7" mce_href="http://www.amazon.com/Windows-via-C%2B%2B-Pro-Developer/dp/0735624240/ref=pd_bbs_7?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-7"&gt;Windows via C/C++&lt;/a&gt; (not started): This is the latest version for "Programming Applications for Microsoft Windows". It covers application development in Windows. I've taken a class by Jeffrey Richer and I know that he's definately both a good developer and a good teacher, so I'm waiting to read it.&lt;/p&gt;&lt;p&gt;5) &lt;a href="http://www.amazon.com/Programming-Microsoft-Windows-Driver-Second/dp/0735618038/ref=pd_bbs_12?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-12" mce_href="http://www.amazon.com/Programming-Microsoft-Windows-Driver-Second/dp/0735618038/ref=pd_bbs_12?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-12"&gt;Programming the Windows Driver Model&lt;/a&gt; (half-read): This is the most tough-to-read and most advanced book in windows driver development. It covers many aspects of windows in depth, however I don't feel that I'm ready to read it yet. I've tried a couple of times in the past and I failed miserably. I think that really understanding this book means that your level is definately above intermediate.&lt;/p&gt;&lt;p&gt;Of course, there are other books, like &lt;a href="http://www.amazon.com/Rootkits-Subverting-Addison-Wesley-Software-Security/dp/0321294319/ref=pd_bbs_4?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-4" mce_href="http://www.amazon.com/Rootkits-Subverting-Addison-Wesley-Software-Security/dp/0321294319/ref=pd_bbs_4?ie=UTF8&amp;amp;s=books&amp;amp;qid=1201133827&amp;amp;sr=8-4"&gt;Subverting the Windows Kernel&lt;/a&gt;, however these are my top choices. I'd love to hear your comments, as well as your top choices.&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7213511" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Books/default.aspx">Books</category></item><item><title>How Driver Installation Works</title><link>http://blogs.msdn.com/iliast/archive/2007/10/06/how-driver-installation-works.aspx</link><pubDate>Sat, 06 Oct 2007 23:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5323592</guid><dc:creator>iliast</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/iliast/comments/5323592.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=5323592</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=5323592</wfw:comment><description>&lt;p&gt;The last few months I've been working on the WDF 1.7 (UMDF+KMDF) coinstallers (that's one of the reasons that I've been silent for quite some time).&lt;/p&gt;&lt;p&gt;Through this process I managed to learn a lot of things about how driver installation works and what is required by the driver developer. Unfortunately, this area is often a black box for driver developers, since their job ends, after the driver is up and running (and hopefully tested :) ). However, it's possible that you might want the driver installation to do something "more", e.g. change the icon of the device in the device manager or add a page in the device manager that shows the driver capabilities, etc. This is when a coinstaller or a class installer is needed.&lt;/p&gt;&lt;p&gt;Let's start from the beginning though. If you have a driver, then how do you install it? The easy way is &lt;a href="http://www.osronline.com/article.cfm?article=157" mce_href="http://www.osronline.com/article.cfm?article=157"&gt;OSR's Driver Loader&lt;/a&gt;. Just point to your sys file, click "Register Service" (i.e. create the appropriate settings in the registry at HKLM\System\CurrentControlSet\Services\&amp;lt;Driver Name&amp;gt;) and "Start Service" (i.e. call the Service Control Manager APIs that load the driver according to the registry settings). If you want to remove the driver, just click on "Stop Service" (stops the driver from running) and "Unregister Service" (deletes the registry settings). Easy, right? You don't need an inf file or anything more apart from your driver. However, this program supports non-pnp (legacy) drivers only.&lt;br&gt;&lt;/p&gt;&lt;p&gt;For WDF drivers we provide a coinstaller (one for UMDF and one for KMDF). The main tasks of the coinstaller is to upgrade the framework (e.g. from 1.5 to 1.7), parse the inf file and configure the driver correctly. In the past, we've had some issues with the previous versions of the coinstallers, as shown by Bob Kjelgaard (&lt;a href="http://blogs.msdn.com/bobkjelgaard/archive/2007/08/02/what-would-you-do-for-a-customer.aspx" mce_href="http://blogs.msdn.com/bobkjelgaard/archive/2007/08/02/what-would-you-do-for-a-customer.aspx"&gt;part 1&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/bobkjelgaard/archive/2007/08/10/root-causing-a-not-reproducible-kmdf-installation-issue-part-2-not-stupid-merely-human.aspx" mce_href="http://blogs.msdn.com/bobkjelgaard/archive/2007/08/10/root-causing-a-not-reproducible-kmdf-installation-issue-part-2-not-stupid-merely-human.aspx"&gt;part 2&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/bobkjelgaard/archive/2007/08/16/root-causing-a-not-reproducible-kmdf-installation-issue-part-3-pay-dirt.aspx" mce_href="http://blogs.msdn.com/bobkjelgaard/archive/2007/08/16/root-causing-a-not-reproducible-kmdf-installation-issue-part-3-pay-dirt.aspx"&gt;part 3&lt;/a&gt;), however we're trying our best to tackle them. By the way, if you have any problems with the installation of a WDF driver, please look at the &lt;a href="http://blogs.msdn.com/doronh/archive/2006/08/31/734412.aspx" mce_href="http://blogs.msdn.com/doronh/archive/2006/08/31/734412.aspx"&gt;Doron's post&lt;/a&gt; for information on how to debug it and at &lt;a href="http://blogs.msdn.com/bobkjelgaard/archive/2007/09/11/wdf-support-channels-changing-looking-for-more-info-on-installation-issues.aspx" mce_href="http://blogs.msdn.com/bobkjelgaard/archive/2007/09/11/wdf-support-channels-changing-looking-for-more-info-on-installation-issues.aspx"&gt;Bob's post&lt;/a&gt; for information about how you can ask more help from Microsoft.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Microsoft has lots of useful information on Driver Installation at &lt;a href="http://www.microsoft.com/whdc/driver/install/default.mspx" mce_href="http://www.microsoft.com/whdc/driver/install/default.mspx"&gt;http://www.microsoft.com/whdc/driver/install/default.mspx&lt;/a&gt;, however I'd also like to point specifically to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Eugene Lin and Jason Cobb's &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=156316" mce_href="http://channel9.msdn.com/ShowPost.aspx?PostID=156316"&gt;channel9 video&lt;/a&gt;: Introductory overview on how the user-mode Plug-and-Play manager works and how the installation works from the point that the device is connected to the machine, until the corresponding driver is selected and the device is running&lt;br&gt;&lt;/li&gt;&lt;li&gt;Jim Cavalaris' &lt;a href="http://download.microsoft.com/download/a/f/d/afdfd50d-6eb9-425e-84e1-b4085a80e34e/DVR-T394_WH07.pptx" mce_href="http://download.microsoft.com/download/a/f/d/afdfd50d-6eb9-425e-84e1-b4085a80e34e/DVR-T394_WH07.pptx"&gt;presentation on coinstallers and class installers&lt;/a&gt;: Excellent presentation that shows how the class installers and the coinstaller cooperate during driver installation. Also look at the resources, which are provided at the last page.&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.microsoft.com/download/a/f/d/afdfd50d-6eb9-425e-84e1-b4085a80e34e/DVR-T502_WH07.pptx" mce_href="http://download.microsoft.com/download/a/f/d/afdfd50d-6eb9-425e-84e1-b4085a80e34e/DVR-T502_WH07.pptx"&gt;Debugging Device Installation on Windows Vista&lt;/a&gt;: Everything that you wanted to know (and even more than that!) about how to debug problems during device installation (and were afraid to ask)&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library//ms790231.aspx" mce_href="http://msdn2.microsoft.com/en-us/library//ms790231.aspx"&gt;Device Installation Design Guide&lt;/a&gt;: Microsoft's official documentation on everything that has to do with device installation&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5323592" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Debugging/default.aspx">Debugging</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Drivers+_2800_General_2900_/default.aspx">Drivers (General)</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>What's New in Windows Vista?</title><link>http://blogs.msdn.com/iliast/archive/2007/03/25/what-s-new-in-windows-vista.aspx</link><pubDate>Mon, 26 Mar 2007 07:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1950207</guid><dc:creator>iliast</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/iliast/comments/1950207.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=1950207</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=1950207</wfw:comment><description>&lt;p&gt;One of the most popular questions that I've been hearing lately is "what's new in Windows Vista?". Therefore, I could not prevent myself from writing a post with links that provide information about this issue:&lt;br&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Let's start with the changes in the kernel. Mark Russinovich covers this topic very well:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/technet/technetmag/issues/2007/02/VistaKernel/default.aspx" mce_href="http://www.microsoft.com/technet/technetmag/issues/2007/02/VistaKernel/default.aspx"&gt;Part 1: Processes, threads and I/O&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/technet/technetmag/issues/2007/03/VistaKernel/default.aspx" mce_href="http://www.microsoft.com/technet/technetmag/issues/2007/03/VistaKernel/default.aspx"&gt;Part 2: Memory management, system startup, shutdown, and power management&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/technet/technetmag/issues/2007/04/VistaKernel/" mce_href="http://www.microsoft.com/technet/technetmag/issues/2007/04/VistaKernel/"&gt;Part 3: Reliability, recovery, security&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/emea/itsshowtime/sessionh.aspx?videoid=340" mce_href="http://www.microsoft.com/emea/itsshowtime/sessionh.aspx?videoid=340"&gt;Summarizing video: Vista Kernel Changes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/emea/itsshowtime/sessionh.aspx?videoid=360" mce_href="http://www.microsoft.com/emea/itsshowtime/sessionh.aspx?videoid=360"&gt;Additional video: User Account Control (UAC)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;In user-mode, Arstechnica provides a &lt;a href="http://arstechnica.com/reviews/os/pretty-vista.ars/1" mce_href="http://arstechnica.com/reviews/os/pretty-vista.ars/1"&gt;deep overview&lt;/a&gt; (this is the first post of a three-part review)&lt;/li&gt;&lt;li&gt;Security-related topics:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Michael Howard presents the big picture about Windows Vista's security &lt;a href="http://blogs.msdn.com/michael_howard/archive/2006/06/12/windows-vista-security-a-bigger-picture.aspx" mce_href="http://blogs.msdn.com/michael_howard/archive/2006/06/12/windows-vista-security-a-bigger-picture.aspx"&gt;here&lt;/a&gt; and focuses on ASLR (&lt;a href="http://blogs.msdn.com/michael_howard/archive/2006/05/26/address-space-layout-randomization-in-windows-vista.aspx" mce_href="http://blogs.msdn.com/michael_howard/archive/2006/05/26/address-space-layout-randomization-in-windows-vista.aspx"&gt;here &lt;/a&gt;and &lt;a href="http://blogs.msdn.com/michael_howard/archive/2006/06/06/windows-vista-address-space-layout-randomization-what-is-randomized.aspx" mce_href="http://blogs.msdn.com/michael_howard/archive/2006/06/06/windows-vista-address-space-layout-randomization-what-is-randomized.aspx"&gt;here&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/michael_howard/archive/2006/05/25/windows-vista-security-enhancements.aspx" mce_href="http://blogs.msdn.com/michael_howard/archive/2006/05/25/windows-vista-security-enhancements.aspx"&gt;Windows Vista Security Enchancements&lt;/a&gt; discusses about the changes in more depth&lt;/li&gt;&lt;li&gt;Channel9 videos about security in Vista (&lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=261824" mce_href="http://channel9.msdn.com/ShowPost.aspx?PostID=261824"&gt;part 1&lt;/a&gt;, &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=262227" mce_href="http://channel9.msdn.com/ShowPost.aspx?PostID=262227"&gt;part 2&lt;/a&gt;) and &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=288259" mce_href="http://channel9.msdn.com/ShowPost.aspx?PostID=288259"&gt;User Account Control (UAC)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Channel9 has &lt;a href="http://channel9.msdn.com/tags/Windows+Vista" mce_href="http://channel9.msdn.com/tags/Windows+Vista"&gt;videos&lt;/a&gt; that cover many windows components that are new in windows vista&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Technical_features_new_to_Windows_Vista" mce_href="http://en.wikipedia.org/wiki/Technical_features_new_to_Windows_Vista"&gt;Wikipedia&lt;/a&gt; provides a quick overview of all the new additions in Windows Vista&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;If you are interested in a detailed comparison between the different Windows Vista versions (Home, Business, Enterprise, etc), then you can look &lt;a href="http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=587581&amp;amp;SiteID=17" mce_href="http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=587581&amp;amp;SiteID=17"&gt;here (4th post)&lt;/a&gt;. &lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1950207" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Tips On How To Analyze Strange Crash Dumps And Uninstall Hidden Drivers</title><link>http://blogs.msdn.com/iliast/archive/2007/01/11/tips-on-how-to-analyze-strange-crash-dumps-and-uninstall-hidden-drivers.aspx</link><pubDate>Fri, 12 Jan 2007 05:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1453571</guid><dc:creator>iliast</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/iliast/comments/1453571.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=1453571</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=1453571</wfw:comment><description>&lt;p&gt;Recently, a friend of mine had the following problem: his computer crashed exactly 2 hours after booting into windows. As usual, I opened windbg and executed !analyze -v in the minidumps, however I didn't get any useful information:&lt;/p&gt;DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)&lt;br&gt;An attempt was made to access a pageable (or completely invalid) address at an interrupt request level (IRQL) that is too high.&amp;nbsp; This is usually caused by drivers using improper addresses. If kernel debugger is available get stack backtrace.&lt;br&gt;Arguments:&lt;br&gt;Arg1: 00000081, memory referenced&lt;br&gt;Arg2: 00000002, IRQL&lt;br&gt;Arg3: 00000000, value 0 = read operation, 1 = write operation&lt;br&gt;Arg4: 865d7aa8, address which referenced memory&lt;br&gt;&lt;br&gt;Debugging Details:&lt;br&gt;------------------&lt;br&gt;READ_ADDRESS:&amp;nbsp; 00000081 &lt;br&gt;CURRENT_IRQL:&amp;nbsp; 2&lt;br&gt;FAULTING_IP: +ffffffff865d7aa8&lt;br&gt;865d7aa8 0000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [eax],al&lt;br&gt;&lt;br&gt;CUSTOMER_CRASH_COUNT:&amp;nbsp; 2&lt;br&gt;DEFAULT_BUCKET_ID:&amp;nbsp; DRIVER_FAULT&lt;br&gt;BUGCHECK_STR:&amp;nbsp; 0xD1&lt;br&gt;LAST_CONTROL_TRANSFER:&amp;nbsp; from 80544f5f to 865d7aa8&lt;br&gt;&lt;br&gt;STACK_TEXT: &amp;nbsp;&lt;br&gt;WARNING: Frame IP not in any known module. Following frames may be wrong.&lt;br&gt;f78aafcc 80544f5f 865941a8 86581000 00000000 0x865d7aa8&lt;br&gt;f78aaff4 80544acb a7554d44 00000000 00000000 nt!KiRetireDpcList+0x61&lt;br&gt;f78aaff8 a7554d44 00000000 00000000 00000000 nt!KiDispatchInterrupt+0x2b&lt;br&gt;80544acb 00000000 00000009 0081850f bb830000 0xa7554d44&lt;br&gt;&lt;br&gt;STACK_COMMAND:&amp;nbsp; kb&lt;br&gt;FOLLOWUP_IP:&amp;nbsp; nt!KiRetireDpcList+61 80544f5f 837c240c00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [esp+0xc],0x0&lt;br&gt;FAULTING_SOURCE_CODE: &amp;nbsp;&lt;br&gt;SYMBOL_STACK_INDEX:&amp;nbsp; 1&lt;br&gt;FOLLOWUP_NAME:&amp;nbsp; MachineOwner&lt;br&gt;SYMBOL_NAME:&amp;nbsp; nt!KiRetireDpcList+61&lt;br&gt;MODULE_NAME:&amp;nbsp; nt&lt;br&gt;IMAGE_NAME:&amp;nbsp; ntkrpamp.exe&lt;br&gt;DEBUG_FLR_IMAGE_TIMESTAMP:&amp;nbsp; 4356d823&lt;br&gt;FAILURE_BUCKET_ID:&amp;nbsp; 0xD1_nt!KiRetireDpcList+61&lt;br&gt;BUCKET_ID:&amp;nbsp; 0xD1_nt!KiRetireDpcList+61&lt;br&gt;Followup: MachineOwner&lt;br&gt;&lt;p&gt;Unfortunately, windbg doesn't have any other information from the call stack, so he can only point to the windows kernel. This is a common behavior that can be seen, when a driver really messes things up. You should be alert that, when this happens, you might have to do some more advanced digging or some more "trial and error" (like I did). I'm sure that the problematic driver could have been found using driver verifier or some more advanced techniques, but here I would like to show a more quick-and-dirty solution.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Since the problem happened exactly 2 hours after he booted into windows, this could not be a hardware problem (since a hardware problem would occur more randomly). Also, from the bugcheck code it is obvious that it is a driver's fault. As a first step, I executed &lt;/p&gt;&lt;p&gt;&lt;b&gt;lm&lt;/b&gt; and &lt;b&gt;lm kv m specific_driver*&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;to find all the drivers that were loaded into the system and also to find specific information about some "interesting" ones. I saw that no driver was loaded at an address close to 0x865d6668.&lt;/p&gt;&lt;p&gt;The next step was to try and isolate drivers that might seem more suspicious than others. I found that an easy way to look at the drivers running on a system is &lt;a href="http://www.nirsoft.net/utils/driverview.html" mce_href="http://www.nirsoft.net/utils/driverview.html"&gt;driverview&lt;/a&gt;. This tool shows approximately the same information like windbg (driver name, corresponding filename, description, company name, etc), but also has a nice GUI. So, after finding some "interesting" cases, the next step was to uninstall some drivers. Of course, before that I tried to enable driver verifier on different driver categories, however this took quite some time and I opted for an easier solution :)&lt;br&gt;&lt;/p&gt;&lt;p&gt;The problem here was the fact that by default not all drivers are viewable from the control panel. In order to show all drivers (even the hidden ones), you need to do the following:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Open a command prompt (e.g. go to Start/Run and type cmd)&lt;/li&gt;&lt;li&gt;At the command prompt, type "set devmgr_show_nonpresent_devices=1" (without the quotes)&lt;/li&gt;&lt;li&gt;Type  "devmgmt.msc" (without the quotes) and press enter. The Device Manager comes up.&lt;/li&gt;&lt;li&gt;Go to "View" -&amp;gt; "Show Hidden Devices" and you'll see all the drivers that are currently running on your computer, as well as the drivers that are installed, but not running (e.g. because the corresponding device is not currently connected to the computer).&lt;br&gt;
&lt;/li&gt;&lt;li&gt;After removing the drivers (by right-clicking on the corresponding device and clicking "uninstall") that you are sure that you don't need (don't remove all the unused devices just because they are greyed out! Make sure to remove only the ones that you don't need), you can close the device manager.&lt;/li&gt;&lt;li&gt;Keep in mind that, until you close the above command prompt, every instance of device manager that you launch from there will be able to show all the hidden devices.&lt;br&gt;&lt;/li&gt;&lt;li&gt;Also, if you want to avoid having to set the variable any time that you want to look at the hidden device drivers, you can go to Control Panel -&amp;gt; System -&amp;gt; Advanced -&amp;gt; Environment Variables and set it there.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Of course, if you want to have a&amp;nbsp; tool that allows you to remove drivers easily, you can download the &lt;a href="http://www.l5sg.com/Products/Downloads/drivermanager.html" mce_href="http://www.l5sg.com/Products/Downloads/drivermanager.html"&gt;Driver Manager&lt;/a&gt;, which shows the list of the running drivers and allows you to disable them or remove&amp;nbsp; them.&lt;/p&gt;&lt;p&gt;So, in my case, after removing different sets of suspicious drivers, the culprit was found and removed from the system, so everything is now back to normal :)&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1453571" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Debugging/default.aspx">Debugging</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Crash Dump Analysis</title><link>http://blogs.msdn.com/iliast/archive/2006/12/11/crash-dump-analysis.aspx</link><pubDate>Tue, 12 Dec 2006 05:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1264335</guid><dc:creator>iliast</dc:creator><slash:comments>18</slash:comments><comments>http://blogs.msdn.com/iliast/comments/1264335.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=1264335</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=1264335</wfw:comment><description>&lt;P&gt;I'm sure that many of you have had the unfortunate experience of watching the windows Blue Screen Of Death (BSOD) while working, and possibly have lost important data. A common reaction in this case is to blame Microsoft and continue working after the following reboot, as if nothing had happened. Another unfortunate experience is to see an application crash, while using it. In this case, there is a window that comes up, asking you, if you want to send the data to Microsoft for analysis (the same window also comes up after the BSOD). Many people might be afraid of the contents of the data that is sent to the network, so they select "No". The goal of this post is to help you understand what is going on in the background in each of the two cases and also to help clarify some misconceptions.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;QUESTION 1: What causes all these reboots?&lt;/B&gt; &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;First of all, because of the architecture of the windows kernel in the NT/2000/XP/Vista series, an application cannot corrupt data that belongs to another application or to the kernel. This means that each application is totally isolated and cannot harm the system. The worst thing that can happen is that the application does something invalid and crashes without any further implications for the rest of the system. On the other hand, the windows kernel and the device drivers have unlimited access to the system. If the kernel or a driver misbehaves, then it can corrupt the whole system. The immediate result of this, is that the reason for all the blue screens lies either in the windows kernel or in the windows device drivers. That's why, whenever an application crashes, the system keeps working without a problem, whereas if there is a bug in the kernel or in a device driver, the whole system goes down.&lt;/P&gt;
&lt;P&gt;Now that we've identified the possible causes of the crashes, it's time to go even further. According to the reports that were sent to Microsoft until April 2004 (from all those people, who pressed "Yes", when they were asked to send the data to Microsoft) the reasons for the crashes can be split as follows:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Third-party device drivers: 70%&lt;/LI&gt;
&lt;LI&gt;Unknown, because of severe memory corruption: 15%&lt;/LI&gt;
&lt;LI&gt;Hardware error: 10%&lt;/LI&gt;
&lt;LI&gt;Microsoft code: 5%&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This shows that Microsoft is not the one to blame. The main cause for these crashes is poorly written third-party (non-Microsoft) device drivers.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;QUESTION 2: Why does the system crash, when there is a kernel-mode error?&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;So, from the above analysis it is obvious that the system can overcome an application crash, however a kernel-mode error causes it to reboot. Why can't the system continue, after finding a kernel-mode error? Actually, what happens is that while kernel-mode code (either a device driver or the windows kernel) is executing, some discrepancy is found. For example, a pointer might be pointing to an invalid address, a data structure might have invalid values, etc. Even though this problem was found, it's possible that the "bad" code that caused this problem might have corrupted more data. For example, it might be possible that basic kernel structures are corrupted. That's why the function KeBugCheckEx is called (inside the kernel, this type of forced crash is called "bugcheck"), in order to write logging information to the page file, paint the blue screen and show some information about the crash in the screen.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;QUESTION 3: How do we configure, whether we want to send anything to Microsoft?&lt;/B&gt; &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Even though, it's not well-known to most people, you can configure what will be sent to Microsoft. Somebody might want to report only the crashes that have to do with the operating system (after the BSOD). Somebody else might want to report only the crashes from the applications (either for all of them or only for some particular applications). In order to configure this, you need to go to &lt;/P&gt;
&lt;P&gt;Control Panel | System | Advanced | Error Reporting&lt;/P&gt;
&lt;P&gt;From there you'll be able to select which types of errors you want to report. Actually, even if you select a particular type of error to be reported, Windows will ask you again, after a program that belongs in that category crashes. So, by selecting a category, it doesn't mean that all crashes will be reported automatically.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;QUESTION 4: Exactly what kind of data is sent to Microsoft?&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Before answering this question, it is useful to understand what information is stored, when the system or an application crashes. Let's talk first about the files that are generated after a system crash. In order to set this, you need to go to&lt;/P&gt;
&lt;P&gt;Control Panel | System | Advanced | Startup and Recovery -&amp;gt; Settings&lt;/P&gt;
&lt;P&gt;In the "System Failure" part you'll be able to configure, if you want to write the crash to the system log, if you want to send an administrative alert and if you want to reboot after the crash. Also, you have the option of creating a memory dump and you can select the directory, in which you want to save it. There are 3 types of memory dumps:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Small memory dump or minidump (64kb for 32-bit systems, 128kb for 64-bit systems): It includes a minimum amount of information about the system before the crash, e.g. the bugcheck code, the loaded drivers, information for the current process and thread, etc.&lt;/LI&gt;
&lt;LI&gt;Kernel memory dump: This includes all the kernel-mode memory that was in physical memory at the time of the crash. There is no default size for this dump, however it should be around 50-100MB for most "normal" systems (with &amp;lt;= 2GB of RAM).&lt;/LI&gt;
&lt;LI&gt;Full memory dump: This includes all the physical memory. The size of the file will be the same as the physical memory of the system.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Here it's worth mentioning that at the time of the crash, the information is written to the pagefile. Therefore, the pagefile must be configured to be larger than the size of the dump. This might be a problem especially in the case of the Full memory dump. In order to set the size of the pagefile, you need to go to &lt;/P&gt;
&lt;P&gt;Control Panel | System | Advanced | Performance Settings -&amp;gt; Advanced | Virtual Memory -&amp;gt; Change&lt;/P&gt;
&lt;P&gt;After the system reboots, the information is copied from the page file to the file that was specified above. The reason that the information is not written directly to that file is that the kernel doesn't know the root of the problem at the time of the crash, so it's trying to use as fewer drivers as possible (the pagefile is already open and in use, so theoritically it's the safest destination).&lt;/P&gt;
&lt;P&gt;On the other hand, in order to configure the data that is stored, when an application crashes, you need to open a command prompt (or go to Start | Run) and execute drwtsn32.exe. This application is called Dr. Watson and there you'll be able to configure the destination file for the dump, as well as the type of the dump. Here the only options are the minidump and the full memory dump. There is also an option to create an old-style NT-compatible full memory dump. In addition, in the textarea "Application Errors" you can look at the application crashes that had been logged in the system. You can select any of them and click "View", if you are interested in looking at exactly what the log file includes.&lt;/P&gt;
&lt;P&gt;So, now it's time to answer the initial question: What exactly is sent to Microsoft? The answer is that regardless of the crash dump file that you have selected, the only thing that is sent to Microsoft is a minidump (both for kernel-mode and user-mode crashes). Of course, it would be impossible to send a 100MB kernel-mode dump or a 1GB full-memory dump, so that's why only the 64kb minidump is sent. Apart from the minidump, the information also includes an XML file with basic information about the version of the operating system and the loaded drivers, which you can look at, when you are prompted to select, if you want to send the data to Microsoft. There is no personal private information or anything like that. In fact, you can open the minidumps and check the included information. I'll also show a way of analyzing the minidumps and looking at the data that Microsoft has access to.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;QUESTION 5: What does Microsoft do with this information?&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;When the minidump is received by Microsoft, it goes through some preprocessing and is stored in a server. If many minidumps that seem to have the same problem are received, then there is a team that analyzes them and finds the root of the problem. Afterwards, a webpage is created that shows exactly what the cause of the problem is. Most often it points to the driver causing the problem and gives a link to the manufacturer's webpage, so that a new version can be downloaded (if it exists). After the webpage is created, if somebody submits a dump that has the same problem, he is shown the corresponding webpage that will help him find the solution. Therefore, if somebody clicks "Yes", when asked to submit a crash dump he might either find the solution to the problem or help Microsoft find the solution and present it to the users in the future.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;QUESTION 6: How can we analyze a crash dump?&lt;BR&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Fortunately, there is a tool that can be used to analyze both the user-mode and the kernel-mode crash dumps: windbg. Microsoft has included the dump analysis algorithms in windbg, so in some basic cases it's easy to find the cause of the problem. Of course, there are many causes, in which there are many corrupted data structures and it's impossible to pinpoint the problem automatically. In that case, more advanced manual methods are used by the Online Crash Analysis (OCA) team in Microsoft.&lt;/P&gt;
&lt;P&gt;In order to perform the analysis by yourselves (either because you are unable to submit the data or because there is no answer in Microsoft's website), you need to open windbg, go to "File" | "Open Crash Dump" and select the dump file that you want to analyze. As I wrote in my previous &lt;A href="http://blogs.msdn.com/iliast/archive/2006/12/10/windbg-tutorials.aspx" mce_href="http://blogs.msdn.com/iliast/archive/2006/12/10/windbg-tutorials.aspx"&gt;post&lt;/A&gt; you need to set the path to the symbol files and reload them. If this step is omitted, then it won't be possible to analyze the file.&lt;/P&gt;
&lt;P&gt;The next step is to execute the command (this might take some time):&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;!analyze -v&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;At the top of the output you'll see the bugcheck code, it's description and some additional information (e.g. the address of the invalid memory that was accessed, whether it was a Read or a Write operation, etc). Further down you'll see the call stack of the dump under the title STACK_TEXT. This includes all the functions that were called, when the crash occurred. The function on the top is the most current one (it was called by the function below it, which was called by the function below it, etc), whereas the function at the bottom is the oldest function in the stack. The reason that the system crashed is because one of these functions did something invalid (e.g. passed or received an invalid argument that forced it to perform an invalid operation). Of course it's possible that the data was corrupted by another function that is not in the call stack. Fortunately, windbg has already done an automated analysis and points to the module that most probably caused the crash. You should look at the following fields:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;SYMBOL_NAME: Exactly where the invalid operation was caused (module + function)&lt;BR&gt;&lt;/LI&gt;
&lt;LI&gt;MODULE_NAME: The name of the module that caused the crash &lt;BR&gt;&lt;/LI&gt;
&lt;LI&gt;IMAGE_NAME: The file, in which the problematic code resides&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;In order to find more information about the problematic code you can execute:&lt;/P&gt;
&lt;P&gt;&lt;B&gt;lm kv m MODULE_NAME*&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;for example, if MODULE_NAME is problematic_driver, you should execute:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;B&gt;lm kv m problematic_driver*&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;lm stands for "list modules", k stands for "kernel modules", v stands for verbose and m stands for "match".&lt;/P&gt;
&lt;P&gt;Another option is to find the problematic file name, from the IMAGE_NAME tag, search it in the hard drive and either look at its properties, in order to identify its manufacturer or search it in the internet. Afterwards, you might need to update the buggy driver.&lt;/P&gt;
&lt;P&gt;Of course, it's possible that windbg's automatic analysis was not able to pinpoint the faulting driver. The reason for that might be that the call stack was corrupted or that some important code or data structure was overwritten or that there was a memory leak, etc. In that case, you might want to proceed into some manual solutions, in order to detect the problem. From this point there is no automated way to proceed, so I can just provide a few useful commands that might help you find more information about your system.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;First you can execute&lt;/P&gt;
&lt;P&gt;&lt;B&gt;!process 0 0&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;or&lt;/P&gt;
&lt;P&gt;&lt;B&gt;!process&lt;/B&gt; &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;The first command prints information about all the running processes. this way you might be able to find a suspicious process. The second command shows information about the current process. If you execute&lt;/P&gt;
&lt;P&gt;&lt;B&gt;!process &amp;lt;process_address&amp;gt;&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;then you'll see more information about the particular process. You can find the addresses of the processes from the "!process 0 0" command. The process information includes information about its threads. You can find more information about each thread by executing&lt;/P&gt;
&lt;P&gt;&lt;B&gt;!thread &amp;lt;thread_address&amp;gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;and if the thread belongs to a driver with pending IRPs, then you can find more information about them by executing&lt;/P&gt;
&lt;P&gt;&lt;B&gt;!irp &amp;lt;irp_address&amp;gt;&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Also, as&amp;nbsp; I wrote above, in order to see all the loaded modules you can try&lt;/P&gt;
&lt;P&gt;&lt;B&gt;lm kv&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;In order to find more information about the used memory (and possibly detect memory leaks), you can execute:&lt;/P&gt;
&lt;P&gt;&lt;B&gt;!vm &lt;/B&gt;and &lt;B&gt;!memusage&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Finally, it's possible that the system hangs and does not crash. In order to debug it, you need to force a crash. The only way to do that is to go to the registry key HKLM\System\CurrentControlSet\Services\i8042prt\Parameters\CrashOnCtrlScroll and set it to 1. This works only for PS2 keyboards (not for USB). When the system hangs, you can keep the right control key pressed and press the scroll lock key twice. This will cause a crash, which you will be able to debug using windbg.&lt;/P&gt;
&lt;P&gt;A useful command in that case is:&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;!locks&lt;/B&gt; (prints the locks, which are currently held, provided that there is at least one additional thread waiting on them).&amp;nbsp; &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Another tool that can help you, if !analyze cannot find the root case is the Driver Verifier. This tool enables additional system checks, that will make it possible for the system to crash immediately, when a driver does something invalid, without allowing it to corrupt more data. This way, the crash dump will point directly to the driver. In order to execute it, you need to open a command prompt with administrative privileges (or from Start | Run) and execute "verifier.exe".&lt;/P&gt;
&lt;P&gt;There are some small differences between the User Interface in Windows 2000, Windows XP and Vista, so I'll explain the Windows XP interface. What you'll see is a window and some tasks that you're called to select. You need to select the task "Create custom settings (for code developers)", and then "Select individual settings from a full list". After that you'll see a screen with the following options:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Special pool: This option forces the memory allocation routines to operate on a special pool. For example, if a driver wants to allocate 100kb, then he is given a pointer that points to 100kb before the end of a free page. The rest of the page is marked with a specific signature. Also, the pages that are before and after this particular page are marked invalid. So, if a driver tries to write something after the end of the allocated space, there will be a page fault and the Driver Verifier will crash the system immediately. If the driver tries to write before the beginning of the allocated space, then after he frees the memory, the Driver Verifier will check the signature of the page, find that it's invalid and crash the system. The crash dump that will be generated from this crash will point directly to the faulting driver.&lt;/LI&gt;
&lt;LI&gt;Pool tracking: Each space allocation is marked with a special tag that is different for each driver. When the driver is unloaded, the Driver Verifier will check for the corresponding tags and if it finds any, then this means that the driver has a memory leak, so the system will crash.&lt;/LI&gt;
&lt;LI&gt;Force IRQL checking: Whenever a driver goes to IRQL at DPC/dispatch level or above, the Driver Verifier will cause all the pageable memory to be paged out to disk. So, if the driver tries to access this memory, then the system will crash with a bugcheck code equal to IRQL_NOT_LESS_OR_EQUAL&lt;/LI&gt;
&lt;LI&gt;I/O verification: All the IRPs are allocated from a special pool. If any of them is completed with an invalid I/O status, then the system crashes.&lt;/LI&gt;
&lt;LI&gt;Enhanced I/O verification (used to be "I/O Verification level 2" in Windows 2000): This includes even deeper tests for the IRPs. The I/O manager checks if the drivers complete asynchronous IRPs complete correctly, if they manage the device stack locations correctly and if they delete the device objects only once.&lt;/LI&gt;
&lt;LI&gt;DMA checking: The I/O manager makes sure that all the drivers configure the DMA operations correctly, otherwise it crashes the system.&lt;/LI&gt;
&lt;LI&gt;Deadlock detection: This option enables deadlock detection. When a deadlock is detected, the system crashes and you can use the &lt;B&gt;!deadlock&lt;/B&gt; command from windbg to find more information about what is causing it.&lt;BR&gt;&lt;/LI&gt;
&lt;LI&gt;Low Resources simulation: 7 minutes after the boot completes (so all the drivers have been loaded), the I/O manager starts failing random memory allocations. This way, if a driver doesn't check the status of a memory allocation, the system will crash.&lt;/LI&gt;
&lt;LI&gt;Disk Integrity Verification (only in Windows Server 2003): Windows keeps checksums of written data, so after each read it checks, if the data is still valid. If there is a discrepancy, the system crashes.&lt;/LI&gt;
&lt;LI&gt;SCSI Verification (included automatically, when a SCSI miniport driver is monitored): It includes some additional SCSI-related checks.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;You should select all of the existing options, apart from the "Low Resources Simulation" (because it includes very heavy operations and the system will be really slow). In the next screen, you need to select the drivers that you want to debug. You should start by selecting drivers that you think that are suspicious (either because windbg pointed to them or because the crashes started after you installed them, etc). Reboot and run the system for some time and observe its behaviour. If the system continues crashing, but not because of the drivers that you specified (i.e. the crash dump files are still vague and don't pinpoint to a specific driver), the next step is to select all the unsigned drivers. If you don't see any result, then the next step is to start enabling driver verifier for bigger groups of drivers, until you find the buggy one.&lt;/P&gt;
&lt;P&gt;Another useful tool for debugging memory leaks is poolmon, which is part of the Windows Support Tools and can be found &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=49AE8576-9BB9-4126-9761-BA8011FABF38&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=49AE8576-9BB9-4126-9761-BA8011FABF38&amp;amp;displaylang=en"&gt;here&lt;/A&gt; (for Windows XP). This tool displays information about memory allocations (both from paged pool and from non-paged pool), as well as discrepancies between allocations and deallocations. You just execute the tool from a command prompt (there is no User Interface) and select the types of memory pool that you want to look at. If the amount of allocated memory increases constantly, this means that there is a possible memory leak. You can find an overview &lt;A href="http://technet2.microsoft.com/WindowsServer/f/?en/library/0d302498-c947-4655-95af-719ae75acfb51033.mspx" mce_href="http://technet2.microsoft.com/WindowsServer/f/?en/library/0d302498-c947-4655-95af-719ae75acfb51033.mspx"&gt;here&lt;/A&gt; and a more detailed explanation &lt;A href="http://www.osronline.com/ddkx/ddtools/poolmon_7983.htm" mce_href="http://www.osronline.com/ddkx/ddtools/poolmon_7983.htm"&gt;here&lt;/A&gt;.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;B&gt;ADDITIONAL RESOURCES:&lt;/B&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;This &lt;A href="http://www.networkworld.com/news/2005/041105-windows-crash.html?page=1" mce_href="http://www.networkworld.com/news/2005/041105-windows-crash.html?page=1"&gt;tutorial&lt;/A&gt; provides an introductory overview of the same concepts.&lt;/LI&gt;
&lt;LI&gt;Mark Russinovich presented this &lt;A href="http://www.microsoft.com/events/EventDetails.aspx?CMTYSvcSource=MSCOMMedia&amp;amp;Params=%7eCMTYDataSvcParams%5e%7earg+Name%3d%22ID%22+Value%3d%221032298076%22%2f%5e%7earg+Name%3d%22ProviderID%22+Value%3d%22A6B43178-497C-4225-BA42-DF595171F04C%22%2f%5e%7earg+Name%3d%22lang%22+Value%3d%22en%22%2f%5e%7earg+Name%3d%22cr%22+Value%3d%22US%22%2f%5e%7esParams%5e%7e%2fsParams%5e%7e%2fCMTYDataSvcParams%5e" mce_href="http://www.microsoft.com/events/EventDetails.aspx?CMTYSvcSource=MSCOMMedia&amp;amp;Params=%7eCMTYDataSvcParams%5e%7earg+Name%3d%22ID%22+Value%3d%221032298076%22%2f%5e%7earg+Name%3d%22ProviderID%22+Value%3d%22A6B43178-497C-4225-BA42-DF595171F04C%22%2f%5e%7earg+Name%3d%22lang%22+Value%3d%22en%22%2f%5e%7earg+Name%3d%22cr%22+Value%3d%22US%22%2f%5e%7esParams%5e%7e%2fsParams%5e%7e%2fCMTYDataSvcParams%5e"&gt;video&lt;/A&gt; in TechEd 2006. The corresponding slides are &lt;A href="http://download.microsoft.com/download/0/1/3/01381C25-72DA-4AA9-B792-43E02A243C71/SVR422R_Russinovich.ppt" mce_href="http://download.microsoft.com/download/0/1/3/01381C25-72DA-4AA9-B792-43E02A243C71/SVR422R_Russinovich.ppt"&gt;here&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;OSR has a more advanced &lt;A href="http://www.osronline.com/article.cfm?article=328" mce_href="http://www.osronline.com/article.cfm?article=328"&gt;article&lt;/A&gt; on the next steps that you can follow, in order to analyze more difficult crash dumps.&lt;BR&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1264335" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Debugging/default.aspx">Debugging</category><category domain="http://blogs.msdn.com/iliast/archive/tags/windbg/default.aspx">windbg</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Windows Vista Has Shipped!</title><link>http://blogs.msdn.com/iliast/archive/2006/11/08/windows-vista-has-shipped.aspx</link><pubDate>Thu, 09 Nov 2006 06:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1042591</guid><dc:creator>iliast</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/iliast/comments/1042591.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=1042591</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=1042591</wfw:comment><description>&lt;P&gt;Finally, it is true! Windows Vista is ready and has been shipped to the manufacturer! So, this means that everything is locked, the CDs will shortly be printed and put into boxes together with the corresponding manuals. Finally, in 30th January everybody will be able to buy them from the stores either as standalone product or preinstalled in computers. &lt;/P&gt;
&lt;P&gt;So, how is Vista? From my point of view, I think that it's much more secure than Windows XP and has some very interesting new features. I definately agree with &lt;A href="http://blogs.msdn.com/michael_howard/archive/2006/11/08/windows-vista-we-re-done.aspx" mce_href="http://blogs.msdn.com/michael_howard/archive/2006/11/08/windows-vista-we-re-done.aspx"&gt;Michael Howard&lt;/A&gt; that after all this multi-year effort, it'll be interesting to see how the attacks against the operating system evolve. I'm sure that it'll be tough to break it :) Definately, the bar has been raised. Also, from the end-user's perspective there is a new User Interface, which might take some time to get used to, but is proves to be user-friendly. Also, there are many technologies that allow faster booting, faster application loading, easier application development, greater stability etc. From the system developer's perspective, there are many changes, because of WDF, UMDF and KMDF. Hopefully these frameworks will make it much easier for driver developers to develop, debug and maintain drivers, and so the overall system will be more stable.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;So, here it is! Enjoy :)&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1042591" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Windows Device Drivers Book Reviews</title><link>http://blogs.msdn.com/iliast/archive/2006/10/25/Windows-Device-Drivers-Book-Reviews.aspx</link><pubDate>Thu, 26 Oct 2006 03:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:875118</guid><dc:creator>iliast</dc:creator><slash:comments>16</slash:comments><comments>http://blogs.msdn.com/iliast/comments/875118.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=875118</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=875118</wfw:comment><description>&lt;p&gt;A quick search in the web reveals that the number of the books that are related to windows device drivers can be counted with the fingers of one hand. Even worse, most of the books are either too old (published before or around windows 2000) and/or not easily readable. Another problem is that the Windows Driver Model (WDM) is becoming more complex as time passes, so the newer books are relatively more complex to read than the older ones.&lt;/p&gt;
&lt;p&gt;Based on all of this and after looking at different book reviews, I decided to read a few books that make it easier for a beginner to get an insight on driver development.&lt;/p&gt;
&lt;p&gt;So, I think that the best book to start with regarding driver development is &lt;a href="http://www.amazon.com/Windows-Device-Development-Classic-Reprints/dp/0976717522/sr=8-2/qid=1161822833/ref=sr_1_2/102-9497207-8447336?ie=UTF8&amp;amp;s=books" mce_href="http://www.amazon.com/Windows-Device-Development-Classic-Reprints/dp/0976717522/sr=8-2/qid=1161822833/ref=sr_1_2/102-9497207-8447336?ie=UTF8&amp;amp;s=books"&gt;Windows NT Device Driver Development (OSR Classic Reprints)&lt;/a&gt; (original version was published in 1997) by Peter G. Viscarola and W. Anthony Mason. This book is divided into 3 parts. The first part (chapters 1-8) talk about Windows internals fundamental concepts, like HAL, scheduling, virtual memory, registry, etc. The second part (chapters 9-20) is the bulk of the book and talks about the development of device drivers. Actually, this can be further subdivided into chapters 8-10, which talk about the I/O manager, 11-17, which is the core part of the book (DriverEntry, Dispatch routines, Interrupt Service Routines, Deffered Procedure Calls, Programmed I/O and DMA), and chapters 18-20, which talk about building and debugging a driver. Finally, chapters 21-24 talk about alternate NT driver architectures, like File system drivers, SCSI drivers, Video miniport drivers and NDIS (network) miniport drivers. I think that there are both advantages and disadvantages in this book. I'll start with the advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It's very easy to read. It starts with very fundamental stuff, builds on top of them and explains the concepts in an easy-to-understand way. This is really to hard to find in the rest of the books. Possibly the fact that both writers teach driver development courses make it easier for them to understand what questions and problems a beginner driver developer might have, so they try to answer them in front.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;It focuses on explaining the concepts and doesn't present pages and pages of un-understandable code. It just presents the functions, explains how they work and shows a cumulative example that shows the use of a few functions bundled together.&lt;/li&gt;
&lt;li&gt;It's a short book (the first 20 chapters take less than 550 pages) and has small chapters. I think that this fine grain analysis helps the reader. I like the fact that I can read a few small chapters within a day and then pickup the book the next day (or a few days later) without breaking my reading in the middle of the chapter and trying to remember what the first part of the chapter was saying.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Of course, the book has also some disadvantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It doesn't cover plug-n-play, power management and other WDM concepts. This is normal, since the book covers NT drivers and not WDM drivers.I haven't found many outdated parts of the book (i.e. almost everything that is written in the book applies even for WDM drivers in Windows XP), apart from the fact that the DriverEntry chapter (chapter 13) talks a lot about manually finding the resources (memory+I/O) that the driver should be using, whereas for WDM drivers this is done automatically. It also doesn't cover Physical Device Objects (PDOs), Function Device Objects (FDOs) and Filter Device Objects (FiDOs), since they didn't exist at that time.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;The examples are small and after understanding the concepts, it's nice to be able to look at some code that will explain them.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;So, in order to solve the disadvantages of the first book, I think that the solution is to read &lt;a href="http://www.amazon.com/Windows-2000-Device-Driver-Book/dp/0130204315/sr=8-2/qid=1161822060/ref=pd_bbs_sr_2/102-9497207-8447336?ie=UTF8&amp;amp;s=books" mce_href="http://www.amazon.com/Windows-2000-Device-Driver-Book/dp/0130204315/sr=8-2/qid=1161822060/ref=pd_bbs_sr_2/102-9497207-8447336?ie=UTF8&amp;amp;s=books"&gt;The Windows 2000 Device Driver Book: A Guide for Programmers (2nd Edition)&lt;/a&gt; (published in 2000) by Art Baker and Jerry Lozano. The strengths of this book are exactly those above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The book covers Windows 2000 drivers, so it covers Power Management, Plug-n-Play, Windows Management Instrumentation (WMI) and many WDM concepts that were not covered by the first book.&lt;/li&gt;
&lt;li&gt;The book is full of examples. The writer also provides the source code in the accompanying cd-rom, so it's easy to build them and learn from the source.&lt;/li&gt;
&lt;li&gt;Again, the book is easy to read and short. I like a lot compact books that stick to the topic and don't provide stuff that distract the reader. This book is one of those. The whole book is around 400 pages, so it can be finished quite quickly.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;So, after finishing both these books and playing with the source code (and with the source code that can be found in the WDK or elsewhere in the net), I think that the next step is to read &lt;a href="http://www.microsoft.com/MSPress/books/6262.asp" class="" mce_href="http://www.microsoft.com/MSPress/books/6262.asp"&gt;Programming the Microsoft Windows Driver Model, Second Edition&lt;/a&gt; (published in 2002) by Walter Oney. Again, this book has both advantages and disadvantages. This time, I'll start with the disadvantages :) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This book is definately NOT for beginners. I consider it hard to understand and it considers way too many things as known.&lt;/li&gt;
&lt;li&gt;I don't like the structure of the book very well. For example, even though the author mentions that the first 7 chapters are fundamentals and the rest go deeper, he puts the I/O control operations after the plug-n-play or the power management. Of course, this is a personal view, however I was overwhelmed, when I managed to reach the 6th chapter. The first 3 chapters are very good, however I think that after that the difficulty grows exponentially, at least for a beginner.&lt;/li&gt;
&lt;li&gt;The material presented in the book is very dense, so a lot of stuff is presented within a small number of pages and then you look at a big code listing that should explain everything. As I said above, I prefer a slower approach that goes step by step and builds on top of fundamental concepts.&lt;/li&gt;
&lt;li&gt;I don't think that the book gives a a clear high-level view of what a device driver is composed of (I'll explain this below). I had the feeling that the author explains one thing, then the next and the next, but it's hard to understand how everything fits together and how all of these components are related.&lt;/li&gt;&lt;/ul&gt;On the other hand, this book has some advantages that cannot be covered by any other existing book:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;It is the newest book, so it provides the best picture about the current version of the Windows Driver Model (WDM). &lt;br&gt;&lt;/li&gt;
&lt;li&gt;It's the only book that covers Windows XP, so it's the only choice for somebody, who wants to take advantage of this platform.&lt;/li&gt;
&lt;li&gt;I think that each section is described more deeply than from the rest of the books.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Finally, I think that such a review would be incomplete, if I didn't refer to &lt;a href="http://www.amazon.com/Microsoft-Windows-Internals-4th-Server/dp/0735619174/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1207015630&amp;amp;sr=8-1" mce_href="http://www.amazon.com/Microsoft-Windows-Internals-4th-Server/dp/0735619174/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1207015630&amp;amp;sr=8-1"&gt;Microsoft Windows Internals, Fourth Edition: Microsoft Windows Server(TM) 2003, Windows XP, and Windows 2000 (Pro-Developer)&lt;/a&gt; (published in December 2004) by Mark E. Russinovich and David A. Solomon. This book doesn' t talk directly about writing device drivers, but it talks about windows internals in general. Some of them are covered in the above mentioned books, however this book is the newest of all and provides the most in-depth analysis. Also, chapter 9 is devoted specifically to the I/O manager and to windows device drivers, so it's definately worth to read. I especially like one particular section in chapter 9 that is titled "&lt;b&gt;Structure of a Driver&lt;/b&gt;" and gives a high-level overview of all the components of a driver. That's exactly an important thing that is missing from Walter Oney's book and is not clearly explained in the rest of the books. So, according to the book, a windows device driver is composed of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;An initialization routine:&lt;/b&gt; This function is named DriverEntry (for WDM drivers) and is called by the I/O manager only once, when the driver is initially loaded. It is used by the driver to initialize its internal (global) structures.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;An add-on device routine:&lt;/b&gt; This function is named AddDevice and is called by the I/O manager, whenever a new device, for which the driver is responsible, is detected. It is used by the driver to initialize the device object (i.e. the internal structure) that corresponds to the newly-found device.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;A set of dispatch routines:&lt;/b&gt; These are the functions that are called by an application (or another driver) to communicate with the device. They include functions like read, write, open, close, control, etc. When called to perform an I/O operation, the I/O manager creates an IRP (I/O Request Packet), which is a structure that descibes the request, and sends it to the driver.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;An Interrupt Service Routine (ISR):&lt;/b&gt; One of the ways that an external device can communicate with the CPU is through interrupts (the other way is polling, but let's forget about it for now). So, whenever the device wants to communicate with the CPU, it sends an interrupt to the CPU and the CPU executes some code that needs to serve the device (e.g. find if the device finished some calculation or received a packet, etc and find what to do afterwards). The code that is executed is called the Interrupt Service Routine (ISR). Therefore, the driver that controls the device needs to implement this ISR.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Deffered Procedure Call (DPC):&lt;/b&gt; Whenever an ISR is executing, the IRQL (IRQ Level) of the CPU is high, so all the interrupts that have lower IRQL than the current interrupt cannot be served. In order to solve this problem, drivers perform only very basic calculation in their ISR and for the rest of the processing they schedule a DPC. This function executes in a low IRQL (which is named DISPATCH_LEVEL), so that the rest of the interrupts can be serviced. Therefore, the DPC can be considered as just an extension to the ISR (they serve the same purpose, but they execute at different IRQL). Of course, a driver can execute DPCs not only from an ISR, but from any other function, however this is the main use of a DPC.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;A start I/O routine:&lt;/b&gt; Some drivers wants to process the incoming I/O requests serially, i.e. one at a time. Therefore, they ask the I/O manager to queue the incoming IRPs. This function is used to initiate the next data transfer to or from the device.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;One or more I/O completion routines:&lt;/b&gt; Sometimes a driver, which receives an I/O request does some processing and passes the IRP to the next driver in the stack, without finalizing the IRP processing (finalizing means that the I/O operation was completed successfully, failed or cancelled). The I/O completion routine informs the driver that another driver in the stack has marked the I/O as "finalized", so the current driver's I/O completion routine can be called, in order to perform some cleanup operations.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;A cancel I/O routine:&lt;/b&gt; This function is called, when the I/O manager wants to cancel the processing of an IRP. This function mostly releases any resources that were acquired during the processing of the IRP and it also marks the IRP as "cancelled". Not all IRPs can be cancelled, though.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;An unload routine:&lt;/b&gt; The I/O manager calls this routine, when it wants to unload the driver from memory. The drives releases any resources that it might have acquired.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;A system shutdown notification routine:&lt;/b&gt; The I/O manager calls this routine, when the system is about to shutdown.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Error-logging routines:&lt;/b&gt; Whenever an error occurs, the driver uses these routines to log the error and notify the I/O manager.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Here I would like to note that all the above books are for the Windows Driver Model. As I've mentioned many times before, Microsoft is changing the driver model for Windows Vista. However, there aren't any books for the Windows Driver Foundation (WDF - the new windows model) yet. The only public announcement for such a book is the &lt;a href="https://www.osronline.com/custom.cfm?name=index_fullframeset.cfm&amp;amp;pageURL=https://www.osronline.com/store/index.cfm" mce_href="https://www.osronline.com/custom.cfm?name=index_fullframeset.cfm&amp;amp;pageURL=https://www.osronline.com/store/index.cfm"&gt;Introduction to the Windows Driver Foundation - Kernel Mode Driver Framework&lt;/a&gt;&amp;nbsp;&lt;span class="prodname"&gt;&lt;b&gt;&lt;/b&gt;by Peter Viscarola, Tony Mason, Mark Cariddi, Brenda Ryan, Scott Noone, and OSR.&lt;/span&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=875118" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Drivers+_2800_General_2900_/default.aspx">Drivers (General)</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Books/default.aspx">Books</category></item><item><title>Hardware and Driver Developer Blogs + Driver tips</title><link>http://blogs.msdn.com/iliast/archive/2006/10/07/Driver-development-community.aspx</link><pubDate>Sun, 08 Oct 2006 05:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:803108</guid><dc:creator>iliast</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/iliast/comments/803108.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=803108</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=803108</wfw:comment><description>&lt;P&gt;Thanks, to &lt;A href="http://blogs.msdn.com/craigrow/default.aspx" mce_href="http://blogs.msdn.com/craigrow/default.aspx"&gt;craigrow&lt;/A&gt;, I saw that Microsoft has created a list for &lt;A href="http://www.microsoft.com/whdc/resources/blogs.mspx" mce_href="http://www.microsoft.com/whdc/resources/blogs.mspx"&gt;hardware and driver developer blogs&lt;/A&gt;. I'm still not there yet, but I hope that this will change :)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Another interesting link are the &lt;A href="http://www.microsoft.com/whdc/driver/tips/default.mspx" mce_href="http://www.microsoft.com/whdc/driver/tips/default.mspx"&gt;driver tips&lt;/A&gt;, which include papers about driver synchronization, memory management, driver design, debugging, etc.&lt;BR&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=803108" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Drivers+_2800_General_2900_/default.aspx">Drivers (General)</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>A Comparison of the Linux and Windows Device Driver Architectures</title><link>http://blogs.msdn.com/iliast/archive/2006/10/03/A-Comparison-of-the-Linux-and-Windows-Device-Driver-Architectures.aspx</link><pubDate>Wed, 04 Oct 2006 02:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:788057</guid><dc:creator>iliast</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/iliast/comments/788057.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=788057</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=788057</wfw:comment><description>&lt;p&gt;While searching for something irrelevant, I found a very interesting paper, called "A Comparison of the Linux and Windows Device Driver Architectures" by Melekam Tsegaye and Richard Foss. It was published at the ACM Operating Systems Review, Volume 38, Number 2, 2004. You can find a link to the paper &lt;a href="http://www.cs.ru.ac.za/research/g98t4414/static/papers/oscomposr.pdf" mce_href="http://www.cs.ru.ac.za/research/g98t4414/static/papers/oscomposr.pdf"&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;The &lt;a href="http://www.cs.ru.ac.za/research/students/g98t4414/static/papers/oscomposr.pdf" mce_href="http://www.cs.ru.ac.za/research/students/g98t4414/static/papers/oscomposr.pdf"&gt;paper&lt;/a&gt; compares the device driver architectures between linux and windows. It starts by providing an extensive analysis to both architectures and then presenting a detailed comparison. The paper covers the 2.4 linux kernel and the Windows Driver Model (WDM) from Windows XP, so it can be considered that it is quite up-to-date (at least from the Windows perspective). Also, in the same page, you'll find Melekam Tsegaye's &lt;a href="http://www.cs.ru.ac.za/research/students/g98t4414/static/masters/thesis.pdf.zip" mce_href="http://www.cs.ru.ac.za/research/students/g98t4414/static/masters/thesis.pdf.zip"&gt;MSc Thesis&lt;/a&gt;, which covers the same contents as the paper, but it also presents the design and the implementation of an IEEE-1394 driver for both windows and linux. Both drivers can be found &lt;a href="http://www.cs.ru.ac.za/research/students/g98t4414/static/masters/thesis_software.zip" mce_href="http://www.cs.ru.ac.za/research/students/g98t4414/static/masters/thesis_software.zip"&gt;here&lt;/a&gt;, while the presentation of the thesis can be found &lt;a href="http://www.cs.ru.ac.za/research/students/g98t4414/static/masters/msc_present.ppt" mce_href="http://www.cs.ru.ac.za/research/students/g98t4414/static/masters/msc_present.ppt"&gt;here&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=788057" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Linux/default.aspx">Linux</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Drivers+_2800_General_2900_/default.aspx">Drivers (General)</category><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Becoming familiar with the windows internals</title><link>http://blogs.msdn.com/iliast/archive/2006/09/28/Becoming-familiar-with-the-windows-internals.aspx</link><pubDate>Fri, 29 Sep 2006 01:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:775074</guid><dc:creator>iliast</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/iliast/comments/775074.aspx</comments><wfw:commentRss>http://blogs.msdn.com/iliast/commentrss.aspx?PostID=775074</wfw:commentRss><wfw:comment>http://blogs.msdn.com/iliast/rsscomments.aspx?PostID=775074</wfw:comment><description>When I started learning about windows drivers, my first thought was to search for "introduction to windows drivers" or something equivalent in my favorite search engine. This led to a few links for tutorials on how to create simple drivers. Right now I think that this is a very bad approach. Even, if you understand how to write a small driver, it will be difficult to proceed. I believe that the best first step is to become familiar with the windows internals. A driver developer needs to be familiar with lots of operating system-dependent stuff, e.g. the synchronization primitives, the way that the scheduling works, the I/O manager, etc.&lt;BR&gt;&lt;BR&gt;Currently, the definitive bible for windows internals is a book called &lt;A href="http://www.amazon.com/Microsoft-Windows-Internals-Fourth-Pro-Developer/dp/0735619174/ref=pd_sxp_f_pt/104-3901661-5598324?ie=UTF8" mce_href="http://www.amazon.com/Microsoft-Windows-Internals-Fourth-Pro-Developer/dp/0735619174/ref=pd_sxp_f_pt/104-3901661-5598324?ie=UTF8"&gt;"Microsoft Windows Internals, Fourth Edition: Microsoft Windows Server(TM) 2003, Windows XP, and Windows 2000"&lt;/A&gt; by Mark Russinovitz and David Solomon. This book provides the most in-depth coverage of the windows internals and is used as a base for every driver teaching course. It covers a wide area of topics, e.g. processes, I/O manager, file systems, networking, Online Crash Analysis, etc. I believe that this book is a MUST-read.&lt;BR&gt;&lt;BR&gt;Based on the book, a lot of additional material has been created that can help somebody understand the fundamental windows concepts:&lt;BR&gt;
&lt;OL&gt;
&lt;LI&gt;The authors of the book have created a series of 6 dvds with videos that present the most important part of the topics that are covered by the book. Additional information about the dvds can be found at &lt;A href="http://www.solsem.com/vid_internals.html" mce_href="http://www.solsem.com/vid_internals.html"&gt;http://www.solsem.com/vid_internals.html&lt;/A&gt;. In the same link you can find information about the seminars that are taught by David Solomon on windows internals.&lt;/LI&gt;
&lt;LI&gt;Microsoft offers the &lt;A href="http://www.microsoft.com/resources/sharedsource/Licensing/CurriculumResourceKit.mspx" mce_href="http://www.microsoft.com/resources/sharedsource/Licensing/CurriculumResourceKit.mspx"&gt;Windows Operating System Internals Curriculum Resource Kit (CRK)&lt;/A&gt;, which is a freely available collection of instructor resources to supplement operating system (OS) lectures and assignments with Windows kernel illustrations. The CRK provides PowerPoint presentation slides, experiments, lab descriptions, sample quizzes and assignments, in order to introduce case studies from the Windows kernel into operating system courses. The CRK, and all the components of the Windows Academic Program, are for academic, non-commercial use only.&lt;/LI&gt;
&lt;LI&gt;At &lt;A href="http://www.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/" mce_href="http://www.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/"&gt;http://www.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/&lt;/A&gt; you can find an extensive presentation that covers all the parts of the windows kernel.&lt;/LI&gt;
&lt;LI&gt;Microsoft also offers the &lt;A href="http://www.microsoft.com/resources/sharedsource/Licensing/researchkernel.mspx" mce_href="http://www.microsoft.com/resources/sharedsource/Licensing/researchkernel.mspx"&gt;Windows Research Kernel&lt;/A&gt; to faculty members, instructors or other people, who are teaching or conducting research in a highly accredited institute of higher education. The WRK includes most of the kernel sources from the latest released version of Windows, which supports the x64 architecture on the desktop.&lt;/LI&gt;
&lt;LI&gt;Apart from &lt;A href="http://www.solsem.com/" mce_href="http://www.solsem.com"&gt;David Solomon&lt;/A&gt;, there are also other companies, which offer seminars on windows internals, e.g. &lt;A href="http://www.osr.com/seminars_home.shtml" mce_href="http://www.osr.com/seminars_home.shtml"&gt;OSR&lt;/A&gt; and &lt;A href="http://www.azius.com/course_descrip_top.htm" mce_href="http://www.azius.com/course_descrip_top.htm"&gt;Azius&lt;/A&gt;.&lt;/LI&gt;&lt;/OL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=775074" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/iliast/archive/tags/Windows/default.aspx">Windows</category></item></channel></rss>