<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8858753366790500904</id><updated>2024-10-12T14:41:55.509-07:00</updated><category term="Google"/><category term="Technology"/><category term="AJAX"/><category term="Distributed Application"/><category term="Web Technology"/><category term="Apple"/><category term="Games"/><category term="Microsoft"/><category term="Mobile"/><category term="OS"/><category term="Play Station"/><category term="Apache"/><category term="Blog"/><category term="Car"/><category term="Cellphone"/><category term="Feed Burner"/><category term="Gmail"/><category term="IIS"/><category term="IP TV"/><category term="Internet"/><category term="Laptop"/><category term="Nissan"/><category term="Phone"/><category term="TV"/><category term="Television"/><category term="Vista"/><category term="WII"/><category term="Webserver"/><category term="Windows Vista"/><category term="X-Box"/><category term="iPhone"/><title type='text'>OnlineStuffs2U</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-9176941483942283312</id><published>2007-06-21T05:52:00.000-07:00</published><updated>2007-06-21T05:53:38.360-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Internet"/><category scheme="http://www.blogger.com/atom/ns#" term="Phone"/><title type='text'>How to Make Phone Calls Over the Internet</title><content type='html'>&lt;h2 class=&quot;Header&quot;&gt;&lt;span style=&quot;font-size:130%;&quot;&gt;Introduction&lt;/span&gt;&lt;/h2&gt;          &lt;span id=&quot;intelliTXT&quot;&gt;                 &lt;div id=&quot;Intro&quot;&gt; Using the Internet as an alternative to traditional telephone conversations can be less expensive, but slightly more complicated. Be sure to weigh the advantages and disadvantages before you invest too much time and money in Internet telephony. &lt;/div&gt;          &lt;/span&gt;                  &lt;h2 class=&quot;Header&quot;&gt;&lt;span style=&quot;font-size:130%;&quot;&gt;Instructions&lt;/span&gt;&lt;/h2&gt;                                                                                    &lt;span id=&quot;intelliTXT&quot;&gt;                                         &lt;h3 class=&quot;SubHeader&quot;&gt;Steps&lt;/h3&gt;                                                  &lt;div class=&quot;Step&quot;&gt;                                 &lt;h4&gt;                                     Step  One&lt;/h4&gt;                                 &lt;div class=&quot;StepContent&quot;&gt; Make sure you can connect to the Internet at a minimum speed of 28.8 Kbps. Higher connection speeds will allow clearer conversations. &lt;/div&gt;                             &lt;/div&gt;                                                      &lt;div class=&quot;Step&quot;&gt;                                 &lt;div class=&quot;StepNumber&quot;&gt;&lt;br /&gt;                                    &lt;/div&gt;                                 &lt;h4&gt;                                     Step  Two&lt;/h4&gt;                                 &lt;div class=&quot;StepContent&quot;&gt; Make sure your computer is equipped with a sound card of at least 16 bits. The sound card should also allow recording. &lt;/div&gt;                             &lt;/div&gt;                                                      &lt;div class=&quot;Step&quot;&gt;                                 &lt;div class=&quot;StepNumber&quot;&gt;&lt;br /&gt;                                    &lt;/div&gt;                                 &lt;h4&gt;                                     Step  Three&lt;/h4&gt;                                 &lt;div class=&quot;StepContent&quot;&gt;                                                                          Purchase compatible speakers and a microphone if you don&#39;t already have these components.                                 &lt;/div&gt;                             &lt;/div&gt;                                                      &lt;div class=&quot;Step&quot;&gt;                                 &lt;div class=&quot;StepNumber&quot;&gt;&lt;br /&gt;                                    &lt;/div&gt;                                 &lt;h4&gt;                                     Step  Four&lt;/h4&gt;                                 &lt;div class=&quot;StepContent&quot;&gt; Buy or download Internet telephony software and install it on your computer. The software you choose must be the same as or compatible with the software of the people you wish to call. &lt;/div&gt;                             &lt;/div&gt;                                                      &lt;div class=&quot;Step&quot;&gt;                                 &lt;div class=&quot;StepNumber&quot;&gt;&lt;br /&gt;                                    &lt;/div&gt;                                 &lt;h4&gt;                                     Step  Five&lt;/h4&gt;                                 &lt;div class=&quot;StepContent&quot;&gt; Make arrangements with the person you wish to call establishing that you will be online at a specific time. &lt;/div&gt;                             &lt;/div&gt;                                                      &lt;div class=&quot;Step&quot;&gt;                                 &lt;div class=&quot;StepNumber&quot;&gt;&lt;br /&gt;                                    &lt;/div&gt;                                 &lt;h4&gt;                                     Step  Six&lt;/h4&gt;                                 &lt;div class=&quot;StepContent&quot;&gt; Follow the instructions of your specific telephony software for making a call. This usually involves accessing a server and selecting a name from a list of users who are currently online. &lt;/div&gt;                             &lt;/div&gt;                                           &lt;/span&gt;                   &lt;span id=&quot;intelliTXT&quot;&gt;                                         &lt;div class=&quot;clr&quot;&gt;                     &lt;/div&gt;                     &lt;h3 class=&quot;SubHeader&quot;&gt;Tips &amp;amp; Warnings&lt;/h3&gt;                     &lt;ul class=&quot;TipsAndWarnings&quot;&gt;&lt;li class=&quot;lstTip&quot;&gt; In general, online telephone calls can only be made between two people who have computers, Internet access and compatible software, although some applications (such as Dialpad) allow you to call regular telephones.&lt;/li&gt;&lt;li class=&quot;lstTip&quot;&gt;                                     For optimal clarity, use a full-duplex sound card.&lt;/li&gt;&lt;li class=&quot;lstTip&quot;&gt;                                     Instant-messaging software will give you instant messages, but without the voice effects.&lt;/li&gt;&lt;/ul&gt;                                   &lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/9176941483942283312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/9176941483942283312' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/9176941483942283312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/9176941483942283312'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/06/how-to-make-phone-calls-over-internet.html' title='How to Make Phone Calls Over the Internet'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-5814024202901464896</id><published>2007-06-11T09:24:00.000-07:00</published><updated>2007-06-11T10:27:28.131-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Evolution of Microsoft&#39;s Surface</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;2001&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;In 2001 Stevie Bathiche of Microsoft Hardware and Andy Wilson of Microsoft Research began Brainstorming concepts for an interactive table. Their vision was to mix the physical and virtual worlds to provide a rich, interactive experience.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;;font-family:&amp;quot;;font-size:12;&quot;  &gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; spt=&quot;75&quot; preferrelative=&quot;t&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt;  &lt;v:stroke joinstyle=&quot;miter&quot;&gt;  &lt;v:formulas&gt;   &lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;&gt;   &lt;v:f eqn=&quot;sum @0 1 0&quot;&gt;   &lt;v:f eqn=&quot;sum 0 0 @1&quot;&gt;   &lt;v:f eqn=&quot;prod @2 1 2&quot;&gt;   &lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;&gt;   &lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;&gt;   &lt;v:f eqn=&quot;sum @0 0 1&quot;&gt;   &lt;v:f eqn=&quot;prod @6 1 2&quot;&gt;   &lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;&gt;   &lt;v:f eqn=&quot;sum @8 21600 0&quot;&gt;   &lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;&gt;   &lt;v:f eqn=&quot;sum @10 21600 0&quot;&gt;  &lt;/v:formulas&gt;  &lt;v:path extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; connecttype=&quot;rect&quot;&gt;  &lt;o:lock ext=&quot;edit&quot; aspectratio=&quot;t&quot;&gt; &lt;/v:shapetype&gt;&lt;v:shape id=&quot;_x0000_i1025&quot; type=&quot;#_x0000_t75&quot; style=&quot;&#39;width:238.5pt;&quot;&gt;  &lt;v:imagedata src=&quot;file:///C:\DOCUME~1\WEBMAS~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png&quot; title=&quot;&quot;&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs-wGCZH_pfGK3Va61ZDbOTbyePFkh6gC8PlZrwyxOjnmSrbRVnRouVeOI_EjGh1aM6-vbRd3D2roLKQ-oxMaHpR1CSZ58XUtNNlOZJRAtfNSv6SKMDdA5uh9qh-4P_6nz05tMPMN_2Vk/s1600-h/p1.JPG&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs-wGCZH_pfGK3Va61ZDbOTbyePFkh6gC8PlZrwyxOjnmSrbRVnRouVeOI_EjGh1aM6-vbRd3D2roLKQ-oxMaHpR1CSZ58XUtNNlOZJRAtfNSv6SKMDdA5uh9qh-4P_6nz05tMPMN_2Vk/s320/p1.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5074858521651775490&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;2003&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In early 2003, the team presented the idea to Bill Gates, Microsoft Chairman, and within the month the first prototype was born, based on an IKEA table with a hole cut through its top and a sheet of architect vellum as a diffuser. The evolution of Microsoft Surface had begun. As more applications were built, the Hardware team saw the value of the surface computer beyond simply gaming and began to favor those applications that took advantage of the unique ability of Surface to recognize physical objects placed on the table.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCSsVXgmW34kfjnBJlSEFR9HZeQdh8Je-A6lKqqDK4UQ6Cuw-MBvykbIbBM_kGRy5vZE1JWPGeGPH-HjALzXd3-UO_b1GnrgPt8zIYAuEnyHbUFm9oja1my5O6orFOHjuIaRK8lGdzEA4/s1600-h/p2.JPG&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCSsVXgmW34kfjnBJlSEFR9HZeQdh8Je-A6lKqqDK4UQ6Cuw-MBvykbIbBM_kGRy5vZE1JWPGeGPH-HjALzXd3-UO_b1GnrgPt8zIYAuEnyHbUFm9oja1my5O6orFOHjuIaRK8lGdzEA4/s320/p2.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5074858671975630866&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;2004&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In 2004, the team grew and became the Surface Computing group. Surface prototypes, functionality and applications were continuously refined. The team build more than 85 early prototypes for use by software developers, hardware developers and user researchers.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZpvTZL8wLXEAON3av7fA5iT-RCcw-IHsrh8-fxuLZdH6NIwIVRRg-g_Ng1uZuqvZdAFQPgtsi0zpqAonV1r81cHuj9Za6bnnzlTOltoz9aiyqWzP234CdQO1Drh5gm0zHdmg6KF2VOVo/s1600-h/p3.JPG&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZpvTZL8wLXEAON3av7fA5iT-RCcw-IHsrh8-fxuLZdH6NIwIVRRg-g_Ng1uZuqvZdAFQPgtsi0zpqAonV1r81cHuj9Za6bnnzlTOltoz9aiyqWzP234CdQO1Drh5gm0zHdmg6KF2VOVo/s320/p3.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5074858818004518946&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;2005&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By late 2004, The Microsoft Surface software development platform was established and attention turned to its form.A number of different experimental prototype were built including the &quot;tub&quot; model that was encased in a round plastic shell, a desk-height model with a square top and cloth-covered sides and even a bar-height model. After extensive testing and user research, the current look and feel of Surface was finalized in 2005.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsHK87TEuR3ilCT86CN1x58Hf9m0G3wDDbR24YM3Yh_mjrewLVT4SlAL1HMronbNVRFL_BXZleqpWEvDvAJWGP-EhPxnzKRj67ZtIUicGH4HDMjGvaWbIMXLpsg95IsBB46bydkDvmBps/s1600-h/p4.JPG&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsHK87TEuR3ilCT86CN1x58Hf9m0G3wDDbR24YM3Yh_mjrewLVT4SlAL1HMronbNVRFL_BXZleqpWEvDvAJWGP-EhPxnzKRj67ZtIUicGH4HDMjGvaWbIMXLpsg95IsBB46bydkDvmBps/s320/p4.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5074858921083734066&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;2007&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Today Microsoft Surface is a 30 - inch diagonal display table that&#39;s easy for individuals or small groups to use collaboratively. With a sleek, translucent surface, people engage with Surface using natural hand gestures, touch and physical objects placed on the Surface.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpkzBXuPk2lWedvB1aKOYleJUyn0xpo2kVcVLH0KwhAP9lqKFNcy-JjKlRkAZFJDQG92Kc6_iPc6kZUlCParJ0CSv1OCtX224-CsyIvJT-3KGfHY_cI4Be9CKCeTZqvn8dd3r-vc1J-xc/s1600-h/p5.JPG&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpkzBXuPk2lWedvB1aKOYleJUyn0xpo2kVcVLH0KwhAP9lqKFNcy-JjKlRkAZFJDQG92Kc6_iPc6kZUlCParJ0CSv1OCtX224-CsyIvJT-3KGfHY_cI4Be9CKCeTZqvn8dd3r-vc1J-xc/s320/p5.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5074859024162949186&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;The Future&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A form factor continuous to evolve, surface computing will be in any number of environments - schools, business, homes and any number of form factors - part of the counter top, the wall or the refrigerator.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuiJz1Q-e874ycjmPvdpJ2c4pgvvOAk2YQT9dTG2cVVVnxBCpeVQLcZuMjHhpkXOf4W-pMsQX_0EitUK_J2qHqLrSsBDjli2dg_Z35xac2mfkGSUAL_j3URGNSWXnrWje0hyFhj9ZrYQk/s1600-h/p6.JPG&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuiJz1Q-e874ycjmPvdpJ2c4pgvvOAk2YQT9dTG2cVVVnxBCpeVQLcZuMjHhpkXOf4W-pMsQX_0EitUK_J2qHqLrSsBDjli2dg_Z35xac2mfkGSUAL_j3URGNSWXnrWje0hyFhj9ZrYQk/s320/p6.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5074859114357262418&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/5814024202901464896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/5814024202901464896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/5814024202901464896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/5814024202901464896'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/06/evolution-of-microsofts-surface.html' title='Evolution of Microsoft&#39;s Surface'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs-wGCZH_pfGK3Va61ZDbOTbyePFkh6gC8PlZrwyxOjnmSrbRVnRouVeOI_EjGh1aM6-vbRd3D2roLKQ-oxMaHpR1CSZ58XUtNNlOZJRAtfNSv6SKMDdA5uh9qh-4P_6nz05tMPMN_2Vk/s72-c/p1.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-6955000165473302808</id><published>2007-06-06T23:15:00.000-07:00</published><updated>2007-06-06T23:17:18.825-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="IIS"/><category scheme="http://www.blogger.com/atom/ns#" term="Webserver"/><title type='text'>Google Bashes IIS on Web Security</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot; class=&quot;entry_content&quot;&gt;    &lt;p&gt;After looking at 70,000 domains distributing malware or hosting attack code, Google took a jab at Microsoft IIS Web server software yesterday, saying it’s  twice as likely to host malicious code.&lt;/p&gt; &lt;p&gt;Google actually &lt;a href=&quot;http://www.pcadvisor.co.uk/news/index.cfm?newsid=9609&quot;&gt;found the same number of problems&lt;/a&gt; on Apache and IIS Web sites, but with so many more sites on Apache servers (66 percent versus Microsoft’s 23 percent), IIS servers host a much larger percentage, &lt;strong&gt;PC Advisor&lt;/strong&gt; reports.&lt;/p&gt; &lt;p&gt;Apache and IIS host 89 percent of Web sites, but are responsible for 98 percent of Web-based malware.&lt;/p&gt; &lt;p&gt;In a blog, Google’s Nagendra Modadugu noted many dirty servers were found in &lt;a href=&quot;http://blogs.zdnet.com/security/?p=266&quot;&gt;areas with rampant software piracy&lt;/a&gt;, such as China and South Korea, according to &lt;strong&gt;ZDNet&lt;/strong&gt;.&lt;/p&gt;   &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/6955000165473302808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/6955000165473302808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/6955000165473302808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/6955000165473302808'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/06/google-bashes-iis-on-web-security.html' title='Google Bashes IIS on Web Security'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-7661314180361961325</id><published>2007-06-06T23:08:00.000-07:00</published><updated>2007-06-06T23:09:56.416-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blog"/><category scheme="http://www.blogger.com/atom/ns#" term="Feed Burner"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><title type='text'>With FeedBurner, Google Takes the Measure of the Web</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot; class=&quot;entry-body&quot;&gt;                           &lt;p&gt;&lt;a href=&quot;http://blogs.business2.com/photos/uncategorized/2007/06/01/feedburnerflame.png&quot;&gt;&lt;img src=&quot;http://blogs.business2.com/beta/images/2007/06/01/feedburnerflame.png&quot; title=&quot;Feedburnerflame&quot; alt=&quot;Feedburnerflame&quot; style=&quot;margin: 0px 5px 5px 0px; float: left;&quot; border=&quot;0&quot; height=&quot;107&quot; width=&quot;100&quot; /&gt;&lt;/a&gt;Google (GOOG) &lt;a href=&quot;http://googleblog.blogspot.com/2007/06/adding-more-flare.html&quot;&gt;has bought FeedBurner&lt;/a&gt;, in a move that hits close to home for Beta. Why? Well, I&#39;m a customer of both, using Google Analytics to track our blog networks&#39; traffic and FeedBurner to manage our RSS feeds.&lt;/p&gt;  &lt;p&gt;Dick Costolo, FeedBurner&#39;s CEO, had a key insight three years ago: RSS feeds are a new medium, different from the Web. &quot;The new medium never drives dollars to the old; it drives dollars to the new thing,&quot; he told &lt;em&gt;Business 2.0&lt;/em&gt; last year. And sure enough: Look at all those dollars the Google truck just drove to FeedBurner.&lt;/p&gt;                   &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;                                                                       &lt;/div&gt;&lt;div class=&quot;entry-more&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;                                   &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The deal, valued at a rumored $100 million - a figure the companies have yet to confirm or deny - has been cast as all about advertising. FeedBurner sells ads that appear in RSS feeds, a Web delivery mechanism used by blog and news sites to deliver headlines, summaries, and sometimes the entire text of articles and posts.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt; But I think there&#39;s more to the deal - and to FeedBurner - than that.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;FeedBurner doesn&#39;t just distribute feeds; it enhances them and recombines them in several ways. Business 2.0, for example, uses FeedBurner to power a feature called &quot;The Spew,&quot; where all of the B2 blogs&#39; posts are mixed together into a continuous, real-time feed. Today, one big thing that FeedBurner does is splice in ads to feeds, but I could see it doing a lot more. Imagine, for example, Google using its search technology to splice in related videos, Web pages, and blog posts into a feed.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;And FeedBurner also fits with another Google product, Google Analytics. FeedBurner recently expanded from tracking RSS feed activity to tracking Web-page traffic, too, with the acquisition of another startup called Blogbeat. Folding Blogbeat into Google Analytics, which Google recently revamped, could make that traffic-tracking tool even more useful. By adding RSS traffic into the media types Google tracks, FeedBurner will let bloggers and other publishers will get a better picture of how their readers are consuming their content.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;For those concerned about Google&#39;s growing domination, its entry into the RSS-feed business may be cause for alarm. But I imagine most publishers and advertisers will see this as a positive - one vendor to deal with and integrate into their websites, where there used to be two.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;What do you think? Does this move give Google too much power over bloggers?&lt;/p&gt;                           &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/7661314180361961325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/7661314180361961325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/7661314180361961325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/7661314180361961325'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/06/with-feedburner-google-takes-measure-of.html' title='With FeedBurner, Google Takes the Measure of the Web'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-831775849265764925</id><published>2007-06-06T22:45:00.000-07:00</published><updated>2007-06-06T23:06:40.146-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apple"/><category scheme="http://www.blogger.com/atom/ns#" term="IP TV"/><category scheme="http://www.blogger.com/atom/ns#" term="Television"/><title type='text'>AT&amp;T&#39;s Internet TV on Apple Set-Top Box in 2008?</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://blogs.business2.com/.shared/image.html?/photos/uncategorized/2007/06/01/picture_16.png&quot; onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=227,height=123,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot;&gt;&lt;img alt=&quot;Picture_16&quot; title=&quot;Picture_16&quot; src=&quot;http://blogs.business2.com/apple/images/2007/06/01/picture_16.png&quot; style=&quot;margin: 0px 0px 5px 5px; float: right;&quot; border=&quot;0&quot; height=&quot;108&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Citing a &quot;well-connected&quot;  source, Engadget&#39;s Peter Rojas reports that AT&amp;T (T) and Apple (AAPL) are working on adding Internet protocol television to Apple TV, starting sometime next year. He goes on to speculate:&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;;font-family:Arial;font-size:10;&quot;  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;;font-family:Arial;font-size:10;&quot;  &gt;We&#39;re guessing that it&#39;ll be something like AT&amp;amp;T&#39;s U-verse TV service, but it&#39;s still &lt;em&gt;way &lt;/em&gt;too early to say whether this would be a blown-out offering a full package of channels aimed at replacing your current cable/satellite service, a more limited selection of on-demand programming, or whether it&#39;d even be available to non-AT&amp;T subscribers.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;A rumor like this has a bit more credibility than usual, coming on heels of the Apple-YouTube deal, and is likely to fuel analysts&#39; newly rekindled enthusiasm for the Apple TV platform.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;                                                                    &lt;p style=&quot;text-align: justify;&quot;&gt;&lt;a onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=452,height=318,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot; href=&quot;http://blogs.business2.com/.shared/image.html?/photos/uncategorized/2007/05/31/picture_12.png&quot;&gt;&lt;img src=&quot;http://blogs.business2.com/apple/images/2007/05/31/picture_12.png&quot; title=&quot;Picture_12&quot; alt=&quot;Picture_12&quot; style=&quot;margin: 0px 5px 5px 0px; float: left;&quot; border=&quot;0&quot; height=&quot;175&quot; width=&quot;250&quot; /&gt;&lt;/a&gt; Only days after &lt;em&gt;Fortune&lt;/em&gt;&#39;s Brent Schendler pronounced Apple&#39;s (AAPL) set-top box all but dead (&quot;Why Apple TV is a Dud&quot;), Steve Jobs has breathed new life into the business he described at &lt;a href=&quot;http://allthingsd.com/&quot;&gt;All Things Digital&lt;/a&gt; yesterday as a &quot;hobby&quot; (as opposed to a $10 billion business like iPod/iTunes, the Mac and, he hopes, the iPhone).&lt;br /&gt;&lt;br /&gt;All it took were two relatively modest changes:&lt;br /&gt;&lt;br /&gt;1) A new $399 version with a 160 gig hard drive (as opposed to the $299, 40 gig version that had been met with derision by heavy-duty downloaders);&lt;br /&gt;&lt;br /&gt;2) A deal with Google (GOOG) to make YouTube content available on the Apple TV menu, starting in mid-June with &quot;thousands&quot; of clips (added manually by a team that puts them into Apple TV-friendly format) to be followed in the fall by YouTube&#39;s full catalog. (Apple press release &lt;a href=&quot;http://www.apple.com/pr/library/2007/05/30appletv.html&quot;&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;The YouTube deal is especially significant because it represents the first time the box is being used as anything but a place to show content purchased on the iTunes Music Store (or stuff previously stored on a local hard drive).&lt;br /&gt;&lt;br /&gt;Opening up Apple TV by just this much has fired the imagination of analysts, who are now talking about other content that could be streamed directly to the box. TV shows, for example, shown with or without commercials, but on demand, when you want to watch them, thus bypassing the cable monopolies&lt;br /&gt;&lt;br /&gt;No wonder Viacom (VIA), which is hardly YouTube friendly -- having sued Google for $1 billion for allowing Viacom intellectual property to slip (or rather pour) through YouTube&#39;s cracks -- seems to have changed its tune overnight. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;blockquote&gt;  &lt;p&gt; &quot;We&#39;re always vigilant about protecting our copyrights,&quot; a Viacom spokeswoman told the &lt;a href=&quot;http://news.bbc.co.uk/1/hi/business/6707267.stm&quot;&gt;BBC&lt;/a&gt;.&lt;br /&gt;&quot;But we would welcome the opportunity to license our content to Apple as we do with all distributors.&quot;&lt;/p&gt;&lt;/blockquote&gt;[Apple TV screen shot courtesy of Gizmodo]&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/831775849265764925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/831775849265764925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/831775849265764925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/831775849265764925'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/06/at-internet-tv-on-apple-set-top-box-in.html' title='AT&amp;T&#39;s Internet TV on Apple Set-Top Box in 2008?'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-953399529381270730</id><published>2007-06-06T22:34:00.000-07:00</published><updated>2007-06-06T22:43:30.539-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apple"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>Apple iPhone</title><content type='html'>&lt;h3 class=&quot;entry-header&quot;&gt;Apple iPhone Launches June 29&lt;br /&gt;&lt;/h3&gt;                      &lt;div class=&quot;entry-content&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;                   &lt;/div&gt;&lt;div class=&quot;entry-body&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;                           &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://blogs.business2.com/.shared/image.html?/photos/uncategorized/2007/06/03/picture_18.png&quot; onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=640,height=487,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot;&gt;&lt;img alt=&quot;Picture_18&quot; title=&quot;Picture_18&quot; src=&quot;http://blogs.business2.com/apple/images/2007/06/03/picture_18.png&quot; style=&quot;margin: 0px 5px 5px 0px; float: left;&quot; border=&quot;0&quot; height=&quot;190&quot; width=&quot;250&quot; /&gt;&lt;/a&gt; After weeks of anticipation, speculation and guesses good and bad, Apple (AAPL) tonight confirmed the launch date of the iPhone: Friday, June 29.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The news came in a series of three TV ads aired Sunday night and posted shortly after on Apple&#39;s website &lt;a href=&quot;http://www.apple.com/iphone/ads/&quot;&gt;here&lt;/a&gt;. The first ones aired at 7 p.m. ET, according to several sources, one before the broadcast of &lt;em&gt;60 Minutes&lt;/em&gt; on CBS, and another just before the 7 p.m. broadcast of &lt;em&gt;7th Heaven&lt;/em&gt;.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Each demonstrates a selection of the iPhone&#39;s functions and ends with the words &quot;Only on the new AT&amp;T,&quot; the Apple logo, and the tagline: &quot;Coming June 29.&quot;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The ads are straightforward and ungimmicky, except perhaps for &quot;Calimari&quot; (see below) ,which jumps from watching the giant squid scene in &lt;em&gt;Pirates of the Caribbean&lt;/em&gt; to searching for the nearest seafood restaurant in San Francisco to calling for a reservation. It will be interesting to see if the iPhone -- and the Net -- work as quickly and seamlessly in the real world. &lt;/p&gt;  &lt;p style=&quot;text-align: justify;&quot;&gt;The only news in the ads, besides the launch date, comes in the small print on the AT&amp;T screen. It reads:&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;blockquote&gt;&lt;p&gt;&quot;Use requires minimum new two year activation plan.&quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;That should put to rest rumors floated two weeks ago that the iPhone might be offered contract-free, with prepaid and pay-as-you-go options.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Pasted below is the YouTube version of the Calimari ad:&lt;/p&gt; &lt;p&gt;&lt;object height=&quot;350&quot; width=&quot;425&quot;&gt;&lt;param value=&quot;http://www.youtube.com/v/LsIfo2yCnmE&quot; name=&quot;movie&quot;&gt;&lt;param value=&quot;transparent&quot; name=&quot;wmode&quot;&gt;&lt;embed wmode=&quot;transparent&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://www.youtube.com/v/LsIfo2yCnmE&quot; height=&quot;350&quot; width=&quot;425&quot;&gt;&lt;/embed&gt;&lt;/object&gt; &lt;/p&gt;                   &lt;/div&gt;                                                               &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/953399529381270730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/953399529381270730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/953399529381270730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/953399529381270730'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/06/apple-iphone.html' title='Apple iPhone'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-1871018762000715653</id><published>2007-06-06T22:06:00.000-07:00</published><updated>2007-06-06T22:16:31.798-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Games"/><category scheme="http://www.blogger.com/atom/ns#" term="Play Station"/><category scheme="http://www.blogger.com/atom/ns#" term="X-Box"/><title type='text'>Pac Man finds new life on Xbox</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;Update of iconic video game, created by original designer, features dance music and mazes that change shapes.&lt;/span&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;storysubhead&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAsXudG4tdjqob3oF2xmL0HRljzyZxug8pVVAzA1gwkvQIVRaRa9hyxMSGTFPplJnxdVUL5BCf4rQkTuaJ4k0MbOnigurj501sOOl9t7t-RvpSZIQixVKmJRMKF0aYrAn4GaVeuY7Ji5Q/s1600-h/pactitle.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAsXudG4tdjqob3oF2xmL0HRljzyZxug8pVVAzA1gwkvQIVRaRa9hyxMSGTFPplJnxdVUL5BCf4rQkTuaJ4k0MbOnigurj501sOOl9t7t-RvpSZIQixVKmJRMKF0aYrAn4GaVeuY7Ji5Q/s320/pactitle.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5073185975487367122&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Pac Man will be reborn on Microsoft Corp.&#39;s Xbox Live online service Wednesday as a final tribute for designer Toru Iwatani, who is retiring from the $30 billion games industry he helped ignite.&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The new version of the iconic arcade game is a faithful interpretation of the addictive 27-year-old original, where players wrenched joystick controllers to race a character - resembling a yellow pizza missing a slice - around a digital maze to chomp white pellets and chase multicolored &quot;ghosts.&quot;&lt;/p&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;storysubhead&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3h6-0gHpN6aF7qEc6kwNrloomVLyd1SIKT5ahyphenhyphenvYi4wNvXJO_rjhbojwaOIemVBrs8ytTMBVs0PdB4nJXgTFck2a8p77rTUc0GLnm6qroX7FfwME6CmSM7BWlVeZkMZhglP7oFXIR40I/s1600-h/rendered-pacman.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3h6-0gHpN6aF7qEc6kwNrloomVLyd1SIKT5ahyphenhyphenvYi4wNvXJO_rjhbojwaOIemVBrs8ytTMBVs0PdB4nJXgTFck2a8p77rTUc0GLnm6qroX7FfwME6CmSM7BWlVeZkMZhglP7oFXIR40I/s200/rendered-pacman.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5073186804416055282&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/h2&gt;The new game, &quot;Pac Man Championship Edition,&quot; is the second and final version Iwatani personally designed, and was created for the final round of the Xbox 360 Pac-Man World Championship in New York, when nine finalists played it for the first time.</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/1871018762000715653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/1871018762000715653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/1871018762000715653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/1871018762000715653'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/06/pac-man-finds-new-life-on-xbox.html' title='Pac Man finds new life on Xbox'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAsXudG4tdjqob3oF2xmL0HRljzyZxug8pVVAzA1gwkvQIVRaRa9hyxMSGTFPplJnxdVUL5BCf4rQkTuaJ4k0MbOnigurj501sOOl9t7t-RvpSZIQixVKmJRMKF0aYrAn4GaVeuY7Ji5Q/s72-c/pactitle.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-4086806681963036050</id><published>2007-06-06T22:04:00.000-07:00</published><updated>2007-06-06T22:18:37.819-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Games"/><category scheme="http://www.blogger.com/atom/ns#" term="Play Station"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><category scheme="http://www.blogger.com/atom/ns#" term="WII"/><title type='text'>Wii outsells PlayStation</title><content type='html'>Nintendo Co.&#39;s Wii game console outsold Sony Corp.&#39;s PlayStation 3 by more than five to one in Japan last month, Japanese video game magazine publisher Enterbrain said Wednesday.&lt;p style=&quot;text-align: justify;&quot;&gt;Nintendo (Charts) sold 251,794 units of the Wii in May, compared with 45,321 units of the PS3 sold, it said.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;!-- REAP --&gt;&lt;!--startclickprintexclude--&gt;&lt;/div&gt;&lt;div style=&quot;max-width: 220px; margin-bottom: 10px; clear: right; float: right; margin-left: 10px; text-align: justify;&quot;&gt;&lt;div class=&quot;IErow&quot; style=&quot;width: 220px;&quot;&gt;    &lt;!-- KEEP --&gt;&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;220&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;http://i.cnn.net/money/2007/06/05/news/international/nintendo_sony.reut/nintendo_wii.03.jpg&quot; alt=&quot;pic&quot; border=&quot;0&quot; height=&quot;130&quot; width=&quot;220&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot; valign=&quot;top&quot;&gt;&lt;span style=&quot;font-size:78%;&quot;&gt;&lt;span class=&quot;captionname&quot;&gt;&lt;b&gt;Nintendo&#39;s Wii is outselling the rival Playstation 3 from Sony.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;!--endclickprintexclude--&gt;&lt;!-- /REAP --&gt;&lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Nintendo launched the Wii in November. The device features a motion-sensitive controller that allows users to direct on-screen play by swinging it like a tennis racket or wielding it like a sword, opening a new avenue of game playing.&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Rival Sony (Charts) also started selling the PS3 late last year, but has seen slow demand so far due to its high price tag and limited availability of attractive software titles.&lt;/p&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Shares of both Nintendo and Sony edged higher in early morning trading in Tokyo&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/4086806681963036050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/4086806681963036050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/4086806681963036050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/4086806681963036050'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/06/wii-outsells-playstation.html' title='Wii outsells PlayStation'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-8871357160355560953</id><published>2007-05-26T09:42:00.000-07:00</published><updated>2007-05-26T09:45:15.656-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Car"/><category scheme="http://www.blogger.com/atom/ns#" term="Cellphone"/><category scheme="http://www.blogger.com/atom/ns#" term="Mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="Nissan"/><title type='text'>Cellphones can disable car keys: Nissan</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Nissan North America has a warning for customers: placing your electronic key too close to your cellphone could leave you stranded. &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The automaker is asking customers driving new models of two of its flagship sedans to keep their car keys and cellphones at least an inch apart to avoid disabling the &quot;intelligent keys.&quot;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Cellphones kept near Nissan&#39;s I-Keys -- wireless devices designed to allow drivers to enter and start their cars at the push of a button -- can erase the electronic code on the keys, rendering them unable to unlock or start the cars.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The problem has occurred on the 2007 Nissan Altima and Infiniti G35 sedans -- two of their top-selling models. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&quot;The company discovered that if the I-Key touches a cellphone, outgoing or incoming calls have the potential to alter the electronic code inside the I-Key&quot;. The car won&#39;t start and the I-Key cannot be reprogrammed.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The problem has occurred in a &quot;very small percentage&quot; of cars sold. A new version of the I-Key would be available in the fall.&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The current owners have been notified of the potential glitch via mail and can get new keys from dealers if they encounter the problem.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/8871357160355560953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/8871357160355560953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/8871357160355560953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/8871357160355560953'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/cellphones-can-disable-car-keys-nissan.html' title='Cellphones can disable car keys: Nissan'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-593028239894069992</id><published>2007-05-26T09:36:00.000-07:00</published><updated>2007-05-26T09:41:01.044-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laptop"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><title type='text'>World&#39;s Thinnest Laptop</title><content type='html'>&lt;div class=&quot;itemtext&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;      &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;At 0.7-inches thin and 2.25 pounds light with an out of this world battery life of up to 14 hours, a prototype laptop backed by Intel dubbed the “Intel mobile Metro notebook” could change the game for PCs. I know I am biased as I write this on my Mac, but for the last few years PC offerings have been rather stale. With few attractive yet functional PC notebook solutions it’s no &lt;span id=&quot;more-1381&quot;&gt;&lt;/span&gt; wonder why people have abandoned ship to head for whiter pastures.&lt;/p&gt; &lt;div class=&quot;center&quot;&gt;&lt;img src=&quot;http://paulstamatiou.com/wp-content/uploads/2007/05/codename_metro.jpg&quot; alt=&quot;Intel Codename Metro Notebook&quot; /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;small&gt;Image courtesy of BusinessWeek&lt;/small&gt;&lt;/div&gt;&lt;/div&gt; &lt;p style=&quot;text-align: justify;&quot;&gt;Intel set out to change this misconception by funding some of its engineers along with Ziba Design to create a stunning “Think Thin” notebook. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt; &lt;blockquote&gt;&lt;p&gt;The machine has to be fashionable, able to connect to all manner of wireless networks, and full of the latest, fastest computing capabilities. Oh yes, and make it as thin as Motorola’s Razr.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://businessweek.com/technology/content/may2007/tc20070523_272039.htm&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;The result is a notebook that might make me switch my mobile computing needs to a PC (if Apple never releases their rumored ultraportable notebook). While such a notebook won’t come to mass produced fruition for a while, it gives us a glimpse into the future of notebooks if other PC manufacturers take notice. The codename Metro notebook specs are enough to make any techie giddy. Although, no word yet on the size of the screen or possible cost if it ever goes up for sale.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;0.7-inch thin magnesium case&lt;/li&gt;&lt;li&gt;Access to cellular, Wi-Fi and WiMax wireless networks&lt;/li&gt;&lt;li&gt;Small array microphones to cancel out background noise - useful with Skype, etc.&lt;/li&gt;&lt;li&gt;Flash memory used in place of the traditional hard drive&lt;/li&gt;&lt;li&gt;Integrated fingerprint reader&lt;/li&gt;&lt;li&gt;No-rim, glass-like cover extends across screen&lt;/li&gt;&lt;li&gt;Screen brightness automatically adjusts with light sensors&lt;/li&gt;&lt;li&gt;Built-in video camera&lt;/li&gt;&lt;li&gt;Backlit keyboard&lt;/li&gt;&lt;li&gt;Unique case with integrated screen allows you to check email and take part in other activities on the go&lt;/li&gt;&lt;/ul&gt; &lt;div class=&quot;center&quot;&gt;&lt;img src=&quot;http://paulstamatiou.com/wp-content/uploads/2007/05/codename_metro2.jpg&quot; alt=&quot;Intel Codename Metro Notebook&quot; /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;small&gt;Image courtesy of BusinessWeek&lt;/small&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;Take a look at the &lt;a href=&quot;http://images.businessweek.com/ss/07/05/0524_metrolaptop/index_01.htm&quot;&gt;BusinessWeek slide show&lt;/a&gt; for more pictures of this cutting-edge laptop.&lt;/p&gt; &lt;p style=&quot;text-align: justify;&quot;&gt;What do you think of this prototype notebook? It could be exactly what the PC industry needs to revamp slumping sales of high-end notebooks while adding excitement to the term “PC”. This might also signal the beginning of an era where laptops might regularly be thinner than mobile phones and where laptops start to be classified into specifications by their thickness. For example, a Class A notebook might be 0.5-inches thin and under, a Class B device might be 0.75-inches thin and under, etcetera.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/593028239894069992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/593028239894069992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/593028239894069992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/593028239894069992'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/worlds-thinnest-laptop.html' title='World&#39;s Thinnest Laptop'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-877093056712374713</id><published>2007-05-26T09:25:00.000-07:00</published><updated>2007-05-26T09:36:13.897-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="Technology"/><category scheme="http://www.blogger.com/atom/ns#" term="TV"/><title type='text'>Watch TV on mobiles with Doordarshan</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0oRutVawuzwWXx7HDVKEvvX_T8ngPkRxzYwFqrxco1i9xsGY_Zwf2qRaS7EHZFod6oOw5NOsSsAFTWvE_SyUfoLQAf4dL3RoYagMHGAuEehF_YzRLPb4Sd97ut8zwCTFsScxFLsdCttU/s1600-h/TV-Mobile.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0oRutVawuzwWXx7HDVKEvvX_T8ngPkRxzYwFqrxco1i9xsGY_Zwf2qRaS7EHZFod6oOw5NOsSsAFTWvE_SyUfoLQAf4dL3RoYagMHGAuEehF_YzRLPb4Sd97ut8zwCTFsScxFLsdCttU/s320/TV-Mobile.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5068908182231907986&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;content&quot;&gt;Even as the telecom industry is debating with the government for spectrum allocation for launch of 3G or triple play services, State-owned television broadcaster Doordarshan has launched mobile TV on the DVB-H platform.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt; “DVB-H is a technology that allows simultaneous transmission of multiple channels of television, radio and data to a range of multimedia devices including mobile phones, PDA’s, PC’s and other handheld devices. It is a new concept which is going to change the face of television,”&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;DVB-H offered a number of advantages, which include better reception quality, increased channel carrying capacity, new features such as program guides to facilitate navigation, multi-view and interactive services. “DVB-H brings with it the capability to continually enhance services provided to subscribers, both from a video perspective and from new applications&quot;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;DVB works on the IP platform, similar to GSM technology. The signals are transmitted via towers like the GSM telephony, and handsets have to be developed for better transmission for a larger area,&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;DVB forum is working on a next level of technology for satellite television channels – DVB-SH, which is due to be released later this year and the commercial launch will be in 2009-2010. The satellite technology is being given major thrust as the DVB-H is limited to terrestrial television channels and satellite signals can reach even the remotest parts of the country”&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/877093056712374713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/877093056712374713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/877093056712374713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/877093056712374713'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/watch-tv-on-mobiles-with-doordarshan.html' title='Watch TV on mobiles with Doordarshan'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0oRutVawuzwWXx7HDVKEvvX_T8ngPkRxzYwFqrxco1i9xsGY_Zwf2qRaS7EHZFod6oOw5NOsSsAFTWvE_SyUfoLQAf4dL3RoYagMHGAuEehF_YzRLPb4Sd97ut8zwCTFsScxFLsdCttU/s72-c/TV-Mobile.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-4409182837142073894</id><published>2007-05-24T08:16:00.000-07:00</published><updated>2007-05-24T08:21:40.977-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gmail"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><title type='text'>Increased attachment limit-- 20 MB!</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgjZbs2WdZW2drAiOnD58nVg4HA3GcvHR2EfxS_nslrocjhTbbQ3jX-ChZv8dw2LOinLZ2teW0Ue_7GL5QJ10UDo_HBdp52hl-L-ckEsbPlP-Qx4ikyDOwLQvLu_r4Ub80CSQO8prXnFY/s1600-h/logo.gif&quot;&gt;&lt;img style=&quot;margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgjZbs2WdZW2drAiOnD58nVg4HA3GcvHR2EfxS_nslrocjhTbbQ3jX-ChZv8dw2LOinLZ2teW0Ue_7GL5QJ10UDo_HBdp52hl-L-ckEsbPlP-Qx4ikyDOwLQvLu_r4Ub80CSQO8prXnFY/s320/logo.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5068147599358361218&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-size:-1;&quot;&gt;&lt;strong&gt;&lt;/strong&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;Google Inc launches a new feature in gmail. Now you can start sharing more of those home videos, large presentations and files you just can&#39;t seem to get smaller. We have doubled the allowable attachment size to 20 MB to make your Gmail space even more useful.&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/4409182837142073894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/4409182837142073894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/4409182837142073894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/4409182837142073894'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/increased-attachment-limit-20-mb.html' title='Increased attachment limit-- 20 MB!'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgjZbs2WdZW2drAiOnD58nVg4HA3GcvHR2EfxS_nslrocjhTbbQ3jX-ChZv8dw2LOinLZ2teW0Ue_7GL5QJ10UDo_HBdp52hl-L-ckEsbPlP-Qx4ikyDOwLQvLu_r4Ub80CSQO8prXnFY/s72-c/logo.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-2513060173224100123</id><published>2007-05-23T23:42:00.000-07:00</published><updated>2007-05-24T00:28:19.026-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="OS"/><category scheme="http://www.blogger.com/atom/ns#" term="Vista"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Vista"/><title type='text'>Windows Vista x64</title><content type='html'>&lt;span id=&quot;intelliTXT&quot;&gt;&lt;h2&gt;Contents&lt;/h2&gt; &lt;table border=&quot;0&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;color: rgb(0, 0, 153);&quot; width=&quot;297&quot;&gt; &lt;ul&gt;&lt;li&gt;Introduction  &lt;/li&gt;&lt;li&gt;x64 Section  &lt;ul&gt;&lt;li&gt;x64 Assembly   &lt;/li&gt;&lt;li&gt;C/C++ Programming   &lt;/li&gt;&lt;li&gt;Inline Assembly   &lt;/li&gt;&lt;li&gt;Windows On Windows   &lt;/li&gt;&lt;li&gt;File System And Registry Redirection   &lt;/li&gt;&lt;li&gt;Interprocess Communication   &lt;/li&gt;&lt;li&gt;Portable Executable   &lt;/li&gt;&lt;li&gt;Exception Handling   &lt;/li&gt;&lt;li&gt;.NET Framework  &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Vista Section  &lt;ul&gt;&lt;li&gt;Editions  &lt;/li&gt;&lt;li&gt;Microsoft Visual Studio   &lt;/li&gt;&lt;li&gt;User Account Control   &lt;/li&gt;&lt;li&gt;Compatibility Verification   &lt;/li&gt;&lt;li&gt;Obtaining Admin Rights   &lt;/li&gt;&lt;li&gt;Disable It   &lt;/li&gt;&lt;li&gt;Address Space Layout Randomization  &lt;/li&gt;&lt;li&gt;Driver Signing   &lt;/li&gt;&lt;li&gt;Patch Guard   &lt;/li&gt;&lt;li&gt;Attacks  &lt;/li&gt;&lt;li&gt;Registry Filtering  &lt;/li&gt;&lt;li&gt;Power Management&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;.NET Framework 3.0  &lt;ul&gt;&lt;li&gt;Windows Presentation Foundation  &lt;/li&gt;&lt;li&gt;Windows Communication Foundation   &lt;/li&gt;&lt;li&gt;Windows Workflow Foundation &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Conclusions&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt; &lt;td&gt;&lt;img alt=&quot;Windows Vista x64 Logo&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/vistalogo.jpg&quot; height=&quot;166&quot; width=&quot;174&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;h2&gt;&lt;a name=&quot;Introduction&quot;&gt;Introduction&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;This is an introduction to Windows Vista and the x64 architecture. Writing an article like this is always uneasy, because there&#39;s plenty to talk about, but on the other hand it&#39;s an article, not a book. I tried to focus on some important aspects, but it goes without saying it that I had to cut out a lot (e.g. the User-Mode Driver Framework, and I&#39;m very sorry for that). This is just a general overview on certain topics, if you want to learn more, then you should really consider turning to specific guides. Also, I won&#39;t talk about some obvious matters of the x64 architecture, like the fact that applications can now access a larger memory range etc. This article should be considered a quick upgrade for x86/XP developers.&lt;/p&gt; &lt;p&gt;At the time I write this article I&#39;ve been using Windows Vista for a month and its official release is scheduled for January 30th (so, in another month). I moved to x64 with XP some months ago and at the time I did I was surprised that I found all the drivers for my devices. But, as we know, Windows Vista requires drivers to be certified, and in order to get the certification companies have to supply a x64 version of the driver. No certification will be released for x86-only drivers. However, at the moment I write, a lot of applications like virtual drive encrypters don&#39;t provide drivers for Vista (since x64 versions haven&#39;t got a certificate). If you didn&#39;t know about the certification, don&#39;t worry, I&#39;ll talk about it later and you&#39;ll see that it&#39;s still possible to run drivers without it. I just wanted to say that hardware compatibility is no longer an issue like it was one year ago, and by switching to Windows Vista x64 you&#39;re not taking too much chances. &lt;/p&gt; &lt;p&gt;I tried to organize this article in two sections, one about the changes brought us by x64 and then by Vista. I tried as hard as possible to separate these two things, because the x64 technology already existed under Windows XP, so it was important to me that the reader was given a clear distinction between those things that affect only Vista and those ones which affect both topics.&lt;/p&gt; &lt;h2&gt;&lt;a name=&quot;x64_Section&quot;&gt;x64 Section&lt;/a&gt;&lt;/h2&gt; &lt;h3&gt;&lt;a name=&quot;x64_Assembly&quot;&gt;x64 Assembly&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;In this paragraph I&#39;ll try to explain the basics of x64 assembly. I assume the reader is already familiar with x86 assembly, otherwise he won&#39;t be able to make heads or tails of this paragraph. Moreover, since this is just a very (but very) brief guide, you&#39;ll have to look into the &lt;a href=&quot;http://www.amd.com/us-en/Processors/DevelopWithAMD/0,,30_2252_739_7044,00.html&quot;&gt;AMD64 documentation&lt;/a&gt; for more advanced stuff. Some stuff I won&#39;t even mention, you&#39;ll see by yourself that some instructions are no longer in use: for instance, that the lea instruction has completely taken place of the mov offset.&lt;/p&gt; &lt;p&gt;What you&#39;re going to notice at once is that there are some more registers in the x64 syntax:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;8 new general-purpose registers (GPRs).  &lt;/li&gt;&lt;li&gt;8 new 128-bit XMM registers. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Of course, all general-purpose registers are 64 bits wide. The old ones we already knew are easy to recognize in their 64-bit form: rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp (and rip if we want to count the instruction pointer). These old registers can still be accessed in their smaller bit ranges, for instance: rax, eax, ax, ah, al. The new registers go from r8 to r15, and can be accessed in their various bit ranges like this: r8 (qword), r8d (dword), r8w (word), r8b (low byte).&lt;/p&gt; &lt;p&gt;Here&#39;s a figure taken from the AMD docs:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/x64_registers.jpg&quot; border=&quot;0&quot; height=&quot;430&quot; width=&quot;600&quot; /&gt;&lt;/p&gt; &lt;p&gt;Applications can still use segments registers as base for addressing, but the 64-bit mode only recognizes three of the old ones (and only two can be used for base address calculations). Here&#39;s another figure:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/x64_segments.jpg&quot; border=&quot;0&quot; height=&quot;277&quot; width=&quot;295&quot; /&gt;&lt;/p&gt; &lt;p&gt;And now, the most important things. Calling convention and stack. x64 assembly uses FASTCALLs as calling convention, meaning it uses registers to pass the first 4 parameters (and then the stack). Thus, the stack frame is made of: the stack parameters, the registers parameters, the return address (which I remind you is a qword) and the local variables. The first parameter is the rcx register, the second one rdx, the third r8 and the fourth r9. Saying that the parameters registers are part of the stack frame, makes it also clear that any function that calls another child function has to initialize the stack providing space for these four registers, even if the parameters passed to the child function are less than four. The initialization of the stack pointer is done only in the prologue of a function, it has to be large enough to hold all the arguments passed to child functions and it&#39;s always a duty of the caller to clean the stack. Now, the most important thing to understand how the space is provided in the stack frame is that the stack has to be 16-byte aligned. In fact, the return address has to be aligned to 16 bytes. So, the stack space will always be something like 16n + 8, where n depends on the number of parameters. Here&#39;s a small figure of a stack frame:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/stackframe.jpg&quot; border=&quot;0&quot; height=&quot;177&quot; width=&quot;246&quot; /&gt;&lt;/p&gt; &lt;p&gt;Don&#39;t worry if you haven&#39;t completely figured out how it works: now we will see a few code samples, which, in my opinion, always make the theory a lot easier to understand. Let us take for instance a hello-world application like:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,&lt;br /&gt;                  LPSTR szCmdLine, &lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; iCmdShow)&lt;br /&gt;{&lt;br /&gt; MessageBox(NULL, _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;), _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;My First x64 Application&quot;&lt;/span&gt;), &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;);&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;This code disassembled would look like:&lt;/p&gt;&lt;pre lang=&quot;asm&quot;&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401220&lt;/span&gt; sub_401220 proc near       &lt;span class=&quot;cpp-comment&quot;&gt;; CODE XREF: start+10E p&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401220&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401220&lt;/span&gt; arg_0= qword &lt;span class=&quot;cpp-keyword&quot;&gt;ptr&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;8&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401220&lt;/span&gt; arg_8= qword &lt;span class=&quot;cpp-keyword&quot;&gt;ptr&lt;/span&gt; 10h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401220&lt;/span&gt; arg_10= qword &lt;span class=&quot;cpp-keyword&quot;&gt;ptr&lt;/span&gt; 18h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401220&lt;/span&gt; arg_18= &lt;span class=&quot;cpp-keyword&quot;&gt;dword&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;ptr&lt;/span&gt; 20h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401220&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401220&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+arg_18], r9d&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401225&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+arg_10], r8&lt;br /&gt;.text:000000000040122A    &lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+arg_8], rdx&lt;br /&gt;.text:000000000040122F    &lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+arg_0], rcx&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401234&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;sub&lt;/span&gt; rsp, 28h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401238&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; r9d, r9d            &lt;span class=&quot;cpp-comment&quot;&gt;; uType&lt;/span&gt;&lt;br /&gt;.text:000000000040123B    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; r8, Caption         &lt;span class=&quot;cpp-comment&quot;&gt;; &quot;My First x64 Application&quot;&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401242&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rdx, Text           &lt;span class=&quot;cpp-comment&quot;&gt;; &quot;Hello World!&quot;&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401249&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;            &lt;span class=&quot;cpp-comment&quot;&gt;; hWnd&lt;/span&gt;&lt;br /&gt;.text:000000000040124B    &lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; cs:MessageBoxA&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401251&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401253&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rsp, 28h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401257&lt;/span&gt;    retn&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401257&lt;/span&gt; sub_401220 endp&lt;/pre&gt; &lt;p&gt;The stack pointer initialization is all about the things I said earlier. Since we are calling a child-function with parameters we need the space for all four parameter registers (0x20, this value is already aligned to 16 byte) and the return address (0x08). Thus, we&#39;ll have 0x28. Remember that if the stack-value is too small or is not aligned, your code will crash at once. Also, don&#39;t wonder why there&#39;s no &lt;code&gt;ExitProcess &lt;/code&gt;in this function: compiling the code above with Visual C++ adds always a stub (&lt;code&gt;WinMainCRTStartup&lt;/code&gt;) which then calls our WinMain. So, the ExitProcess is in the stub code. But what happens when the code before the MessageBox calls a function which take seven parameters instead of four?&lt;/p&gt;&lt;pre lang=&quot;asm&quot;&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401180&lt;/span&gt; sub_401180 proc near        &lt;span class=&quot;cpp-comment&quot;&gt;; CODE XREF: sub_4011F0+4 p&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401180&lt;/span&gt;                             &lt;span class=&quot;cpp-comment&quot;&gt;; sub_4011F0+11 p&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401180&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401180&lt;/span&gt; var_28= qword &lt;span class=&quot;cpp-keyword&quot;&gt;ptr&lt;/span&gt; -28h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401180&lt;/span&gt; var_20= qword &lt;span class=&quot;cpp-keyword&quot;&gt;ptr&lt;/span&gt; -20h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401180&lt;/span&gt; var_18= qword &lt;span class=&quot;cpp-keyword&quot;&gt;ptr&lt;/span&gt; -18h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401180&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401180&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;sub&lt;/span&gt; rsp, 48h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401184&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rax, unk_402040&lt;br /&gt;.text:000000000040118B    &lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+48h+var_18], rax&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401190&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rax, unk_402044&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401197&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+48h+var_20], rax&lt;br /&gt;.text:000000000040119C    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rax, unk_402048&lt;br /&gt;.text:00000000004011A3    &lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+48h+var_28], rax&lt;br /&gt;.text:00000000004011A8    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; r9, qword_40204C   &lt;span class=&quot;cpp-comment&quot;&gt;; __int64&lt;/span&gt;&lt;br /&gt;.text:00000000004011AF    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; r8, qword_40204C+&lt;span class=&quot;cpp-literal&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;cpp-comment&quot;&gt;; __int64&lt;/span&gt;&lt;br /&gt;.text:00000000004011B6    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rdx, unk_402054    &lt;span class=&quot;cpp-comment&quot;&gt;; __int64&lt;/span&gt;&lt;br /&gt;.text:00000000004011BD    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rcx, aAa           &lt;span class=&quot;cpp-comment&quot;&gt;; &quot;ptr&quot;&lt;/span&gt;&lt;br /&gt;.text:00000000004011C4    &lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; TakeSevenParameters&lt;br /&gt;.text:00000000004011C9    &lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; r9d, r9d               &lt;span class=&quot;cpp-comment&quot;&gt;; uType&lt;/span&gt;&lt;br /&gt;.text:00000000004011CC    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; r8, Caption        &lt;span class=&quot;cpp-comment&quot;&gt;; &quot;My First x64 Application&quot;&lt;/span&gt;&lt;br /&gt;.text:00000000004011D3    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rdx, Text          &lt;span class=&quot;cpp-comment&quot;&gt;; &quot;Hello World!&quot;&lt;/span&gt;&lt;br /&gt;.text:00000000004011DA    &lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;           &lt;span class=&quot;cpp-comment&quot;&gt;; hWnd&lt;/span&gt;&lt;br /&gt;.text:00000000004011DC    &lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; cs:MessageBoxA&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;00000000004011E2&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rsp, 48h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;00000000004011E6&lt;/span&gt;    retn&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;00000000004011E6&lt;/span&gt; sub_401180 endp&lt;/pre&gt;As said, the child function takes 7 parameters, making it necessary to provide space for 3 extra parameters on the stack. So, 7 * 8 = 0x38, which aligned to 16byte is 0x40. Providing, then, space for the return address makes it 0x48, our value indeed. I think you have understood the stack-frames logic by now, it&#39;s actually quite easy to understand it, but it needs a second to revert from the old x86/stdcall logic to this one. But now enough of this, now that we&#39;ve seen how the x64 code works, we&#39;ll try compiling an assembly source by ourselves. &lt;p&gt;Before we start, I have to make something clear. There are some assemblers over the internet which make the job easier, mainly because the initialize the stack by themselves or they create code that is easy to converto from/to x86. But I think that is not the point here in this article. In fact, I&#39;m going to use the microsoft assembler (ml64.exe), which requires you to write everything down, just like in the disassembly. Another option could be compiling the with another assembler and then link it with ml64. I think the reader should really make these decisions on his own. As far as I am concerned, I don&#39;t believe that much code should be written in assembly and avoided whenever it could be done. This new x64 technology is a good opportunity to re-think about these matters. In the last years I always wrote 64-bit compatible code in C/C++ (I mean unmanaged, of course) and when I had to recompile a project of 70,000 lines of code for x64, I didn&#39;t had to change one single line of code (I&#39;ll talk about the C/C++ programming later). Despite of all the macros an assembler offers, I seriously doubt that people who wrote their whole code in assembly will be able to switch so easily to x64 (remember one day even the IA64 syntax could be adopted). I think in most cases the obvious choice will be not converting to the new technology and stick to x86, but this isn&#39;t always possible, it depends on the software category. &lt;/p&gt; &lt;p&gt;The Microsoft assembler is contained in the SDK and in the DDK (WDK for Vista). Right now, I&#39;m using Vista&#39;s WDK, which I freely downloaded from the msdn. The first sample of code I&#39;m going to show you is a simple Hello-World messagebox application.&lt;/p&gt;&lt;pre&gt;extrn MessageBoxA : proc&lt;br /&gt;extrn ExitProcess : proc&lt;br /&gt;&lt;br /&gt;.data&lt;br /&gt;body db &#39;Hello World!&#39;, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;capt db &#39;My First x64 Application&#39;, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;.code&lt;br /&gt;Main proc&lt;br /&gt;sub rsp, 28h&lt;br /&gt;xor r9d, r9d        ; uType = &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;lea r8, capt        ; lpCaption&lt;br /&gt;lea rdx, body       ; lpText&lt;br /&gt;xor rcx, rcx        ; hWnd = NULL&lt;br /&gt;call MessageBoxA&lt;br /&gt;xorecx, ecx        ; exit code = &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;call ExitProcess&lt;br /&gt;Main endp&lt;br /&gt;&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;As you can see, I didn&#39;t bother unwinding the stack, since I call ExitProcess. The syntax is very similar to the old MASM one, although there are a few dissimilarities. The ml64 console output should be something like this: &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/ml64.jpg&quot; border=&quot;0&quot; height=&quot;301&quot; width=&quot;600&quot; /&gt;&lt;/p&gt; &lt;p&gt;The command line to compile is:&lt;/p&gt;&lt;pre lang=&quot;text&quot;&gt;ml64 C:\...\test.asm /link /subsystem:windows&lt;br /&gt; /defaultlib:C:\WinDDK\6000\lib\wnet\amd64\kernel32.lib&lt;br /&gt; /defaultlib:C:\WinDDK\6000\lib\wnet\amd64\user32.lib /entry:Main&lt;/pre&gt; &lt;p&gt;If the libs are not in the same directory as ml64.exe, you&#39;ll have to provide the path like I did. The entry has to be provided, otherwise you would have to use WinMainCRTStartup as main entry. &lt;/p&gt; &lt;p&gt;The next sample of code I&#39;m going to show you displays a window calling CreateWindowEx. What you&#39;re going to learn through this code is structure alignment and how integrating resources in your projects. Like I said earlier, I don&#39;t want to encourage you to write your windows in assembly, but I believe that this sort of code is good for learning. Now the code, afterwards the explanation.&lt;/p&gt;&lt;div class=&quot;smallText&quot; id=&quot;premain5&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;5&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg5&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;5&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse5&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre5&quot; lang=&quot;asm&quot;&gt;extrn GetModuleHandleA : proc&lt;br /&gt;extrn MessageBoxA : proc&lt;br /&gt;extrn RegisterClassExA : proc&lt;br /&gt;extrn CreateWindowExA : proc&lt;br /&gt;extrn DefWindowProcA : proc&lt;br /&gt;extrn ShowWindow : proc&lt;br /&gt;extrn GetMessageA : proc&lt;br /&gt;extrn TranslateMessage : proc&lt;br /&gt;extrn DispatchMessageA : proc&lt;br /&gt;extrn PostQuitMessage : proc&lt;br /&gt;extrn DestroyWindow : proc&lt;br /&gt;extrn ExitProcess : proc&lt;br /&gt;&lt;br /&gt;WNDCLASSEX struct&lt;br /&gt;cbSize            dd      ?&lt;br /&gt;style             dd      ?&lt;br /&gt;lpfnWndProc       dq      ?&lt;br /&gt;cbClsExtra        dd      ?&lt;br /&gt;cbWndExtra        dd      ?&lt;br /&gt;hInstance         dq      ?&lt;br /&gt;hIcon             dq      ?&lt;br /&gt;hCursor           dq      ?&lt;br /&gt;hbrBackground     dq      ?&lt;br /&gt;lpszMenuName      dq      ?&lt;br /&gt;lpszClassName     dq      ?&lt;br /&gt;hIconSm           dq      ?&lt;br /&gt;WNDCLASSEX ends&lt;br /&gt;&lt;br /&gt;POINT struct&lt;br /&gt;x                 dd      ?&lt;br /&gt;y                 dd      ?&lt;br /&gt;POINT ends&lt;br /&gt;&lt;br /&gt;MSG struct   &lt;br /&gt;hwnd              dq      ?&lt;br /&gt;message           dd      ?&lt;br /&gt;padding1          dd      ?      &lt;span class=&quot;cpp-comment&quot;&gt;; padding&lt;/span&gt;&lt;br /&gt;wParam            dq      ?&lt;br /&gt;lParam            dq      ?&lt;br /&gt;time              dd      ?&lt;br /&gt;pt                POINT   &lt;&lt;span class=&quot;cpp-comment&quot;&gt;;&gt;&lt;/span&gt;&lt;br /&gt;padding2          dd      ?      &lt;span class=&quot;cpp-comment&quot;&gt;; padding&lt;/span&gt;&lt;br /&gt;MSG ends&lt;br /&gt;&lt;br /&gt;.const&lt;br /&gt;NULL equ &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;CS_VREDRAW equ &lt;span class=&quot;cpp-literal&quot;&gt;1&lt;/span&gt;&lt;br /&gt;CS_HREDRAW equ &lt;span class=&quot;cpp-literal&quot;&gt;2&lt;/span&gt;&lt;br /&gt;COLOR_WINDOW equ &lt;span class=&quot;cpp-literal&quot;&gt;5&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;; WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;; WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) &lt;/span&gt;&lt;br /&gt;WS_OVERLAPPEDWINDOW equ 0CF0000h&lt;br /&gt;CW_USEDEFAULT equ 80000000h&lt;br /&gt;SW_SHOW equ &lt;span class=&quot;cpp-literal&quot;&gt;5&lt;/span&gt;&lt;br /&gt;WM_DESTROY equ &lt;span class=&quot;cpp-literal&quot;&gt;2&lt;/span&gt;&lt;br /&gt;WM_COMMAND equ 111h&lt;br /&gt;IDC_MENU equ &lt;span class=&quot;cpp-literal&quot;&gt;109&lt;/span&gt;&lt;br /&gt;IDM_ABOUT equ &lt;span class=&quot;cpp-literal&quot;&gt;104&lt;/span&gt;&lt;br /&gt;IDM_EXIT equ &lt;span class=&quot;cpp-literal&quot;&gt;105&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;.data&lt;br /&gt;szWindowClass db &#39;FirstApp&#39;, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;szTitle db &#39;My First x64 Windows&#39;, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;szHelpTitle db &#39;Help&#39;, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;szHelpText db &#39;This will be a big help...&#39;, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;.data?&lt;br /&gt;hInstance qword ?&lt;br /&gt;hWnd qword ?&lt;br /&gt;wndclass WNDCLASSEX &lt;&lt;span class=&quot;cpp-comment&quot;&gt;;&gt;&lt;/span&gt;&lt;br /&gt;wmsg MSG &lt;&lt;span class=&quot;cpp-comment&quot;&gt;;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;.code&lt;br /&gt;&lt;br /&gt;WndProc: &lt;span class=&quot;cpp-comment&quot;&gt;; proc hWnd : qword, uMsg : dword, wParam : qword, lParam : qword&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+&lt;span class=&quot;cpp-literal&quot;&gt;8&lt;/span&gt;], rcx        &lt;span class=&quot;cpp-comment&quot;&gt;; hWnd (save parameters as locals)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+10h], edx      &lt;span class=&quot;cpp-comment&quot;&gt;; Msg&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+18h], r8       &lt;span class=&quot;cpp-comment&quot;&gt;; wParam&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+20h], r9       &lt;span class=&quot;cpp-comment&quot;&gt;; lParam&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;sub&lt;/span&gt; rsp, 38h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;cmp&lt;/span&gt; edx, WM_DESTROY&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;jnz&lt;/span&gt; @next1&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;          &lt;span class=&quot;cpp-comment&quot;&gt;; exit code&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; PostQuitMessage&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; rax, rax&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;ret&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;@next1:&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;cmp&lt;/span&gt; edx, WM_COMMAND&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;jnz&lt;/span&gt; @default&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rbx, rsp&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rbx, 38h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; r10, [rbx+18h]     &lt;span class=&quot;cpp-comment&quot;&gt;; wParam&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;cmp&lt;/span&gt; r10w, IDM_ABOUT&lt;br /&gt;jz @about&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;cmp&lt;/span&gt; r10w, IDM_EXIT&lt;br /&gt;jz @exit&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;jmp&lt;/span&gt; @default&lt;br /&gt;&lt;br /&gt;@about:&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; r9d, r9d&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; r8, szHelpTitle&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rdx, szHelpText&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; MessageBoxA&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;jmp&lt;/span&gt; @default&lt;br /&gt;&lt;br /&gt;@exit:&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rbx, rsp&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rbx, 38h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rcx, [rbx+8h]       &lt;span class=&quot;cpp-comment&quot;&gt;; hWnd&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; DestroyWindow&lt;br /&gt;&lt;br /&gt;@default:&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rbx, rsp&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rbx, 38h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; r9, [rbx+20h]       &lt;span class=&quot;cpp-comment&quot;&gt;; lParam&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; r8, [rbx+18h]       &lt;span class=&quot;cpp-comment&quot;&gt;; wParam&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; edx, [rbx+10h]      &lt;span class=&quot;cpp-comment&quot;&gt;; Msg&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rcx, [rbx+&lt;span class=&quot;cpp-literal&quot;&gt;8&lt;/span&gt;]        &lt;span class=&quot;cpp-comment&quot;&gt;; hWnd&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; DefWindowProcA&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rsp, 38h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;ret&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MyRegisterClass:  &lt;span class=&quot;cpp-comment&quot;&gt;; proc hInst : qword&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;sub&lt;/span&gt; rsp, 28h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.cbSize, sizeof WNDCLASSEX&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;, CS_VREDRAW&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;, CS_HREDRAW&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.style, &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rax, WndProc&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.lpfnWndProc, rax&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.cbClsExtra, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.cbWndExtra, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.hInstance, rcx&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.hIcon, NULL&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.hCursor, NULL&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.hbrBackground, COLOR_WINDOW&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.lpszMenuName, IDC_MENU&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rax, szWindowClass&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.lpszClassName, rax&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; wndclass.hIconSm, NULL&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rcx, wndclass&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; RegisterClassExA&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rsp, 28h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;ret&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;InitInstance: &lt;span class=&quot;cpp-comment&quot;&gt;; proc hInst : qword&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;sub&lt;/span&gt; rsp, 78h      &lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rax, CW_USEDEFAULT&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; rbx, rbx&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+58h], rbx            &lt;span class=&quot;cpp-comment&quot;&gt;; lpParam&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+50h], rcx            &lt;span class=&quot;cpp-comment&quot;&gt;; hInstance&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+48h], rbx            &lt;span class=&quot;cpp-comment&quot;&gt;; hMenu = NULL&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+40h], rbx            &lt;span class=&quot;cpp-comment&quot;&gt;; hWndParent = NULL&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+38h], rbx            &lt;span class=&quot;cpp-comment&quot;&gt;; Height&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+30h], rax            &lt;span class=&quot;cpp-comment&quot;&gt;; Width&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+28h], rbx            &lt;span class=&quot;cpp-comment&quot;&gt;; Y&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; [rsp+20h], rax            &lt;span class=&quot;cpp-comment&quot;&gt;; X&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; r9d, WS_OVERLAPPEDWINDOW  &lt;span class=&quot;cpp-comment&quot;&gt;; dwStyle&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; r8, szTitle               &lt;span class=&quot;cpp-comment&quot;&gt;; lpWindowName&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rdx, szWindowClass        &lt;span class=&quot;cpp-comment&quot;&gt;; lpClassName&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;                  &lt;span class=&quot;cpp-comment&quot;&gt;; dwExStyle&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; CreateWindowExA&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; hWnd, rax&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; edx, SW_SHOW&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rcx, hWnd&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; ShowWindow&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rax, hWnd                 &lt;span class=&quot;cpp-comment&quot;&gt;; set return value&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rsp,78h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;ret&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Main proc&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;sub&lt;/span&gt; rsp, 28h&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; rcx, rcx  &lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; GetModuleHandleA&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; hInstance, rax&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rcx, rax&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; MyRegisterClass&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;test&lt;/span&gt; rax, rax&lt;br /&gt;jz @close              &lt;span class=&quot;cpp-comment&quot;&gt;; if the RegisterClassEx fails, exit &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;mov&lt;/span&gt; rcx, hInstance&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; InitInstance&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;test&lt;/span&gt; rax, rax&lt;br /&gt;jz @close              &lt;span class=&quot;cpp-comment&quot;&gt;; if the InitInstance fails, exit &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;@handlemsgs:             &lt;span class=&quot;cpp-comment&quot;&gt;; message processing routine&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; r9d, r9d        &lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; r8d, r8d&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; edx, edx&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rcx, wmsg&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; GetMessageA&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;&lt;br /&gt;jz @close&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rcx, wmsg&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; TranslateMessage&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rcx, wmsg&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; DispatchMessageA&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;jmp&lt;/span&gt; @handlemsgs&lt;br /&gt;&lt;br /&gt;@close:&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt; &lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; ExitProcess&lt;br /&gt;Main endp&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;As you can see, I tried to stay as low level as I could. The reason why I avoided for other functions other than the main the proc macro is that the ml64 puts a prologue end an epilogue, which I didn&#39;t want, by itself. Avoiding the macro made it possible to define my own stack frame without any intermission by the compiler. The first thing to notice scrolling this code is the structure:&lt;/p&gt;&lt;pre lang=&quot;asm&quot;&gt;MSG struct   &lt;br /&gt;hwnd              dq      ?&lt;br /&gt;message           dd      ?&lt;br /&gt;padding1          dd      ?      &lt;span class=&quot;cpp-comment&quot;&gt;; padding&lt;/span&gt;&lt;br /&gt;wParam            dq      ?&lt;br /&gt;lParam            dq      ?&lt;br /&gt;time              dd      ?&lt;br /&gt;pt                POINT   &lt;&lt;span class=&quot;cpp-comment&quot;&gt;;&gt;&lt;/span&gt;&lt;br /&gt;padding2          dd      ?      &lt;span class=&quot;cpp-comment&quot;&gt;; padding&lt;/span&gt;&lt;br /&gt;MSG ends&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;It requires two paddings which the x86 declaration of the same structure didn&#39;t. The reason, in a few words, is that qword members should be aligned to qword boundaries (this for the first padding). The additional padding at the end of the structure follows the rule that: every structure should be aligned to its largest member. So, being its largest member a qword, the structure should be aligned to an 8-byte boundary. &lt;/p&gt; &lt;p&gt;To compile this sample, the command line is:&lt;/p&gt;&lt;pre lang=&quot;text&quot;&gt;ml64 c:\myapp\test.asm /link /subsystem:windows&lt;br /&gt; /defaultlib:C:\WinDDK\6000\lib\wnet\amd64\kernel32.lib&lt;br /&gt; /defaultlib:C:\WinDDK\6000\lib\wnet\amd64\user32.lib&lt;br /&gt; /entry:Main c:\myapp\test.res&lt;/pre&gt; &lt;p&gt;test.res is a file I took from a VC++ wizard project, I was too lazy to make on by myself. Anyway, making a resource file is very easy with the VC++, but no one forbids you to use the notepad, it just takes more time. To compile the resource file all you need to do is to use the command line: &quot;rc test.rc&quot;.&lt;/p&gt; &lt;p&gt;I think the rest of the code is pretty easy to understand. I didn&#39;t cover everything with this paragraph, but now you should have quite a good insight into x64 assembly. Let&#39;s move on.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;C/C++_Programming&quot;&gt;C/C++ Programming&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Writing x64 compatible code in C/C++ is very easy. All what it takes is to follow some basic rules. The most common mistake that make that makes 99% of the old 32bit sources uncompatible is wrong casting. For Instance:&lt;/p&gt;&lt;pre&gt;ptr1 = (DWORD) (sizoef (x) + ptr2);  &lt;span class=&quot;cpp-comment&quot;&gt;// &lt;-- WRONG!&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;This line of code assumes that pointers are 32bit long, but on x64 pointers are 64bit long and the line of code above basically truncates the pointer making it invalid. So, always cast like this:&lt;/p&gt;&lt;pre&gt;ptr1 = (ULONG_PTR) (sizoef (x) + ptr2);  &lt;-- RIGHT!&lt;/pre&gt; &lt;p&gt;It doesn&#39;t matter if you use ULONG_PTR, LONG_PTR, DWORD_PTR or whatever. The important thing is that you use one of these defines (or directly by pointer type: (void *)).&lt;/p&gt; &lt;p&gt;Keep in mind that all handles and handle derivates are qwords. HANDLE, HKEY, HICON, HBITMAP, HINSTANCE, HMODULE, HWND etc. etc. These are all 64bit long, even though they&#39;re not all the same handle (HINSTANCE, for example, is just a pointer, not a real handle). Even WPARAM and LPARAM are now 64bit long. There&#39;s no rule to follow, just don&#39;t assume these types are 32 or 64bit long: write code that is compatible with both conditions:&lt;/p&gt;&lt;pre&gt;HWND *hWndArray = (HWND *) malloc(&lt;span class=&quot;cpp-keyword&quot;&gt;sizeof&lt;/span&gt; (DWORD) * n);  &lt;-- WRONG!&lt;/pre&gt; &lt;p&gt;Instead write:&lt;/p&gt;&lt;pre&gt;HWND *hWndArray = (HWND *) malloc(&lt;span class=&quot;cpp-keyword&quot;&gt;sizeof&lt;/span&gt; (HWND) * n);  &lt;-- RIGHT!&lt;/pre&gt; &lt;p&gt;As you can see this isn&#39;t a rule, just good sense.&lt;/p&gt; &lt;p&gt;The defines to use for writing architecture-dependent code are:&lt;/p&gt; &lt;table border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;41%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;_M_IX86 &lt;/code&gt;&lt;/td&gt; &lt;td&gt;x86 code only.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;_M_AMD64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;x64 code only.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;_M_IA64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Itanium code only.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;_WIN32&lt;/code&gt;&lt;/td&gt; &lt;td&gt;32bit code (x86, maybe ARM for WINCE).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;_WIN64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;64bit code (x64, Itanium).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;if you want to write, for example, a piece of code for x86 only, you could write:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#ifdef _M_IX86&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// x86 only code&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#endif&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;Now that you know all the rules, you just have to compile your project for x64. Keep in mind that every project in VC++ (nowadays) starts with a x86 configuration: it&#39;s your job to add a project configuration to the project, but don&#39;t worry it&#39;s very easy. All you have to do is open the configuration manager (Build -&gt; Configuration Manager) and then under &quot;Active solution platform&quot; click New, just like this:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/configmanager.jpg&quot; border=&quot;0&quot; height=&quot;378&quot; width=&quot;600&quot; /&gt;&lt;/p&gt; &lt;p&gt;A dialog box will pop up where you can choose the new platform which for to create a new project configuration. There&#39;s nothing more to do, except to build.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Inline_Assembly&quot;&gt;Inline Assembly&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Bad news! Microsoft completely removed the support for inline assembly in C/C++, both for user and kernel mode. If you try to compile a code sample like this on x64/Itanium: &lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &quot;stdafx.h&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;windows.h&gt;&lt;/windows.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; _tmain(&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt; __asm &lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;3&lt;/span&gt;;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;It will give you more than just one error. Being the __asm keyword no longer supported, the __naked declspec was removed as well (since it doesn&#39;t make sense without inline assembly).&lt;/p&gt; &lt;p&gt;Now, prepare for the good news. Before you start thinking about using external asm files or stuff like that, you should know that the VC++ offers some very powerful assembly intrinsics. The header to include to use these intrinsics is &quot;intrin.h&quot;. Let&#39;s take for a code sample the intrinsics _ReturnAddress() and _AddressOfReturnAddress(). The first one gives us the return address of the current function and the second one the address of the return address itself. Let&#39;s analyze this little code sample that I took from the MSDN:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; _tmain(&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;void&lt;/span&gt;* pvAddressOfReturnAddress = _AddressOfReturnAddress();&lt;br /&gt; printf_s(&lt;span class=&quot;cpp-string&quot;&gt;&quot;%p\n&quot;&lt;/span&gt;, pvAddressOfReturnAddress);&lt;br /&gt; printf_s(&lt;span class=&quot;cpp-string&quot;&gt;&quot;%p\n&quot;&lt;/span&gt;, *((&lt;span class=&quot;cpp-keyword&quot;&gt;void&lt;/span&gt;**) pvAddressOfReturnAddress));&lt;br /&gt; printf_s(&lt;span class=&quot;cpp-string&quot;&gt;&quot;%p\n&quot;&lt;/span&gt;, _ReturnAddress());&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;The second and the third printf_s will show the same output, since both display the return address of the current function. These intrinsics are very powerful, and nothing can stop us from doing some of the old tricks we did with inline assembly. For instance, having the address of the return address could give me the possibility of changing it and making the function return somewhere else. Let&#39;s try that:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;ULONG_PTR OldAddress = &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;void&lt;/span&gt; f1()&lt;br /&gt;{&lt;br /&gt; printf_s(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Hello there!\n&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt; ULONG_PTR *pAddressOfReturnAddress = (ULONG_PTR *)&lt;br /&gt;     _AddressOfReturnAddress();&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (OldAddress == &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;)&lt;br /&gt; {&lt;br /&gt;     OldAddress = *pAddressOfReturnAddress;&lt;br /&gt;     *pAddressOfReturnAddress =  (ULONG_PTR) &amp;f1;&lt;br /&gt; }&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;else&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;     *pAddressOfReturnAddress = OldAddress;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;The output of this function is:&lt;/p&gt;&lt;pre lang=&quot;text&quot;&gt;&lt;b&gt;Hello there!&lt;br /&gt;Hello there!&lt;/b&gt;&lt;/pre&gt; &lt;p&gt;That&#39;s because, as you can see from the code, I changed the return address of the current function making it execute again. I put a condition to make it execute again just once, otherwise it would have brought to an endless loop. An important thing to know is that this sample works in Release mode only if you disable code optimization, otherwise the VC++ will remove the line of code which sets the new return address. I&#39;m sure there are ways to trick the VC++ not to do this, but the problem is that if the function is called just by one caller like this one, the VC++ will put the code of the function directly in the caller one, so setting a new return address under these conditions is a bit risky. Disabling optimization is, I believe, the safest way to act.&lt;/p&gt; &lt;p&gt;Enough of this trivia. Here&#39;s a list of the intrinsics for x64 taken from the MSDN (many of them are supported on x86 as well):&lt;/p&gt; &lt;table bordercolordark=&quot;#000000&quot; bordercolorlight=&quot;#000000&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_AddressOfReturnAddress&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Provides the address of the memory location that holds the return address of the current function. This address may not be used to access other memory locations (for example, the function&#39;s arguments).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__addgsbyte, __addgsword, __addgsdword, __addgsqword&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Add a value to a memory location specified by an offset relative to the beginning of the &lt;b&gt;GS&lt;/b&gt; segment.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__assume&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Passes a hint to the optimizer. &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_BitScanForward, _BitScanForward64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Search the mask data from least significant bit (LSB) to the most significant bit (MSB) for a set bit (1).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_BitScanReverse, _BitScanReverse64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Search the mask data from most significant bit (MSB) to least significant bit (LSB) for a set bit (1).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_bittest, _bittest64 &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;bt&lt;/b&gt; instruction, which examines the bit in position b of address a, and returns the value of that bit.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_bittestandcomplement, _bittestandcomplement64 &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generate the &lt;b&gt;btc&lt;/b&gt; instruction, which examines bit b of the address a, returns its current value, and sets the bit to its complement.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_bittestandreset, _bittestandreset64 &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generate the &lt;b&gt;btr&lt;/b&gt; instruction, which examines bit b of the address a, returns its current value, and resets the bit to 0.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_bittestandset, _bittestandset64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generate the &lt;b&gt;bts&lt;/b&gt; instruction, which examines bit b of the address a, returns its current value, and sets the bit to 1.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__debugbreak&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Causes a breakpoint in your code, where the user will be prompted to run the debugger.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_disable &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Disables interrupts.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__emul, __emulu&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Performs multiplications that overflow what a 32-bit integer can hold.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_enable&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Enables interrupts.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__faststorefence&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Guarantees that every preceding store is globally visible before any subsequent store.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__getcallerseflags&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Returns the EFLAGS value from the caller&#39;s context.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__inbyte&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;in&lt;/b&gt; instruction, returning one byte read from the port specified by Port.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__inbytestring&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Reads data from the specified port using the &lt;b&gt;rep insb&lt;/b&gt; instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__incgsbyte, __incgsword, __incgsdword, __incgsqword&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Add one to the value at a memory location specified by an offset relative to the beginning of the &lt;b&gt;GS&lt;/b&gt; segment.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__indword&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Reads one double word of data from the specified port using the &lt;b&gt;in&lt;/b&gt; instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__indwordstring&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Reads data from the specified port using the &lt;b&gt;rep insd&lt;/b&gt; instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__int2c&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;int 2c&lt;/b&gt; instruction, which triggers the &lt;b&gt;2c&lt;/b&gt; interrupt.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedAnd, _InterlockedAnd64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Used to perform an atomic AND operation on a variable shared by multiple threads.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_interlockedbittestandreset, _interlockedbittestandreset64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generate the &lt;b&gt;lock_btr&lt;/b&gt; instruction, which examines bit b of the address a and returns its current value.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_interlockedbittestandset, _interlockedbittestandset64 &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generate the &lt;b&gt;lock_bts&lt;/b&gt; instruction, which examines bit b of the address a and returns its current value.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedCompareExchange, _InterlockedCompareExchange64, _InterlockedCompare64Exchange128, _InterlockedCompare64Exchange128_acq, _InterlockedCompare64Exchange128_rel &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Provides compiler intrinsic support for the Win32 Platform SDK InterlockedCompareExchange function.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedCompareExchangePointer&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Perform an atomic exchange operation, which copies the address passed in as the second argument to the first and returns the original address of the first.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedDecrement, _InterlockedDecrement64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Provides compiler intrinsic support for the Win32 Platform SDK InterlockedDecrement function.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedExchange, _InterlockedExchange64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Provide compiler intrinsic support for the Win32 Platform SDK InterlockedExchange function.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedExchangeAdd, _InterlockedExchangeAdd64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Provide compiler intrinsic support for the Win32 Platform SDK _InterlockedExchangeAdd Intrinsic Functions function.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedExchangePointer&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Perform an atomic exchange operation, which copies the address passed in as the second argument to the first and returns the original address of the first.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedIncrement, _InterlockedIncrement64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Provide compiler intrinsic support for the Win32 Platform SDK InterlockedIncrement function.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedOr, _InterlockedOr64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Perform an atomic operation (in this case, the &lt;b&gt;OR&lt;/b&gt; operation) on a variable shared by multiple threads.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_InterlockedXor, _InterlockedXor64&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Used to perform an atomic operation (in this case, the exclusive or &lt;b&gt;XOR&lt;/b&gt; operation) on a variable shared by multiple threads.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__invlpg &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the x86 &lt;b&gt;invlpg&lt;/b&gt; instruction, which invalidates the translation lookaside buffer (TLB) for the page associated with memory pointed to by Address.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__inword&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Reads data from the specified port using the &lt;b&gt;in&lt;/b&gt; instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__inwordstring&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Reads data from the specified port using the &lt;b&gt;rep insw&lt;/b&gt; instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__ll_lshift &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Shifts a 64-bit value specified by the first parameter to the left by a number of bits specified by the second parameter.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__ll_rshift &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Shifts a 64-bit value specified by the first parameter to the right by a number of bits specified by the second parameter.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__load128, __load128_acq &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Loads a 128-bit value atomically.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_cvtsd_si64x&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the x64 extended form of the Convert Scalar Double-Precision Floating-Point Value to 64-Bit Integer (&lt;b&gt;cvtsd2si&lt;/b&gt;) instruction, which takes the double in the first element of value and converts it to a 64-bit integer.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_cvtsi128_si64x &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the x64 extended form of the &lt;b&gt;movd&lt;/b&gt; instruction, which extracts the low 64-bit integer from an &lt;b&gt;__m128i&lt;/b&gt; structure.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_cvtsi64x_sd &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the Convert Double Word Integer to Scalar Double-Precision Floating-Point Value (&lt;b&gt;cvtsi2sd&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_cvtsi64x_si128 &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the x64 extended form of the &lt;b&gt;movd&lt;/b&gt; instruction, which copies a 64-bit value to a &lt;b&gt;__m128i&lt;/b&gt; structure, which represents an XMM register.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_cvtsi64x_ss &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the x64 extended version of the Convert 64-Bit Integer to Scalar Single-Precision Floating-Point Value (&lt;b&gt;cvtsi2ss&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_cvtss_si64x&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the x64 extended version of the Convert Scalar Single Precision Floating Point Number to 64-bit Integer (&lt;b&gt;cvtss2si&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_cvttsd_si64x&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the x64 extended version of the Convert with Truncation Scalar Double-Precision Floating-Point Value to 64-Bit Integer (&lt;b&gt;cvttsd2si&lt;/b&gt;) instruction, which takes the first double in the input structure of packed doubles, converts it to a 64-bit integer, and returns the result. &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_cvttss_si64x&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Emits the x64 extended version of the Convert with Truncation Single-Precision Floating-Point Number to 64-Bit Integer (&lt;b&gt;cvttss2si&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_set_epi64x&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Returns the &lt;b&gt;__m128i&lt;/b&gt; structure with its two 64-bit integer values initialized to the values of the two 64-bit integers passed in.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_set1_epi64x&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Provides a way to initialize the two 64-bit elements of the &lt;b&gt;__m128i&lt;/b&gt; structure with two identical integers.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_setl_epi64 &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Returns the lower 64 bits of source argument in the lower 64 bits of the result.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_mm_stream_si64x&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Writes the data in Source to a memory location specified by Dest, without polluting the caches.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__movsb &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates a Move String (&lt;b&gt;rep movsb&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__movsd &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates a Move String (&lt;b&gt;rep movsd&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__movsq&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates a repeated Move String (&lt;b&gt;rep movsq&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__movsw&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates a Move String (&lt;b&gt;rep movsw&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__mul128&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Multiplies two 64-bit integers passed in as the first two arguments and puts the high 64 bits of the product in the 64-bit integer pointed to by HighProduct and returns the low 64 bits of the product.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__mulh &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Returns the high 64 bits of the product of two 64-bit signed integers.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__outbyte&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;out&lt;/b&gt; instruction, which sends 1 byte specified by Data out the I/O port specified by Port.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__outbytestring&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;rep outsb&lt;/b&gt; instruction,which sends the first Count bytes of data pointed to by Buffer to the port specified by Port.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__outdword&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;out&lt;/b&gt; instruction to send a doubleword Data out the port Port.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__outdwordstring&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;rep outsd &lt;/b&gt;instruction, which sends Count doublewords starting at Buffer out the I/O port specified by Port.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__rdtsc&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;rdtsc&lt;/b&gt; instruction, which returns the processor time stamp. The processor time stamp records the number of clock cycles since the last reset.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_ReadBarrier&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Forces memory reads to complete.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__readcr0, __readcr2, __readcr3, __readcr4, __readcr8 &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Read the control registers. These intrinsics are only available in kernel mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__readfsbyte, __readfsdword, __readfsqword, __readfsword&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Read memory from a location specified by an offset relative to the beginning of the FS segment. These intrinsics are only available in kernel mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__readgsbyte, __readgsdword, __readgsqword, __readgsword &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Read memory from a location specified by an offset relative to the beginning of the GS segment. These intrinsics are only available in kernel mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__readmsr&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;rdmsr&lt;/b&gt; instruction, which reads the model-specific register specified by register and returns its value. This function may only be used in kernel mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__readpmc&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the &lt;b&gt;rdpmc&lt;/b&gt; instruction, which reads the performance monitoring counter specified by counter.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_ReadWriteBarrier&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Effectively blocks an optimization of reads and writes to global memory.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_ReturnAddress&lt;/code&gt;&lt;/td&gt; &lt;td&gt;The &lt;b&gt;_ReturnAddress&lt;/b&gt; intrinsic provides the address of the instruction in the calling function that will be executed after control returns to the caller.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__shiftleft128&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Shifts a 128-bit quantity, represented as two 64-bit quantities LowPart and HighPart, to the left by a number of bits specified by Shift and returns the high 64 bits of the result.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__shiftright128&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Shifts a 128-bit quantity, represented as two 64-bit quantities LowPart and HighPart, to the right by a number of bits specified by Shift and returns the low 64 bits of the result.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__store128, __store128_rel&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Stores a 128-bit value atomically.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__stosb &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates a store string instruction (&lt;b&gt;rep stosb&lt;/b&gt;).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__stosd&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates a store string instruction (&lt;b&gt;rep stosd&lt;/b&gt;).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__stosq&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates a store string instruction (&lt;b&gt;rep stosq&lt;/b&gt;).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__stosw&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates a store string instruction (&lt;b&gt;rep stosw&lt;/b&gt;).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__ull_rshift&lt;/code&gt;&lt;/td&gt; &lt;td&gt;on x64, shifts a 64-bit value specified by the first parameter to the right by a number of bits specified by the second parameter.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_umul128&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Multiplies two 64-bit unsigned integers passed in as the first two arguments and puts the high 64 bits of the product in the 64-bit unsigned integer pointed to by HighProduct and returns the low 64 bits of the product.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__umulh &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Return the high 64 bits of the product of two 64-bit unsigned integers.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__wbinvd&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the Write Back and Invalidate Cache (&lt;b&gt;wbinvd&lt;/b&gt;) instruction.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;_WriteBarrier&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Forces memory writes to complete and be correct according to program logic at the point of the call.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__writecr0, __writecr3, __writecr4, __writecr8&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Write the control registers. These intrinsics are only available in kernel mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__writefsbyte, __writefsdword, __writefsqword, __writefsword &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Write memory to a location specified by an offset relative to the beginning of the FS segment. These intrinsics are only available in kernel mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__writegsbyte, __writegsdword, __writegsqword, __writegsword &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Write memory to a location specified by an offset relative to the beginning of the GS segment. These intrinsics are only available in kernel mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;289&quot;&gt;&lt;code&gt;__writemsr&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Generates the Write to Model Specific Register (&lt;b&gt;wrmsr&lt;/b&gt;) instruction. This function may only be used in kernel mode.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;There are also some 3D intrinsics (called 3DNow) which will be useful for game/3D coders. I left those intrinsics out of the list since they were too many and you&#39;d need to include another header file to use them: &quot;mm3dnow.h&quot;.&lt;/p&gt; &lt;p&gt;If these intrinsics are not enough, you might need to use an external asm file. On the other hand, if you&#39;re really lazy and you just need something on the fly, there&#39;s a quick way to embed assembly code in your C/C++ files. &lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &quot;stdafx.h&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;windows.h&gt;&lt;/windows.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;char&lt;/span&gt; BitSwapAsm[&lt;span class=&quot;cpp-literal&quot;&gt;7&lt;/span&gt;] =&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0x48&lt;/span&gt;, &lt;span class=&quot;cpp-literal&quot;&gt;0x8B&lt;/span&gt;, &lt;span class=&quot;cpp-literal&quot;&gt;0xC1&lt;/span&gt;,        &lt;span class=&quot;cpp-comment&quot;&gt;// mov rax, rcx&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0x48&lt;/span&gt;, &lt;span class=&quot;cpp-literal&quot;&gt;0x0F&lt;/span&gt;, &lt;span class=&quot;cpp-literal&quot;&gt;0xC8&lt;/span&gt;,        &lt;span class=&quot;cpp-comment&quot;&gt;// bswap rax&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0xC3&lt;/span&gt;            &lt;span class=&quot;cpp-comment&quot;&gt;// retn&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;__int64 (*BitSwap)(__int64 Value) =  (__int64 (*)(__int64))&lt;br /&gt;                                                  (ULONG_PTR) BitSwapAsm;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; _tmain(&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// I have to change the page protection, otherwise the code would crash&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; DWORD dwOldProtect;&lt;br /&gt; VirtualProtect(BitSwap, &lt;span class=&quot;cpp-keyword&quot;&gt;sizeof&lt;/span&gt; (BitSwapAsm), PAGE_EXECUTE_READWRITE,&lt;br /&gt;                &amp;dwOldProtect);&lt;br /&gt;&lt;br /&gt; printf_s(&lt;span class=&quot;cpp-string&quot;&gt;&quot;%p\n&quot;&lt;/span&gt;, BitSwap(&lt;span class=&quot;cpp-literal&quot;&gt;0xDDCCBBAA&lt;/span&gt;));&lt;br /&gt; getchar();&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;This code relies on function pointers and I had to change the page protection flags in order to make it execute. It&#39;s really a dumb method, but in some case it could be time saving. &lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Windows_On_Windows&quot;&gt;Windows On Windows&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Of course, compatibility for 32bit applications has to be provided on x64 (and Itanium as well) and this is what WOW64 (Windows on Windows 64) is all about. When we look at the modules loaded by a 32bit application with a 32bit version of the &lt;a href=&quot;http://www.ntcore.com/exsuite.php&quot;&gt;Task Explorer&lt;/a&gt; we see this:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/modules32.jpg&quot; border=&quot;0&quot; height=&quot;337&quot; width=&quot;600&quot; /&gt;&lt;/p&gt; &lt;p&gt;Seems pretty regular, except, of course, for the system files path, which in our case is syswow64 instead of the old common System32. It&#39;s easy to understand why it is this way: the System32 folder is now reserved for the 64bit environment and the 32bit files had to be placed somewhere else. But look what happens when I open the same process with an x64 version of the Task Explorer:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/modules64.jpg&quot; border=&quot;0&quot; height=&quot;73&quot; width=&quot;600&quot; /&gt;&lt;/p&gt; &lt;p&gt;Suddenly, all the 32bit modules are gone and what remains are the WOW64 emulation modules. Here&#39;s the description the MSDN gives us of these modules:&lt;/p&gt; &lt;table bgcolor=&quot;#e1e1f2&quot; border=&quot;0&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;The WOW64 emulator runs in user mode, provides an interface between the 32-bit version of Ntdll.dll and the kernel of the processor, and it intercepts kernel calls. The emulator consists of the following DLLs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Wow64.dll provides the core emulation infrastructure and the thunks for the Ntoskrnl.exe entry-point functions.  &lt;/li&gt;&lt;li&gt;Wow64Win.dll provides thunks for the Win32k.sys entry-point functions.  &lt;/li&gt;&lt;li&gt;Wow64Cpu.dll provides x86 instruction emulation on Itanium processors. It executes mode-switch instructions on the processor. This DLL is not necessary for x64 processors because they execute x86-32 instructions at full clock speed. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Along with the 64-bit version of Ntdll.dll, these are the only 64-bit binaries that can be loaded into a 32-bit process.At startup, Wow64.dll loads the x86 version of Ntdll.dll and runs its initialization code, which loads all necessary 32-bit DLLs. Almost all 32-bit DLLs are unmodified copies of 32-bit Windows binaries. However, some of these DLLs are written to behave differently on WOW64 than they do on 32-bit Windows [...].&lt;/p&gt; &lt;p&gt;Instead of using the x86 system-service call sequence, 32-bit binaries that make system calls are rebuilt to use a custom calling sequence. This new sequence is inexpensive for WOW64 to intercept because it remains entirely in user mode. When the new calling sequence is detected, the WOW64 CPU transitions back to native 64-bit mode and calls into Wow64.dll. Thunking is done in user mode to reduce the impact on the 64-bit kernel, and to reduce the risk of a bug in the thunk that causes a kernel-mode crash, data corruption, or a security hole. The thunks extract arguments from the 32-bit stack, extend them to 64 bits, then make the native system call.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;32bit applications have a maximal 2GB space (4GB if explicitly required) and the rest of the space is handled by the system. This doesn&#39;t change much of course, since on x86 user mode applications had 2GB of virtual memory space out of 4GB (the other 2GB were reserved for kernel mode). On x64 these two other GB can now be accessed by 32bit applications. In order to achieve this, the &lt;code&gt;IMAGE_FILE_LARGE_ADDRESS_AWARE &lt;/code&gt;flag has to be set in the File Header&#39;s Characteristics field. You can do this programmatically or manually with a normal PE editor like the &lt;a href=&quot;http://www.ntcore.com/exsuite.php&quot;&gt;CFF Explorer&lt;/a&gt;, just like this:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/largeaddress.jpg&quot; border=&quot;0&quot; height=&quot;506&quot; width=&quot;518&quot; /&gt;&lt;/p&gt; &lt;p&gt;I&#39;ve seen this done by 3D-games players in order to increase performances. Of course, it&#39;s only useful for very heavy memory consuming applications. &lt;/p&gt; &lt;p&gt;A very useful function to determine whether a process is running under WOW64 or not is:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;BOOL IsWow64Process(&lt;br /&gt;HANDLE hProcess,   &lt;span class=&quot;cpp-comment&quot;&gt;// [in] Handle to a process. &lt;/span&gt;&lt;br /&gt;PBOOL Wow64Process &lt;span class=&quot;cpp-comment&quot;&gt;// [out] Pointer to a value that is set to TRUE if the &lt;/span&gt;&lt;br /&gt;                  &lt;span class=&quot;cpp-comment&quot;&gt;// process is running under WOW64. Otherwise, the value &lt;/span&gt;&lt;br /&gt;                  &lt;span class=&quot;cpp-comment&quot;&gt;// is set to FALSE. &lt;/span&gt;&lt;br /&gt;);&lt;/pre&gt; &lt;p&gt;The work done by Wow64Cpu.dll on x64 is zero, because x64 supports x86 natively. I was first tempted to look how the calling sequence works in order to make one myself and provide a way to use x86 components from x64 in the same address space, but, on second thought, even if it could be implemented, it wouldn&#39;t work on Itanium. And this brings us to one of the next paragraphs, because under normal conditions a 32bit application cannot load a 64bit dll and a 64bit application cannot load a 32bit dll. So, interprocess communication becomes an important aspect on 64bit systems. Anyway, before that, I have to talk about file system and registry redirection, since they are strictly related to WOW64, but deserve an extra paragraph for their importance. &lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;File_System_And_Registry_Redirection&quot;&gt;File System And Registry Redirection&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Since the System32 path is reserved to 64bit files, any time a 32bit application tries to access this directory it is redirected to SysWow64 one. However, there are some subdirectories of System32 that are shared between 32bit and 64bit applications and so no redirection is needed. These subdirectories are:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;%windir%\system32\catroot  &lt;/li&gt;&lt;li&gt;%windir%\system32\catroot2  &lt;/li&gt;&lt;li&gt;%windir%\system32\drivers\etc  &lt;/li&gt;&lt;li&gt;%windir%\system32\logfiles  &lt;/li&gt;&lt;li&gt;%windir%\system32\spool &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Also, there are some functions related to the WOW64 file system redirection:&lt;/p&gt; &lt;table border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width=&quot;237&quot;&gt;&lt;code&gt;GetSystemWow64Directory&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Retrieves the path of the system directory used by WOW64. This directory is not present on 32-bit Windows.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;237&quot;&gt;&lt;code&gt;Wow64DisableWow64FsRedirection&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Disables file system redirection for the calling thread. File system redirection is enabled by default.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;237&quot;&gt;&lt;code&gt;Wow64EnableWow64FsRedirection&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Enables or disables file system redirection for the calling thread. This function may not work reliably when there are nested calls. Therefore, this function has been replaced by the Wow64DisableWow64FsRedirection and Wow64RevertWow64FsRedirection functions.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;237&quot;&gt;&lt;code&gt;Wow64RevertWow64FsRedirection&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Restores file system redirection for the calling thread.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;I think it&#39;s easy to understand how to use these functions. However, I add a little code sample (you can find almost the same one on the MSDN):&lt;/p&gt;&lt;div class=&quot;smallText&quot; id=&quot;premain19&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;19&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg19&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;19&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse19&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre19&quot; lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; _tmain(&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt; BOOL bIsWOW64Enabled;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (IsWow64Process(GetCurrentProcess(), &amp;bIsWOW64Enabled))&lt;br /&gt; {&lt;br /&gt;     &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (bIsWOW64Enabled == TRUE) &lt;span class=&quot;cpp-comment&quot;&gt;// we run under WOW64&lt;/span&gt;&lt;br /&gt;     {&lt;br /&gt;         PVOID pOldValue;&lt;br /&gt;         DWORD FileSize;&lt;br /&gt;&lt;br /&gt;         HANDLE hFile = CreateFile(_T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;c:\\windows\\system32\\notepad.exe&quot;&lt;/span&gt;),&lt;br /&gt;             GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, NULL);&lt;br /&gt;&lt;br /&gt;         FileSize = GetFileSize(hFile, NULL);&lt;br /&gt;&lt;br /&gt;         CloseHandle(hFile);&lt;br /&gt;&lt;br /&gt;         _tprintf(_T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;File Size: %d Bytes\n&quot;&lt;/span&gt;), FileSize);&lt;br /&gt;&lt;br /&gt;         Wow64DisableWow64FsRedirection(&amp;pOldValue); &lt;span class=&quot;cpp-comment&quot;&gt;// disable redirection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         hFile = CreateFile(_T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;c:\\windows\\system32\\notepad.exe&quot;&lt;/span&gt;),&lt;br /&gt;                            GENERIC_READ, FILE_SHARE_READ, NULL,&lt;br /&gt;                            OPEN_EXISTING, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, NULL);&lt;br /&gt;&lt;br /&gt;         FileSize = GetFileSize(hFile, NULL);&lt;br /&gt;&lt;br /&gt;         CloseHandle(hFile);&lt;br /&gt;&lt;br /&gt;         _tprintf(_T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;File Size: %d Bytes\n&quot;&lt;/span&gt;), FileSize);&lt;br /&gt;&lt;br /&gt;         Wow64RevertWow64FsRedirection(pOldValue);  &lt;span class=&quot;cpp-comment&quot;&gt;// restore redirection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         getchar();&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;The output of this program is:&lt;/p&gt;&lt;pre lang=&quot;text&quot;&gt;&lt;b&gt;File Size: 151040 Bytes&lt;br /&gt;File Size: 169472 Bytes&lt;/b&gt;&lt;/pre&gt; &lt;p&gt;The file size changes because one time the program opens the 32bit notepad and one time the 64bit one. Of course, remember when you&#39;re using these functions, always use them along with GetProcAddress, otherwise your code won&#39;t work on older systems which don&#39;t provide them.&lt;/p&gt; &lt;p&gt;Let&#39;s move on to the registry. As for the file system the registry is being redirected as well, or better some keys of it. These keys are:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\Software  &lt;/li&gt;&lt;li&gt;HKEY_USERS\*\Software\Classes  &lt;/li&gt;&lt;li&gt;HKEY_USERS\*_Classes &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;You can find every one of these keys duplicated for 32bit applications in their WOW node: any of these keys has a subkey called Wow6432Node, which contains a duplicate of the parent key. For instance:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/wownode.jpg&quot; border=&quot;0&quot; height=&quot;306&quot; width=&quot;241&quot; /&gt;&lt;/p&gt; &lt;p&gt;Some of these WOW64 redirected keys have subkeys which are reflected. Reflection in this case means that when I change a reflected key in the 32bit node the change is being &lt;i&gt;reflected&lt;/i&gt; on the 64bit key as well and viceversa. This is necessary, because some keys need to remain in synch. This is quite different from just sharing the keys between 64bit and 32bit mode, because the reflection can be filtered and also disabled. These are the reflected keys:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\Software\Classes  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\Software\Microsoft\COM3  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\Software\Microsoft\EventSystem  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\Software\Microsoft\Ole  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc  &lt;/li&gt;&lt;li&gt;HKEY_USERS\*\Software\Classes  &lt;/li&gt;&lt;li&gt;HKEY_USERS\*_Classes &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The functions to handle reflection are:&lt;/p&gt; &lt;table border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegQueryReflectionKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Determines whether reflection has been disabled or enabled for the specified key.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegDisableReflectionKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Disables registry reflection for the specified key. Disabling reflection for a key does not affect reflection of any subkeys.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegEnableReflectionKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Restores registry reflection for the specified disabled key. Restoring reflection for a key does not affect reflection of any subkeys.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;They work just like the WOW64 file system functions, so I don&#39;t think a code sample is necessary. There are also some shared keys between 64bit and 32bit applications:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Classes\HCP  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\Current  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\Readers  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Services  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\SystemShared  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIP  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DFS  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Driver Signing  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EnterpriseCertificates  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Non-Driver Signing  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RAS  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Software\Microsoft\Shared Tools\MSInfo  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TermServLicensing  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Transaction Server  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDpi  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontMapper  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Cursors\Schemes  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OC Manager  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Locations  &lt;/li&gt;&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Policies &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;As said, these keys are shared, so any change made to them will affect both 32bit and 64bit applications, and there&#39;s no way to avoid this like for reflected keys.&lt;/p&gt; &lt;p&gt;But what if a 32bit applications wants to access the 64bit registry or viceversa? Don&#39;t worry! As I discovered when I was dealing with the same problem, Microsoft provides a very simple way to do the job. The flags KEY_WOW64_64KEY and KEY_WOW64_32KEY can be used with these functions: RegCreateKeyEx, RegDeleteKeyEx and RegOpenKeyEx.&lt;/p&gt; &lt;table border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width=&quot;152&quot;&gt;&lt;code&gt;KEY_WOW64_64KEY &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Access a 64-bit key from either a 32-bit or 64-bit application.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;152&quot;&gt;&lt;code&gt;KEY_WOW64_32KEY &lt;/code&gt;&lt;/td&gt; &lt;td&gt;Access a 32-bit key from either a 32-bit or 64-bit application.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;What I needed to do was to access the subkeys of a 64bit key from a 32bit application, which translated in code is just:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;RegOpenKeyEx(HKEY_LOCAL_MACHINE, MyKey, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, KEY_READ | KEY_WOW64_64KEY, &amp;hKey);&lt;/pre&gt; &lt;p&gt;Easy, isn&#39;t it?&lt;/p&gt; &lt;p&gt;All in all, the documentation provided by Microsoft on file system and registry redirection is very good and I just reported what I first found on the MSDN. I don&#39;t think these redirections are going to be much of a problem for programmers.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Interprocess_Communication_&quot;&gt;Interprocess Communication&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;As mentioned in the Windows On Windows paragraph, interprocess communication becomes an important aspect on x64, since a 64bit application might need to use a 32bit component and viceversa. The MSDN suggests these ways for process to communicate between each other:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Handles to named objects such as mutexes, semaphores, and file handles can all be shared.  &lt;/li&gt;&lt;li&gt;Handles to windows (HWND) can be shared.  &lt;/li&gt;&lt;li&gt;RPC.  &lt;/li&gt;&lt;li&gt;COM LocalServers.  &lt;/li&gt;&lt;li&gt;Shared memory can be used if the contents of the shared memory are not pointer-dependent.  &lt;/li&gt;&lt;li&gt;The CreateProcess and ShellExecute functions can launch 32-bit and 64-bit processes from either 32-bit or 64-bit processes.  &lt;/li&gt;&lt;li&gt;The CreateRemoteThread function is special-cased for specific functions, allowing 64-bit debuggers to break into 32-bit processes. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Using CreateProcess or ShellExecute means that you could communicate through arguments and output reading. If you need something more sofisticated (and professional), you have no choice but to use RPCs (Remote Procedure Calls) or COM objects. For RPCs you need to learn a bit about the MIDL (Microsoft Interface Definition Language), but eventually every code sample I tried wasn&#39;t working on Vista x64, so I gave up on RPCs. I would suggest you to use a COM, writing them in MFC is very easy (comparing to writing them without MFC, I mean). There&#39;s a very good series of articles on CodeProject about writing &lt;a href=&quot;http://www.codeproject.com/com/com_in_c1.asp&quot;&gt;ActiveXs&lt;/a&gt;. Actually, the guide is about how writing ActiveXs in plain C (I had to reduce the size of my ActiveX, so I couldn&#39;t use MFC), but the theory is the same and these articles are well written and could save you from the effort of reading a book. If you have never written COM objects before, you will eventually discover that it can be annoying. &lt;/p&gt; &lt;p&gt;Shared memory is not really an option. If you are looking for a solution between CreateProcess and COM objects, you may use pipes or things like that. Actually, you could implement your own pipes through shared memory and mutexes. This is what I have done in some projects:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/pipes.jpg&quot; border=&quot;0&quot; height=&quot;477&quot; width=&quot;442&quot; /&gt;&lt;/p&gt; &lt;p&gt;The &quot; *32&quot; next to the process name is the way of the Task Manager to tell us which are 32bit processes. As you can see the Server is a 64bit process and the Client a 32bit one. The two processes communicate with each other without problems. However, don&#39;t get too excited, there are some problems and I&#39;ll explain later what they are about. For now, let&#39;s see a code sample (communication.zip download available at the top of the article)&lt;/p&gt; &lt;p&gt;Here&#39;s the Client code:&lt;/p&gt;&lt;div class=&quot;smallText&quot; id=&quot;premain22&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;22&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg22&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;22&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse22&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre22&quot; lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;windows.h&gt;&lt;/windows.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;tchar.h&gt;&lt;/tchar.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define BUF_SIZE  256 * sizeof (TCHAR)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;TCHAR MyEvent[] = _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Global\\SharedMemoryEvent&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;TCHAR szName[]= _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Global\\MyFileMappingObject&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,&lt;br /&gt;                 LPSTR szCmdLine, &lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; iCmdShow)&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Create the event to communicate between server and client&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, MyEvent);&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Start server process&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; PROCESS_INFORMATION pi = { &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt; };&lt;br /&gt; STARTUPINFO si = { &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt; };&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (!CreateProcess(_T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Server.exe&quot;&lt;/span&gt;), NULL, NULL, NULL, FALSE, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, NULL,&lt;br /&gt;                    NULL, &amp;si, &amp;amp;pi))&lt;br /&gt;     &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Wait for the server to complete the job&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; WaitForSingleObject(hEvent, INFINITE);&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Access shared memory object&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; HANDLE hMapFile = OpenFileMapping(&lt;br /&gt;     FILE_MAP_ALL_ACCESS,   &lt;span class=&quot;cpp-comment&quot;&gt;// read/write access&lt;/span&gt;&lt;br /&gt;     FALSE,                 &lt;span class=&quot;cpp-comment&quot;&gt;// do not inherit the name&lt;/span&gt;&lt;br /&gt;     szName);               &lt;span class=&quot;cpp-comment&quot;&gt;// name of mapping object &lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (hMapFile == NULL) &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; LPCTSTR pBuf = (LPTSTR) MapViewOfFile(&lt;br /&gt;     hMapFile,              &lt;span class=&quot;cpp-comment&quot;&gt;// handle to map object&lt;/span&gt;&lt;br /&gt;     FILE_MAP_ALL_ACCESS,   &lt;span class=&quot;cpp-comment&quot;&gt;// read/write permission&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;,                 &lt;br /&gt;     &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;,                 &lt;br /&gt;     BUF_SIZE);                &lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (pBuf == NULL) &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Shows Server Output&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; MessageBox(NULL, pBuf, _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Server Output&quot;&lt;/span&gt;), MB_OK);&lt;br /&gt;&lt;br /&gt; UnmapViewOfFile(pBuf);&lt;br /&gt;&lt;br /&gt; CloseHandle(hMapFile);&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Tell the server that the object isn&#39;t used any longer&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; SetEvent(hEvent);&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;And here&#39;s the Server code:&lt;/p&gt;&lt;div class=&quot;smallText&quot; id=&quot;premain23&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;23&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg23&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;23&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse23&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre23&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;windows.h&gt;&lt;/windows.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;tchar.h&gt;&lt;/tchar.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define BUF_SIZE  256 * sizeof (TCHAR)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;TCHAR MyEvent[] = _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Global\\SharedMemoryEvent&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;TCHAR szName[] = _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Global\\MyFileMappingObject&quot;&lt;/span&gt;);&lt;br /&gt;TCHAR szMsg[] = _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Message from server process&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,&lt;br /&gt;                  LPSTR szCmdLine, &lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; iCmdShow)&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Create the memory shared object&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; HANDLE hMapFile;&lt;br /&gt; LPCTSTR pBuf;&lt;br /&gt;&lt;br /&gt; hMapFile = CreateFileMapping(&lt;br /&gt;     INVALID_HANDLE_VALUE,    &lt;span class=&quot;cpp-comment&quot;&gt;// use paging file&lt;/span&gt;&lt;br /&gt;     NULL,                    &lt;span class=&quot;cpp-comment&quot;&gt;// default security &lt;/span&gt;&lt;br /&gt;     PAGE_READWRITE,          &lt;span class=&quot;cpp-comment&quot;&gt;// read/write access&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;,                       &lt;span class=&quot;cpp-comment&quot;&gt;// max. object size &lt;/span&gt;&lt;br /&gt;     BUF_SIZE,                &lt;span class=&quot;cpp-comment&quot;&gt;// buffer size  &lt;/span&gt;&lt;br /&gt;     szName);                 &lt;span class=&quot;cpp-comment&quot;&gt;// name of mapping object&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (hMapFile == NULL) &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; pBuf = (LPTSTR) MapViewOfFile(hMapFile,   &lt;span class=&quot;cpp-comment&quot;&gt;// handle to map object&lt;/span&gt;&lt;br /&gt;     FILE_MAP_ALL_ACCESS,             &lt;span class=&quot;cpp-comment&quot;&gt;// read/write permission&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;,                &lt;br /&gt;     &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;,                &lt;br /&gt;     BUF_SIZE);        &lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (pBuf == NULL) &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; CopyMemory((PVOID) pBuf, szMsg, (_tcslen(szMsg) + &lt;span class=&quot;cpp-literal&quot;&gt;1&lt;/span&gt;) * &lt;span class=&quot;cpp-keyword&quot;&gt;sizeof&lt;/span&gt; (TCHAR));&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Wait for event before closing file object&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, MyEvent);&lt;br /&gt;&lt;br /&gt; SetEvent(hEvent);&lt;br /&gt;&lt;br /&gt; WaitForSingleObject(hEvent, INFINITE);&lt;br /&gt;&lt;br /&gt; UnmapViewOfFile(pBuf);&lt;br /&gt; CloseHandle(hMapFile);&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;What these applications do is:&lt;/p&gt; &lt;ul&gt;&lt;li&gt; &lt;p&gt;The client creates a communication event.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;The client starts the server and waits for the communication event to be set.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;The server creates a shared memory object and fills it with an output.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;The server sets the communication event in order to tell the client to process the output.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;The server waits for the client to clear the shared memory.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;The client processes the server&#39;s output.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;The client tells the server that it can now clear the shared memory.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I believe it&#39;s easier to understand the code itself than this list. The problem I mentioned earlier is that in order to share a memory object (or an event) between processes, I have to create it in the &quot;Global\\*&quot; section. What happens with Vista is that only applications with admin privileges can access this section with CreateFileMapping (no problems with mutexes or events, though), and since usually applications run in Vista with user privileges, you have to explicitly tell Vista to run the Client application with admin privileges, which is not very professional. The solution to this problem could be to share the memory through a temporary file or even the registry (for small data). &lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Portable_Executable&quot;&gt;Portable Executable&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;If your software has anything to do with Portable Executables it won&#39;t be too hard to move to x64 (if you haven&#39;t done it already). Basically, what in PE64 changes is the size of virtual addresses (VAs), which are now 64bit wide. Keep in mind that not all the fields described as virtual addresses really are such, most of the time they&#39;re just relative virtual addresses (RVAs), which are, like in the PE32, 32bit wide. What changes, in short, is the Optional Header (which has some 64bit wide fields like the ImageBase), Import Directory thunks (the two thunk arrays. OFTs and FTs, are now 64bit wide, since thunks were built to contain virtual addresses among the other things), the Load Config Directory and the TLS Directory.&lt;/p&gt; &lt;p&gt;Let&#39;s take, for instance, the old PE32 Optional Header:&lt;/p&gt;&lt;div class=&quot;smallText&quot; id=&quot;premain24&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;24&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg24&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;24&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse24&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre24&quot; lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;struct&lt;/span&gt; _IMAGE_OPTIONAL_HEADER {&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Standard fields.&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; WORD    Magic;&lt;br /&gt; BYTE    MajorLinkerVersion;&lt;br /&gt; BYTE    MinorLinkerVersion;&lt;br /&gt; DWORD   SizeOfCode;&lt;br /&gt; DWORD   SizeOfInitializedData;&lt;br /&gt; DWORD   SizeOfUninitializedData;&lt;br /&gt; DWORD   AddressOfEntryPoint;&lt;br /&gt; DWORD   BaseOfCode;&lt;br /&gt; DWORD   BaseOfData;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// NT additional fields.&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; DWORD   ImageBase;&lt;br /&gt; DWORD   SectionAlignment;&lt;br /&gt; DWORD   FileAlignment;&lt;br /&gt; WORD    MajorOperatingSystemVersion;&lt;br /&gt; WORD    MinorOperatingSystemVersion;&lt;br /&gt; WORD    MajorImageVersion;&lt;br /&gt; WORD    MinorImageVersion;&lt;br /&gt; WORD    MajorSubsystemVersion;&lt;br /&gt; WORD    MinorSubsystemVersion;&lt;br /&gt; DWORD   Win32VersionValue;&lt;br /&gt; DWORD   SizeOfImage;&lt;br /&gt; DWORD   SizeOfHeaders;&lt;br /&gt; DWORD   CheckSum;&lt;br /&gt; WORD    Subsystem;&lt;br /&gt; WORD    DllCharacteristics;&lt;br /&gt; DWORD   SizeOfStackReserve;&lt;br /&gt; DWORD   SizeOfStackCommit;&lt;br /&gt; DWORD   SizeOfHeapReserve;&lt;br /&gt; DWORD   SizeOfHeapCommit;&lt;br /&gt; DWORD   LoaderFlags;&lt;br /&gt; DWORD   NumberOfRvaAndSizes;&lt;br /&gt; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];&lt;br /&gt;} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;&lt;/pre&gt; &lt;p&gt;And the PE64 one:&lt;/p&gt;&lt;div class=&quot;smallText&quot; id=&quot;premain25&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;25&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg25&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;25&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse25&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre25&quot; lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;struct&lt;/span&gt; _IMAGE_OPTIONAL_HEADER64 {&lt;br /&gt; WORD        Magic;&lt;br /&gt; BYTE        MajorLinkerVersion;&lt;br /&gt; BYTE        MinorLinkerVersion;&lt;br /&gt; DWORD       SizeOfCode;&lt;br /&gt; DWORD       SizeOfInitializedData;&lt;br /&gt; DWORD       SizeOfUninitializedData;&lt;br /&gt; DWORD       AddressOfEntryPoint;&lt;br /&gt; DWORD       BaseOfCode;&lt;br /&gt; ULONGLONG   ImageBase;&lt;br /&gt; DWORD       SectionAlignment;&lt;br /&gt; DWORD       FileAlignment;&lt;br /&gt; WORD        MajorOperatingSystemVersion;&lt;br /&gt; WORD        MinorOperatingSystemVersion;&lt;br /&gt; WORD        MajorImageVersion;&lt;br /&gt; WORD        MinorImageVersion;&lt;br /&gt; WORD        MajorSubsystemVersion;&lt;br /&gt; WORD        MinorSubsystemVersion;&lt;br /&gt; DWORD       Win32VersionValue;&lt;br /&gt; DWORD       SizeOfImage;&lt;br /&gt; DWORD       SizeOfHeaders;&lt;br /&gt; DWORD       CheckSum;&lt;br /&gt; WORD        Subsystem;&lt;br /&gt; WORD        DllCharacteristics;&lt;br /&gt; ULONGLONG   SizeOfStackReserve;&lt;br /&gt; ULONGLONG   SizeOfStackCommit;&lt;br /&gt; ULONGLONG   SizeOfHeapReserve;&lt;br /&gt; ULONGLONG   SizeOfHeapCommit;&lt;br /&gt; DWORD       LoaderFlags;&lt;br /&gt; DWORD       NumberOfRvaAndSizes;&lt;br /&gt; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];&lt;br /&gt;} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;&lt;/pre&gt; &lt;p&gt;Of course, &lt;code&gt;ULONGLONG &lt;/code&gt;are 64bit wide fields. As you can see, the &lt;code&gt;AddressOfEntryPoint &lt;/code&gt;remains, as every RVA, a dword. Conversely, &lt;code&gt;ImageBase&lt;/code&gt;, being a Virtual Address, becomes a qword.&lt;/p&gt; &lt;p&gt;Distinguishing between PE32 and PE64 should be done by checking the Magic field in the Optional Header. This field can be one of these values:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10b&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;It is your choice to either double write every time the code to handle both PE32/64 or write a class to handle them automatically.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Exception_Handling&quot;&gt;Exception Handling&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Remember the old days when you set the SEH in your code? Well, with x64/Itanium they&#39;re gone. Exception Handlers are now stored as structured in the PE64 Exception Directory. The basic structure is this:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;struct&lt;/span&gt; _RUNTIME_FUNCTION {&lt;br /&gt; DWORD BeginAddress;&lt;br /&gt; DWORD EndAddress;&lt;br /&gt; DWORD UnwindData;&lt;br /&gt;} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;&lt;/pre&gt; &lt;p&gt;All three fields are RVAs (otherwise there wouldn&#39;t be dwords).&lt;/p&gt; &lt;table id=&quot;table1&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width=&quot;93&quot;&gt;&lt;code&gt;BeginAddress&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Points to the start address of the involved part of code.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;93&quot;&gt;&lt;code&gt;EndAddress&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Points to the end address of the same part of code.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;93&quot;&gt;&lt;code&gt;UnwindData&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Points to an UNWIND_INFO structure.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;The &lt;code&gt;UNWIND_INFO &lt;/code&gt;structure tells how the portion of code should be handled. Here&#39;s the declaration I found on MSDN: &lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;union&lt;/span&gt; _UNWIND_CODE {&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;struct&lt;/span&gt; {&lt;br /&gt;     UBYTE CodeOffset;&lt;br /&gt;     UBYTE UnwindOp : &lt;span class=&quot;cpp-literal&quot;&gt;4&lt;/span&gt;;&lt;br /&gt;     UBYTE OpInfo   : &lt;span class=&quot;cpp-literal&quot;&gt;4&lt;/span&gt;;&lt;br /&gt; };&lt;br /&gt; USHORT FrameOffset;&lt;br /&gt;} UNWIND_CODE, *PUNWIND_CODE;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;struct&lt;/span&gt; _UNWIND_INFO {&lt;br /&gt; UBYTE Version       : &lt;span class=&quot;cpp-literal&quot;&gt;3&lt;/span&gt;;&lt;br /&gt; UBYTE Flags         : &lt;span class=&quot;cpp-literal&quot;&gt;5&lt;/span&gt;;&lt;br /&gt; UBYTE SizeOfProlog;&lt;br /&gt; UBYTE CountOfCodes;&lt;br /&gt; UBYTE FrameRegister : &lt;span class=&quot;cpp-literal&quot;&gt;4&lt;/span&gt;;&lt;br /&gt; UBYTE FrameOffset   : &lt;span class=&quot;cpp-literal&quot;&gt;4&lt;/span&gt;;&lt;br /&gt; UNWIND_CODE UnwindCode[&lt;span class=&quot;cpp-literal&quot;&gt;1&lt;/span&gt;];&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;/*  UNWIND_CODE MoreUnwindCode[((CountOfCodes + 1) &amp; ~1) - 1];&lt;br /&gt;*   union {&lt;br /&gt;*       OPTIONAL ULONG ExceptionHandler;&lt;br /&gt;*       OPTIONAL ULONG FunctionEntry;&lt;br /&gt;*   };&lt;br /&gt;*   OPTIONAL ULONG ExceptionData[]; */&lt;/span&gt;&lt;br /&gt;} UNWIND_INFO, *PUNWIND_INFO;&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Here&#39;s the description of the &lt;code&gt;UNWIND_INFO &lt;/code&gt;structure members taken directly from the MSDN:&lt;/p&gt; &lt;table id=&quot;table2&quot; bgcolor=&quot;#e1e1e1&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;Version&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Version number of the unwind data, currently 1.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;Flags&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Three flags are currently defined:  &lt;p&gt;&lt;code&gt;UNW_FLAG_EHANDLER&lt;/code&gt; The function has an exception handler that should be called when looking for functions that need to examine exceptions. &lt;/p&gt; &lt;p&gt;&lt;code&gt;UNW_FLAG_UHANDLER&lt;/code&gt; The function has a termination handler that should be called when unwinding an exception. &lt;/p&gt; &lt;p&gt;&lt;code&gt;UNW_FLAG_CHAININFO&lt;/code&gt; This unwind info structure is not the primary one for the procedure. Instead, the chained unwind info entry is the contents of a previous RUNTIME_FUNCTION entry. See the following text for an explanation of chained unwind info structures. If this flag is set, then the UNW_FLAG_EHANDLER and &lt;code&gt;UNW_FLAG_UHANDLER&lt;/code&gt; flags must be cleared. Also, the frame register and fixed-stack allocation fields must have the same values as in the primary unwind info. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;SizeOfProlog&lt;/code&gt;&lt;/td&gt; &lt;td&gt;Length of the function prolog in bytes.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;CountOfCodes&lt;/code&gt;&lt;/td&gt; &lt;td&gt;This is the number of slots in the unwind codes array. Note that some unwind codes (for example, &lt;code&gt;UWOP_SAVE_NONVOL&lt;/code&gt;) require more than one slot in the array.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;FrameRegister &lt;/code&gt;&lt;/td&gt; &lt;td&gt;If nonzero, then the function uses a frame pointer, and this field is the number of the nonvolatile register used as the frame pointer, using the same encoding for the operation info field of &lt;code&gt;UNWIND_CODE&lt;/code&gt; nodes.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;FrameOffset &lt;/code&gt;&lt;/td&gt; &lt;td&gt;If the frame register field is nonzero, then this is the scaled offset from RSP that is applied to the FP reg when it is established. The actual FP reg is set to RSP + 16 * this number, allowing offsets from 0 to 240. This permits pointing the FP reg into the middle of the local stack allocation for dynamic stack frames, allowing better code density through shorter instructions (more instructions can use the 8-bit signed offset form).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;UnwindCode&lt;/code&gt;&lt;/td&gt; &lt;td&gt;This is an array of items that explains the effect of the prolog on the nonvolatile registers and RSP. See the section on &lt;code&gt;UNWIND_CODE&lt;/code&gt; for the meanings of individual items. For alignment purposes, this array will always have an even number of entries, with the final entry potentially unused (in which case the array will be one longer than indicated by the count of unwind codes field).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;ExceptionHandler&lt;/code&gt;&lt;/td&gt; &lt;td&gt;This is an image-relative pointer to either the function&#39;s language-specific exception/termination handler (if flag &lt;code&gt;UNW_FLAG_CHAININFO&lt;/code&gt; is clear and one of the flags &lt;code&gt;UNW_FLAG_EHANDLER&lt;/code&gt; or &lt;code&gt;UNW_FLAG_UHANDLER&lt;/code&gt; is set).&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;Language-specific handler data (ExceptionData)&lt;/code&gt;&lt;/td&gt; &lt;td&gt;This is the function&#39;s language-specific exception handler data. The format of this data is unspecified and completely determined by the specific exception handler in use.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;204&quot;&gt;&lt;code&gt;Chained Unwind Info (ExceptionData)&lt;/code&gt;&lt;/td&gt; &lt;td&gt;If flag &lt;code&gt;UNW_FLAG_CHAININFO&lt;/code&gt; is set then the &lt;code&gt;UNWIND_INFO&lt;/code&gt; structure ends with three &lt;code&gt;UWORDs&lt;/code&gt;. These &lt;code&gt;UWORDs&lt;/code&gt; represent the &lt;code&gt;RUNTIME_FUNCTION&lt;/code&gt; information for the function of the chained unwind.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;The possible values of the Flags field are:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define UNW_FLAG_EHANDLER  0x01&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define UNW_FLAG_UHANDLER  0x02&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define UNW_FLAG_CHAININFO 0x04&lt;/span&gt; &lt;/pre&gt; &lt;p&gt;Let&#39;s take for instance this code:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;windows.h&gt;&lt;/windows.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;tchar.h&gt;&lt;/tchar.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;intrin.h&gt;&lt;/intrin.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,&lt;br /&gt;               LPTSTR lpCmdLine, &lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; nCmdShow)&lt;br /&gt;{&lt;br /&gt;__try&lt;br /&gt;{&lt;br /&gt;   __debugbreak();&lt;br /&gt;}&lt;br /&gt;__except (EXCEPTION_EXECUTE_HANDLER)&lt;br /&gt;{&lt;br /&gt;   MessageBox(&lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Hello!&quot;&lt;/span&gt;), _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;SEH&quot;&lt;/span&gt;), &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt; &lt;p&gt;The dissassembly would be:&lt;/p&gt;&lt;pre lang=&quot;asm&quot;&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401000&lt;/span&gt; wWinMain proc near  &lt;span class=&quot;cpp-comment&quot;&gt;; CODE XREF: __tmainCRTStartup+18C p&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401000&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;sub&lt;/span&gt; rsp, 28h     &lt;span class=&quot;cpp-comment&quot;&gt;; BeginAddress &lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401004&lt;/span&gt;    int &lt;span class=&quot;cpp-literal&quot;&gt;3&lt;/span&gt;            &lt;span class=&quot;cpp-comment&quot;&gt;; Trap to Debugger&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401005&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;jmp&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;short&lt;/span&gt; loc_401021&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401007&lt;/span&gt; &lt;span class=&quot;cpp-comment&quot;&gt;; ---------------------------------------------------&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401007&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; r9d, r9d     &lt;span class=&quot;cpp-comment&quot;&gt;; ExceptionHandler&lt;/span&gt;&lt;br /&gt;.text:000000000040100A    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; r8, Caption        &lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401011&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;lea&lt;/span&gt; rdx, Text          &lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401018&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;ecx&lt;/span&gt;           &lt;br /&gt;.text:000000000040101A    &lt;span class=&quot;cpp-keyword&quot;&gt;call&lt;/span&gt; cs:__imp_MessageBoxW&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401020&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;nop&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401021&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401021&lt;/span&gt; loc_401021:         &lt;span class=&quot;cpp-comment&quot;&gt;; CODE XREF: wWinMain+5 j&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401021&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;, &lt;span class=&quot;cpp-keyword&quot;&gt;eax&lt;/span&gt;&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401023&lt;/span&gt;    &lt;span class=&quot;cpp-keyword&quot;&gt;add&lt;/span&gt; rsp, 28h&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401027&lt;/span&gt;    retn&lt;br /&gt;.text:&lt;span class=&quot;cpp-literal&quot;&gt;0000000000401027&lt;/span&gt; wWinMain endp       &lt;span class=&quot;cpp-comment&quot;&gt;; EndAddress (+ alignment)&lt;/span&gt; &lt;/pre&gt; &lt;p&gt;If you need to generate code dinamically and set for it an exception handler, you can use the function RtlAddFunctionTable, which takes as paramater an array of &lt;code&gt;RUNTIME_FUNCTION &lt;/code&gt;structures. This means, of course, that you&#39;ll have to fill one or more &lt;code&gt;UNWIND_INFO &lt;/code&gt;structure/s by yourself. It&#39;s certainly a bit more complicated than on x86, but my guess is that a lot of software protections are going to use this method. &lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;.NET_Framework&quot;&gt;.NET Framework&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Both the x86 and x64 .NET frameworks can coexist peacefully on a x64 Windows. In case you install both, there will be two things of everything: two directories in the .NET directory, two directories in the global cache and two main registry keys. Since .NET assemblies don&#39;t contain native code, why could it be useful to have both frameworks on the same computer? &lt;/p&gt; &lt;p&gt;.NET assemblies can call native code through the &lt;i&gt;System.Runtime.InteropServices &lt;/i&gt;namespace. Of course, a .NET assembly which runs on the x64 .NET framework is a 64bit process, therefore it can&#39;t call x86 components functions. Viceversa, assemblies executed on x86 can&#39;t use x64 components. You can explicitly tell the Visual Studio to compile your assembly for a specific platform (x86, x64, Itanium) by just going on Project -&gt; Properties -&gt; Build.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/vsnet.jpg&quot; border=&quot;0&quot; height=&quot;226&quot; width=&quot;509&quot; /&gt;&lt;/p&gt; &lt;p&gt;64bit PEs are always built for a specific platform, only PE32 assemblies are allowed to run on every framework (x86 systems wouldn&#39;t be able to execute a PE64). Anyway, it&#39;s possible to make PE32 assemblies run just on the x86 framework by just setting one flag in the .NET Directory (&lt;code&gt;IMAGE_COR20_DIRECTORY&lt;/code&gt;). The flag is &lt;code&gt;COMIMAGE_FLAGS_32BITREQUIRED&lt;/code&gt;. By setting this flag you&#39;ll force to execute the given assembly as a 32bit process even on 64bit platforms.&lt;/p&gt; &lt;p&gt;There are also some differences between the 32bit and 64bit .NET framework. I noticed that the 64bit one is very serious about alignments and integrity cheks in assemblies, and the new 3.0 framework has even more checks.&lt;/p&gt; &lt;h2&gt;&lt;a name=&quot;Vista_Section&quot;&gt;Vista Section&lt;/a&gt;&lt;/h2&gt; &lt;h3&gt;&lt;a name=&quot;Editions_&quot;&gt;Editions&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Windows Vista is shipped in various editions, before you install the new system, you should be aware of the features missing in some editions. Here&#39;s the official features table given by Microsoft:&lt;/p&gt; &lt;center&gt; &lt;table border=&quot;0&quot; bordercolor=&quot;#c0c0c0&quot; cellpadding=&quot;2&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;strong&gt;Home Basic&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;strong&gt;Home Premium&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Business&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Ultimate&lt;/strong&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/foreveryone/security.mspx&quot;&gt;Most secure Windows ever&lt;/a&gt;&lt;br /&gt;with Windows Defender and Windows Firewall&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Basic&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_basic.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Premium&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_prem.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Business&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_busi.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/foreveryone/searchorg.mspx&quot;&gt;Quickly find what you need&lt;/a&gt;&lt;br /&gt;with Instant Search and Windows Internet&lt;br /&gt;Explorer 7&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Basic&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_basic.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Premium&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_prem.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Business&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_busi.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/default.mspx&quot;&gt;Elegant Windows Aero desktop experience&lt;/a&gt;&lt;br /&gt;with Windows Flip 3D navigation&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Premium&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_prem.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Business&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_busi.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/forbiz/mobilepc.mspx&quot;&gt;Best choice for laptops&lt;/a&gt;&lt;br /&gt;with enhanced Windows Mobility Center and&lt;br /&gt;Tablet PC support&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Premium&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_prem.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Business&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_busi.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/forbiz/sharing.mspx&quot;&gt;Collaborate and share documents&lt;/a&gt;&lt;br /&gt;with Windows Meeting Space&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Premium&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_prem.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Business&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_busi.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/forhome/mediacenter.mspx&quot;&gt;Experience photos and entertainment&lt;/a&gt;&lt;br /&gt;in your living room with Windows Media Center&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Premium&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_prem.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/experiences/magic.mspx&quot;&gt;Enjoy Windows Media Center&lt;/a&gt;&lt;br /&gt;on TVs throughout your home with Xbox 360™ and other devices&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Home Premium&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_prem.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/forbiz/diagnostics.mspx&quot;&gt;Help protect against hardware failure&lt;/a&gt;&lt;br /&gt;with advanced business backup features&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Business&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_busi.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/foreveryone/networking.mspx&quot;&gt;Business networking and Remote Desktop&lt;/a&gt;&lt;br /&gt;for easier connectivity&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Business&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_busi.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td id=&quot;feature&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsvista/features/forbiz/protection.mspx&quot;&gt;Better protect your data&lt;/a&gt;&lt;br /&gt;against loss or theft with Windows&lt;br /&gt;BitLocker™ Drive Encryption&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;br /&gt;&lt;/td&gt; &lt;td id=&quot;checkMark&quot; align=&quot;center&quot;&gt;&lt;img alt=&quot;Ultimate&quot; src=&quot;http://www.codeproject.com/vista/vista_x64/check_ult.gif&quot; border=&quot;0&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt; &lt;p&gt;But there are other things that the common user might not notice. For instance, the Business and Ultimate edition allow virtualization (using the system as a virtual machine). The End-User License Agreement for the Vista Home Basic and Premium reads:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;4. &lt;b&gt;USE WITH VIRTUALIZATION TECHNOLOGIES.&lt;/b&gt; You may not use the software installed on the licensed device within a virtual (or otherwise emulated) hardware system.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apparentely, Microsoft put special checks in the home editions, in order to prevent them from working in emulation. I read that VMWare was quite disappointed by this policy adopted by Microsoft. This controversy might change things, but I think many programmers and companies should know this before buying one or another Vista edition.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Microsoft_Visual_Studio&quot;&gt;Microsoft Visual Studio&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;I chose this as the second paragraph of the Windows Vista section, because what every programmer first does when he has a brand new system is to install and set up his compilers. The problem is, since many things change with Vista, the only compatible Visual Studio platform is the 2005 one. Compatibility for Visual Studio 6 and Visual Studio .NET 2003 is no longer provided (although Visual Basic 6 seems to be supported). Not only that, in order to make the VS.NET 2005 work, you&#39;ll need to download and install the Service Pack 1 for it. &lt;/p&gt; &lt;p&gt;For a lot of programmers like myself it&#39;s not a big deal, since maintaining the code up to date is very important, but who has ever worked with little companies knows that a lot of them have no interest in doing the same, with the result that, for instance, many solutions are still developed for the .NET framework 1.0. Those solutions will, of course, still run on Vista, but there won&#39;t be any tool to compile them. I don&#39;t think Microsoft is going to solve this issue. Thus, for many companies it will take some time to switch to Vista.&lt;/p&gt; &lt;p&gt;P.S. The setup of Microsoft Visual Studio&#39;s Service Pack 1 will take &lt;b&gt;much&lt;/b&gt; time. Don&#39;t worry, it&#39;s normal.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;User_Account_Control&quot;&gt;User Account Control&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;What stands in the way of working properly for most applications on Windows Vista is the User Account Control (UAC), also known as Limited User Access (LUA). As we saw in the Interprocess Communication paragraph, admin rights to create shared memory objects are necessary, but Windows Vista runs every process (except system processes) with user rights. Incompatibilities are, most of the times, generated by programmers false assumption that their code will run on admin level. Programs which worked without problems with user rights on Windows NT 4-5.1 won&#39;t have any problems running properly on Vista. However, common mistakes (or bad habits) like:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Modifying files in their own Program Files directory.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Writing in the HKEY_LOCAL_MACHINE to store settings. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Are no longer problems, since on Vista there&#39;s a thing called virtualization. Basically, every file modified in a system directory, like Program Files, is actually stored in a directory called Virtual Store. My path for this directory is C:\Users\Daniel\AppData\Local\VirtualStore. The Windows Explorer will show you those files in the system directory, but actually they are all in the VirtualStore, which, and it goes without saying, is unique for every user. The files are just stored like this in the Virtual Store:&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;center&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/fs_virtual.jpg&quot; border=&quot;0&quot; height=&quot;156&quot; width=&quot;600&quot; /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;The directory hierarchy in the Virtual Store is exactly the same it would be without virtualization. I guess you have already figured out how it works.&lt;br /&gt;&lt;br /&gt;Just like for the File System, there&#39;s also a registry virtualization. Everything written in the key &lt;i&gt;HKEY_LOCAL_MACHINE\Software&lt;/i&gt; will actually be stored under &lt;i&gt;HKEY_CLASSES_ROOT\VirtualStore\Software&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;What you should keep in mind is that eveyrthing that might affect other users is no longer possible in a standard execution of your software. This means, apart from the things said above, you won&#39;t be able to load drivers, modify certain files (maybe not even read them), modify or read specific registry keys/values, access certain global objects, enumerate or modify the memory of processes which run with higher privileges than you do, etc. And you won&#39;t even be able to enumerate or send messages to windows created by those processes. This prevents exploits we have already seen in the past. There&#39;s a very good MSDN paper (&lt;a href=&quot;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/AccProtVista.asp&quot;&gt;Developer Best Practices and Guidelines for Applications in a Least Privileged Environment&lt;/a&gt;) about the UAC and its conseguences for developers, it&#39;s a detailed explanation of everything I tried to say here in short.  &lt;h3&gt;&lt;a name=&quot;Compatibility_Verification&quot;&gt;Compatibility Verification&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;There&#39;s a tool to verify if your application is compatible with the UAC. This tool is called &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=bd02c19c-1250-433c-8c1b-2619bd93b3a2&amp;DisplayLang=en&quot;&gt;Microsoft Application Verifier&lt;/a&gt; and it can also detect other issues, but right now we&#39;re not interested in those ones. Using it is very easy, all you need is to add an application to the list and select what kind of checks the verifier should do. In our case, we&#39;ll select the LUA (aka UAC) compatibility check.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/appverify.jpg&quot; border=&quot;0&quot; height=&quot;235&quot; width=&quot;600&quot; /&gt;&lt;/p&gt; &lt;p&gt;The next step is running the application you added to the list. When you&#39;re done, you save the log and then, as you can read from the screenshot above, you open it with the &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=DF59B474-C0B7-4422-8C70-B0D9D3D2F575&amp;amp;displaylang=en&quot;&gt;Microsoft Standard User Analyzer&lt;/a&gt;. Don&#39;t even think about opening it with another application, depending on the size of your software the verifier will generate a gigantic xml log, which would make every other program consume a big part of your ram. For this test I used the &lt;a href=&quot;http://ntcore.com/exsuite.php&quot;&gt;Task Explorer&lt;/a&gt; which, of course, tries to adjust its token to SeDebugPrivilege in order to list even system processes. In fact:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/sua.jpg&quot; border=&quot;0&quot; height=&quot;133&quot; width=&quot;511&quot; /&gt;&lt;/p&gt; &lt;p&gt;Since this application is not running with admin rights, it won&#39;t be able to acquire debug privileges. I wouldn&#39;t recommend you to use always this tool, since following good design rules should be enough. However, it might be useful.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Obtaining_Admin_Rights&quot;&gt;Obtaining Admin Rights&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Of course, it&#39;s still possible to run an application with admin rights. You can either do that manually or through code. To do it manually, you can just right-click on the application an then click &quot;Run as administrator&quot; or check the &quot;Run this program as administrator&quot; box under Properties -&gt; Compatibility. However, programmers cannot expect users to do these operations by themselves, so they&#39;ll need another way.&lt;/p&gt; &lt;p&gt;A very easy way is to tell the system the requested execution level through a manifest file. I suppose the reader knows what a manifest file is and how to integrate it in an application. There are plenty of guides about this subject and I don&#39;t think it should be re-discussed here. &lt;/p&gt; &lt;p&gt;The schema of such a manifest file should be like this one (this is actually for x86, as you see under processorArchitecture):&lt;/p&gt;&lt;pre lang=&quot;xml&quot;&gt;&lt;br /&gt;&lt;assembly xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot; manifestversion=&quot;1.0&quot;&gt;&lt;br /&gt;&lt;assemblyidentity version=&quot;1.0.0.0&quot; processorarchitecture=&quot;X86&quot; name=&quot;YourAppName&quot; type=&quot;win32&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;description&gt;Description of your application&lt;/description&gt;&lt;br /&gt;&lt;!-- Identify the application security requirements. --&gt;&lt;br /&gt;&lt;trustinfo xmlns=&quot;urn:schemas-microsoft-com:asm.v3&quot;&gt;&lt;br /&gt; &lt;security&gt;&lt;br /&gt;   &lt;requestedprivileges&gt;&lt;br /&gt;     &lt;requestedexecutionlevel level=&quot;requireAdministrator&quot; uiaccess=&quot;false&quot;&gt;&lt;br /&gt;   &lt;/requestedexecutionlevel&gt;&lt;br /&gt; &lt;/requestedprivileges&gt;&lt;br /&gt;&lt;/security&gt;&lt;br /&gt;&lt;/trustinfo&gt;&lt;/assemblyidentity&gt;&lt;/assembly&gt;&lt;/pre&gt; &lt;p&gt;The available values for &lt;b&gt;level&lt;/b&gt; are:&lt;/p&gt; &lt;table id=&quot;table4&quot; bgcolor=&quot;#e1e1e1&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;168&quot;&gt;&lt;code&gt;&lt;b&gt;asInvoker&lt;/b&gt;&lt;/code&gt;&lt;/td&gt; &lt;td&gt;The application runs with the same token as the parent process.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;168&quot;&gt;&lt;code&gt;&lt;b&gt;highestAvailable&lt;/b&gt;&lt;/code&gt;&lt;/td&gt; &lt;td&gt;The application runs with the highest privileges the current user can obtain.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;168&quot;&gt;&lt;code&gt;&lt;b&gt;requireAdministrator&lt;/b&gt;&lt;/code&gt;&lt;/td&gt; &lt;td&gt;The application runs only for administrators and requires that the application be launched with the full token of an administrator.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;And for &lt;b&gt;uiAccess&lt;/b&gt;:&lt;/p&gt; &lt;table id=&quot;table5&quot; bgcolor=&quot;#e1e1e1&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;code&gt;&lt;b&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;false&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;/td&gt; &lt;td width=&quot;928&quot;&gt;The application does not need to drive input to the UI of another window on the desktop. Applications that are not providing accessibility should set this flag to false. Applications that are required to drive input to other windows on the desktop (on-screen keyboard, for example) should set this value to true.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot;&gt;&lt;code&gt;&lt;b&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;true&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;/td&gt; &lt;td width=&quot;928&quot;&gt;The application is allowed to bypass UI protection levels to drive input to higher privilege windows on the desktop. This setting should only be used for UI Accessibility applications.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;I wrote a very small application (which just waits for an input key) to demonstrate the use of a manifest file. The download can be found at the top of this article.&lt;/p&gt; &lt;p&gt;There&#39;s also a function, &lt;code&gt;CredUIPromptForCredentials&lt;/code&gt;, to request specific credentials from a user and can be used to obtain admin rights, but it&#39;s not very comfortable for the user himself.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Disable_It&quot;&gt;Disable It&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;If you are annoyed by all these dialogs asking you for permissions, you can disable the UAC. There are two simple ways I&#39;m aware of. The first one described in detail on the &lt;a href=&quot;http://blogs.msdn.com/uac/archive/2006/01/22/516066.aspx&quot;&gt;UAC Team Blog&lt;/a&gt; is about going to Control Panel -&gt; Administrative Tools -&gt; Local Security Policy. In the tree on the left click Local Policies and then Security Options. Scroll until you find: &quot;User Account Control: behavior of the elevation prompt for administrators&quot;. Change the current value to: &quot;Elevate without prompting&quot;. Just like this:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/locsecpol.jpg&quot; border=&quot;0&quot; height=&quot;405&quot; width=&quot;600&quot; /&gt;&lt;/p&gt; &lt;p&gt;The other method is more drastic. It&#39;s about removing completely the UAC and requires a machine&#39;s reboot. In Administrative Tools, instead of clicking on Local Security Policy, click on System Configuration. Choose the tab &quot;Tools&quot; in the dialog and scroll until you find &quot;Disable UAC&quot; under &quot;Tool Name&quot;. To execute the command, click on Launch.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/sysconf.jpg&quot; border=&quot;0&quot; height=&quot;389&quot; width=&quot;585&quot; /&gt;&lt;/p&gt; &lt;p&gt;As you can see from the command line, it simply executes reg.exe to add a key/value. The full command line is:&lt;/p&gt;&lt;pre lang=&quot;text&quot;&gt;C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe&lt;br /&gt;ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System&lt;br /&gt;/v EnableLUA /t REG_DWORD /d 0 /f&lt;/pre&gt; &lt;p&gt;To re-enable the UAC, it sets the EnableLUA dword to 1.&lt;/p&gt; &lt;p&gt;I don&#39;t know whether it&#39;s a good idea or not to disable the UAC. Sure is that a lot of programmers will be too annoyed to keep it enabled. There&#39;s been a lot of criticism about this security system. However, I personally believe it&#39;s the only one to guarantee a minimum of security on an account where one has still admin rights. If one needs more security, one shall switch to a normal user account.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Address_Space_Layout_Randomization&quot;&gt;Address Space Layout Randomization&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;In short ASLR. There&#39;s an interesting &lt;a href=&quot;http://blogs.msdn.com/michael_howard/&quot;&gt;weblog&lt;/a&gt; about this new feature on Vista. Randomization, as you know, is useful to prevent buffer overflow exploits and has already been implemented on other operating systems. On Vista randomization is done on various levels:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Image Base  &lt;/li&gt;&lt;li&gt;Stack  &lt;/li&gt;&lt;li&gt;Heap &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;With the new Service Pack 1 for Visual Studio 2005 the option /dynamicbase has been introduced. This options makes it possible to relocate executables just like dynamic libraries, just by adding a relocation section to the PE header. All executables on Windows Vista have been compiled with this option, making it impossible for a programmer to assume where specific data is placed. Randomization for images has 256 variations. The reason for this are explained by Michael Howard:&lt;/p&gt; &lt;table id=&quot;table7&quot; bgcolor=&quot;#e1e1e1&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;On a final note, it is true that we don&#39;t have as much randomization as PaX and other more aggressive ASLR implementations. For instance, image randomization is only 8 bits (1 of 256 variations). Images have to be 64K aligned, and so on a 32-bit system we could have theoretically randomized images by up to 15 bits (1 of 32, 768 variations), but the incremental security gain is small - if you navigate to a Website and your browser crashes, will you go back to that site another 255 times - and would have come at the expense of fragmenting the entire address space, thereby reducing the contiguous memory available to applications and degrading system performance? We think we hit a nice balance.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;I did some tests and it seems that on x86, unlike on x64, the image base changes only when rebooting. On x64 the imagebase seems changing with every execution. By the way, x64 shouldn&#39;t have problems with contiguous memory availability, since the address space is enormously larger than on x86. Unfortunately, I can&#39;t do more tests, because, at the moment, I&#39;m running on Vista x86.&lt;/p&gt; &lt;p&gt;On the other hand, the stack should have 16,384 possible variations (14 bits). I wrote, for testing purposes, a little application to calculate stack variations on N executions. I wrote it very quick, so the implementation is also very rudimental. Basically, one executable calls another executable, compiled with the /dynamicbase option, N times and gets from it the stack address of a local variable. It then evaluates if the stack address has already been used or not; if not, it increments the number of variations. To communicate the stack address to the parent, the dynamic-base executable uses a &lt;code&gt;SendMessage &lt;/code&gt;(which is enough, since &lt;code&gt;wparam &lt;/code&gt;and &lt;code&gt;lparam &lt;/code&gt;are the same size of a pointer). This application was compiled for both x86 and x64.&lt;/p&gt; &lt;p&gt;Here&#39;s the dynamic-base executable source:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;windows.h&gt;&lt;/windows.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;tchar.h&gt;&lt;/tchar.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define WM_STACKADDRESS        (WM_USER + 100)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,&lt;br /&gt;          LPTSTR lpCmdLine, &lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; nCmdShow)&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; x;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; (&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt;) SendMessage(FindWindow(NULL, _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;RandTest&quot;&lt;/span&gt;)),&lt;br /&gt;     WM_STACKADDRESS, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, (LPARAM) &amp;x);&lt;br /&gt;}&lt;/pre&gt;And this is the main executable: &lt;div class=&quot;smallText&quot; id=&quot;premain35&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;35&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg35&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;35&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse35&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre35&quot; lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;windows.h&gt;&lt;/windows.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;tchar.h&gt;&lt;/tchar.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &quot;resource.h&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define WM_STACKADDRESS        (WM_USER + 100)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ULONG_PTR *pAddresses = NULL;&lt;br /&gt;UINT nAddresses = &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;// Test Loop thread: not blocking for GUI&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;void&lt;/span&gt; TestLoop(ULONG_PTR p)&lt;br /&gt;{&lt;br /&gt; UINT nExec = (UINT) p;&lt;br /&gt;&lt;br /&gt; STARTUPINFO si = { &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt; };&lt;br /&gt; PROCESS_INFORMATION pi = { &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt; };&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;for&lt;/span&gt; (UINT x = &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;; x &lt; class=&quot;cpp-string&quot;&gt;&quot;DynBaseApp.exe&quot;), NULL, NULL, NULL, FALSE, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;         NULL, NULL, &amp;si, &amp;amp;amp;amp;pi);&lt;br /&gt;&lt;br /&gt;     WaitForSingleObject(pi.hProcess, &lt;span class=&quot;cpp-literal&quot;&gt;3000&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;delete&lt;/span&gt; pAddresses;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// We&#39;re through with testing, show number of variations&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; TCHAR szMsg[&lt;span class=&quot;cpp-literal&quot;&gt;100&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt; wsprintf(szMsg, _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;The number of variations on %d executions is: %d.&quot;&lt;/span&gt;),&lt;br /&gt;     nExec, nAddresses);&lt;br /&gt;&lt;br /&gt; MessageBox(NULL, szMsg, _T(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Test Result&quot;&lt;/span&gt;), MB_ICONINFORMATION);&lt;br /&gt;&lt;br /&gt; ExitThread(&lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;switch&lt;/span&gt; (uMsg)&lt;br /&gt; {&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; WM_CLOSE:&lt;br /&gt;     {&lt;br /&gt;         EndDialog(hDlg, FALSE);&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; WM_COMMAND:&lt;br /&gt;     {&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;switch&lt;/span&gt; ((WORD) wParam)&lt;br /&gt;         {&lt;br /&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; IDC_TEST:&lt;br /&gt;             {&lt;br /&gt;                 &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;                 &lt;span class=&quot;cpp-comment&quot;&gt;// If executions != 0 start the loop&lt;/span&gt;&lt;br /&gt;                 &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                 TCHAR nStrExec[&lt;span class=&quot;cpp-literal&quot;&gt;20&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;                 GetDlgItemText(hDlg, ED_EXECUTIONS, nStrExec, &lt;span class=&quot;cpp-literal&quot;&gt;20&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                 UINT nExec = _tcstoul(nStrExec, NULL, &lt;span class=&quot;cpp-literal&quot;&gt;10&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                 &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (nExec == &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;) &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                 pAddresses = &lt;span class=&quot;cpp-keyword&quot;&gt;new&lt;/span&gt; ULONG_PTR [nExec];&lt;br /&gt;                 nAddresses = &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                 CreateThread(NULL, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, (LPTHREAD_START_ROUTINE) &amp;TestLoop,&lt;br /&gt;                     (LPVOID) (ULONG_PTR) nExec, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, NULL);&lt;br /&gt;&lt;br /&gt;                 &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; WM_STACKADDRESS:&lt;br /&gt;     {&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// It&#39;s a stack address being sended by DynBaseApp.exe&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// add it to the list if not already there&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         ULONG_PTR Addr = (ULONG_PTR) lParam;&lt;br /&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;for&lt;/span&gt; (UINT x = &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;; x &lt; class=&quot;cpp-keyword&quot;&gt;if (Addr == pAddresses[x]) &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         pAddresses[nAddresses] = Addr;&lt;br /&gt;         nAddresses++;&lt;br /&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,&lt;br /&gt;          LPTSTR lpCmdLine, &lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt; nCmdShow)&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; (&lt;span class=&quot;cpp-keyword&quot;&gt;int&lt;/span&gt;) DialogBox(hInstance, (LPCTSTR) IDD_RANDTEST, NULL,&lt;br /&gt;                       (DLGPROC) DlgProc);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;The results were pretty good. On 16,385 execution the minimum I got was 4026 (on x64). With less executions the results were, of course, even better (100/100, 199/200, 296/300).&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/randtest.jpg&quot; border=&quot;0&quot; height=&quot;159&quot; width=&quot;402&quot; /&gt;&lt;/p&gt; &lt;p&gt;To compile executables with the /dynamicbase option, just add &quot;/dynamicbase&quot; (without brackets) in the linker command line (Project -&gt; Properties -&gt; Linker -&gt; Command Line -&gt; Additional options).&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Driver_Signing&quot;&gt;Driver Signing&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;The big change with Vista is that drivers require now to be certificated to run (at least on 64bit), and in order to obtain the certification you have to ship an x64 version of your driver. x86-only submission are no longer accepted by WHQL (Windows Hardware Quality Labs). If you have no clue how to sign a driver there&#39;s a good doc on &lt;a href=&quot;http://www.microsoft.com/whdc/system/platform/64bit/kmsigning.mspx&quot;&gt;MSDN&lt;/a&gt; and, of course, the &lt;a href=&quot;http://www.microsoft.com/whdc/winlogo/drvsign/drvsign.mspx&quot;&gt;official page&lt;/a&gt;. Nevertheless, it&#39;s still possible to disable driver certification for testing and debugging reasons. Reboot your system and press F8 to get the Advanded Boot Options. Select &quot;Disable Driver Signature Enforcement&quot;.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/advboot.jpg&quot; border=&quot;0&quot; height=&quot;349&quot; width=&quot;500&quot; /&gt;&lt;/p&gt; &lt;p&gt;However, there&#39;s a lot more to be discussed if you&#39;re a device driver programmer or want to be one. In that case, I advise you to read the &lt;a href=&quot;http://www.osronline.com/&quot;&gt;NT Insider&lt;/a&gt; and for this particular issue this &lt;a href=&quot;http://www.osronline.com/article.cfm?article=475&quot;&gt;article&lt;/a&gt;. It describes all the steps that have to be done to set up a Vista machine for driver debugging and testing.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Patch_Guard&quot;&gt;Patch Guard&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;This paragraph (and child) shouldn&#39;t be for Vista only. However, there&#39;s been a lot of talking about Vista&#39;s Patch Guard. Patch Guard isn&#39;t news, it was first introduced for x64 (it&#39;s not available for x86) with Windows XP and 2003. I chose to put this paragraph in the Vista section, because the messing around with this technology brought some changes in Vista. What Patch Guard means is that it&#39;s no longer possible to patch kernel data, not even by trusted components. In fact, some companies, like Symantec, protested against this technology and said that Microsoft was using it in order to prevent third-part developed security solutions from working. This is non-sense, of course. Microsoft security products don&#39;t patch Vista&#39;s kernel either and use instead documented interfaces as everyone else. Basically, Patch Guard checks the integrity of system data, and if it&#39;s corrupted it calls KeBugCheckEx causing the system to shut down. Things that trigger this behavior are:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Modifying system service tables (SDT).  &lt;/li&gt;&lt;li&gt;Modifying the interrupt descriptor table (IDT).  &lt;/li&gt;&lt;li&gt;Modifying the global descriptor table (GDT).  &lt;/li&gt;&lt;li&gt;Using kernel stacks that are not allocated by the kernel.  &lt;/li&gt;&lt;li&gt;Patching any part of the kernel (detected only on AMD64-based systems). &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Patch Guard is disabled only when debugging the system. If your product relies on patching the kernel, you might be able to use an alternative method like suggested in this &lt;a href=&quot;http://blogs.msdn.com/windowsvistasecurity/archive/2006/08/11/695993.aspx&quot;&gt;weblog&lt;/a&gt;.&lt;/p&gt; &lt;table id=&quot;table6&quot; bgcolor=&quot;#e1e1e1&quot; border=&quot;1&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Clearly, customers demand effective security solutions, and they can be developed without relying on kernel patching techniques. Some of the alternatives to kernel patching are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows Vista includes the &quot;Windows Filtering Platform&quot;, which enables software to perform network oriented activities such as packet inspection and other activities necessary to support firewall products.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The file system mini filter model allows software to participate in file system activities, which can be used by Anti-Virus software.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Registry notification hooks, introduced in Windows XP, and recently enhanced in Windows Vista, allow software to participate in registry related activities in the system.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;I&#39;ll discuss the third alternative in the Registry Filtering paragraph.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Attacks&quot;&gt;Attacks&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Some efforts have been made in this direction, since Patch Guard is a software implementation. &lt;a href=&quot;http://www.uninformed.org/?v=3&amp;a=3&quot;&gt;Uninformed&lt;/a&gt; bypassed the Patch Guard protection on Windows XP x64. &lt;a href=&quot;http://theinvisiblethings.blogspot.com/&quot;&gt;Joanna Rutkowska &lt;/a&gt;bypassed Vista RC1&#39;s Patch Guard by patching (on disk) the pagefile of a driver. This &lt;a href=&quot;http://invisiblethings.org/papers/joanna%20rutkowska%20-%20subverting%20vista%20kernel.ppt&quot;&gt;attack&lt;/a&gt; was done in user mode and therefore requires the ability to open a disk through CreateFile with write permissions and then modify data through WriteFile. It seemed that Vista&#39;s RC2 solved the issue by preventing the disk to be modified from user mode (even with high privileges). However, I&#39;ve done some tests and CreateFile still returns a valid handle. The modification of some disk parts, like the boot sector, is still allowed as I could see. Nevertheless, if your utility relies on raw write access to the disk, you might encounter some problems. Fact is, this limitation doesn&#39;t even solve the issue, because theoretically the same trick could still be used in kernel mode.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Registry_Filtering&quot;&gt;Registry Filtering&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Since it&#39;s no longer possible patching the Service Descriptor Table (SDT) on x64, one might be wondering how Mark Russinovich&#39;s Regmon (alias the new &lt;a href=&quot;http://www.microsoft.com/technet/sysinternals/processesandthreads/processmonitor.mspx&quot;&gt;Process Monitor&lt;/a&gt;) works on x64. The answer is simple, starting with Windows XP there&#39;s no need to hook the SDT anymore. In fact, with Windows XP a new official and documented way has been introduced to filter the registry. This method relies on three functions: CmRegisterCallback (supported on XP and Vista), CmRegisterCallbackEx (supported on Vista only) and CmUnRegisterCallback. CmRegisterCallback/Ex registers a callback function for every registry operation. The callback function looks like this:&lt;/p&gt;&lt;pre lang=&quot;c++&quot;&gt;NTSTATUS RegistryCallback(&lt;br /&gt; IN PVOID  CallbackContext,&lt;br /&gt; IN PVOID  Argument1,&lt;br /&gt; IN PVOID  Argument2&lt;br /&gt; );&lt;/pre&gt; &lt;p&gt;These are the parameters:&lt;/p&gt; &lt;table id=&quot;table8&quot; bgcolor=&quot;#e1e1e1&quot; border=&quot;1&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width=&quot;127&quot;&gt;&lt;b&gt;CallbackContext&lt;/b&gt;&lt;/td&gt; &lt;td&gt;The value that the driver passed as the Context parameter to CmRegisterCallback or CmRegisterCallbackEx when it registered this RegistryCallback routine.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td height=&quot;41&quot; width=&quot;127&quot;&gt;&lt;b&gt;Argument1&lt;/b&gt;&lt;/td&gt; &lt;td height=&quot;41&quot;&gt;A REG_NOTIFY_CLASS-typed value that identifies the type of registry operation that is being performed and whether the RegistryCallback routine is being called before or after the register operation is performed.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width=&quot;127&quot;&gt;&lt;b&gt;Argument2&lt;/b&gt;&lt;/td&gt; &lt;td&gt;A pointer to a structure that contains information that is specific to the type of registry operation. The structure type depends on the REG_NOTIFY_CLASS-typed value for Argument1, as shown in the following table. For information about which REG_NOTIFY_CLASS-typed values are available for which operating system versions, see REG_NOTIFY_CLASS.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Argument1 carries the registry operation and Argument2 is a pointer to a structure. Here&#39;s the list of operations and their structures:&lt;/p&gt; &lt;center&gt; &lt;table id=&quot;table9&quot; border=&quot;1&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; width=&quot;61%&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;b&gt;Operation&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;b&gt;Structure&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtDeleteKey &lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_DELETE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreDeleteKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_DELETE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostDeleteKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtSetValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_SET_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreSetValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_SET_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostSetValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtDeleteValueKey &lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_DELETE_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreDeleteValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_DELETE_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostDeleteValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostDeleteValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtSetInformationKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_SET_INFORMATION_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreSetInformationKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_SET_INFORMATION_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostSetInformationKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtRenameKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_RENAME_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreRenameKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_RENAME_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostRenameKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtEnumerateKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_ENUMERATE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreEnumerateKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_ENUMERATE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostEnumerateKey &lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtEnumerateValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_ENUMERATE_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreEnumerateValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_ENUMERATE_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostEnumerateValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtQueryKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_QUERY_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreQueryKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_QUERY_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostQueryKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtQueryValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_QUERY_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreQueryValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_QUERY_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostQueryValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtQueryMultipleValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreQueryMultipleValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostQueryMultipleValueKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreCreateKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_PRE_CREATE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreCreateKeyEx&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_CREATE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostCreateKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_CREATE_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostCreateKeyEx&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreOpenKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_PRE_OPEN_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreOpenKeyEx&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_OPEN_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostOpenKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPEN_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostOpenKeyEx&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtKeyHandleClose&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_KEY_HANDLE_CLOSE_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreKeyHandleClose &lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_KEY_HANDLE_CLOSE_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostKeyHandleClose&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreFlushKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_FLUSH_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostFlushKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreLoadKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_LOAD_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostLoadKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreUnLoadKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_UNLOAD_KEY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostUnLoadKey&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreQueryKeySecurity&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_QUERY_KEY_SECURITY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostQueryKeySecurity&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPreSetKeySecurity&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_SET_KEY_SECURITY_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtPostSetKeySecurity&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_POST_OPERATION_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;RegNtCallbackContextCleanup&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;code&gt;REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt; &lt;p&gt;According to the MSDN, pointers in these structures should be accessed in try/except blocks. The callback can prevent operations from being performed as well (it&#39;s a real filter). To do that on XP, it just has to return a value different from &lt;code&gt;STATUS_SUCCESS&lt;/code&gt;. Unfortunately, by doing this, the thread which originally called the registry function will get the same error as well. That&#39;s why on Vista a new value is supported: &lt;code&gt;STATUS_CALLBACK_BYPASS&lt;/code&gt;. By returning this value, the registry operation isn&#39;t actually performed, but the thread won&#39;t get an error value. This is very useful for security solutions.&lt;/p&gt; &lt;p&gt;I wrote a small (very small) registry filter (see download link for MyRegFilter at the top of the article) to show how this new method works. Don&#39;t get too excited about it, I wrote it in 20 minutes and it&#39;s not that good, but maybe it&#39;s helpful for someone.&lt;/p&gt;&lt;div class=&quot;smallText&quot; id=&quot;premain37&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;37&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg37&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;37&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse37&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre37&quot; lang=&quot;c++&quot;&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#include &lt;ntddk.h&gt;&lt;/ntddk.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;WCHAR DeviceName[] = L&lt;span class=&quot;cpp-string&quot;&gt;&quot;\\Device\\MyRegFilter&quot;&lt;/span&gt;;&lt;br /&gt;WCHAR SymLinkName[] = L&lt;span class=&quot;cpp-string&quot;&gt;&quot;\\DosDevices\\MyRegFilter&quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;UNICODE_STRING usDeviceName;&lt;br /&gt;UNICODE_STRING usSymbolicLinkName;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-keyword&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;struct&lt;/span&gt; _DEVICE_CONTEXT&lt;br /&gt;{&lt;br /&gt; PDRIVER_OBJECT  pDriverObject;    &lt;br /&gt; PDEVICE_OBJECT  pDeviceObject;&lt;br /&gt;&lt;br /&gt; LARGE_INTEGER RegCookie;&lt;br /&gt;}&lt;br /&gt;DEVICE_CONTEXT, *PDEVICE_CONTEXT, **PPDEVICE_CONTEXT;&lt;br /&gt;&lt;br /&gt;PDEVICE_OBJECT  g_pDeviceObject  = NULL;&lt;br /&gt;PDEVICE_CONTEXT g_pDeviceContext = NULL;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#define FILE_DEVICE_MYREGFILTER 0x8000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NTSTATUS DriverInitialize(PDRIVER_OBJECT  pDriverObject,&lt;br /&gt;                       PUNICODE_STRING pusRegistryPath);&lt;br /&gt;NTSTATUS DriverEntry(PDRIVER_OBJECT  pDriverObject,&lt;br /&gt;                  PUNICODE_STRING pusRegistryPath);&lt;br /&gt;&lt;br /&gt;NTSTATUS RegistryCallback(PVOID CallbackContext, PVOID Argument1,&lt;br /&gt;                       PVOID Argument2);&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#ifdef ALLOC_PRAGMA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#pragma alloc_text (INIT, DriverInitialize)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#pragma alloc_text (INIT, DriverEntry)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-preprocessor&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NTSTATUS DeviceDispatcher(PDEVICE_CONTEXT pDeviceContext, PIRP pIrp)&lt;br /&gt;{&lt;br /&gt; PIO_STACK_LOCATION pisl;&lt;br /&gt; NTSTATUS ns = STATUS_NOT_IMPLEMENTED;&lt;br /&gt;&lt;br /&gt; pisl = IoGetCurrentIrpStackLocation(pIrp);&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;switch&lt;/span&gt; (pisl-&gt;MajorFunction)&lt;br /&gt; {&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; IRP_MJ_CREATE:&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; IRP_MJ_CLEANUP:&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; IRP_MJ_CLOSE:&lt;br /&gt;      &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; IRP_MJ_DEVICE_CONTROL:&lt;br /&gt;     {&lt;br /&gt;         ns = STATUS_SUCCESS;&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; pIrp-&gt;IoStatus.Status = ns;&lt;br /&gt; pIrp-&gt;IoStatus.Information = &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; IoCompleteRequest(pIrp, IO_NO_INCREMENT);&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; ns;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;NTSTATUS DriverDispatcher(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; (pDeviceObject == g_pDeviceObject ?&lt;br /&gt;     DeviceDispatcher(g_pDeviceContext, pIrp)&lt;br /&gt;     : STATUS_INVALID_PARAMETER_1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;VOID DriverUnload(PDRIVER_OBJECT pDriverObject)&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Stop filtering the registry&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;// Shouldn&#39;t be placed in the unload&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; CmUnRegisterCallback(g_pDeviceContext-&gt;RegCookie);&lt;br /&gt;&lt;br /&gt; IoDeleteSymbolicLink(&amp;usSymbolicLinkName);&lt;br /&gt; IoDeleteDevice(pDriverObject-&gt;DeviceObject);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;NTSTATUS DriverInitialize(PDRIVER_OBJECT pDriverObject,&lt;br /&gt;                       PUNICODE_STRING pusRegistryPath)&lt;br /&gt;{&lt;br /&gt; PDEVICE_OBJECT pDeviceObject = NULL;&lt;br /&gt; NTSTATUS ns = STATUS_DEVICE_CONFIGURATION_ERROR;&lt;br /&gt;&lt;br /&gt; RtlInitUnicodeString(&amp;usDeviceName, DeviceName);&lt;br /&gt; RtlInitUnicodeString(&amp;usSymbolicLinkName, SymLinkName);&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; ((ns = IoCreateDevice(pDriverObject, &lt;span class=&quot;cpp-keyword&quot;&gt;sizeof&lt;/span&gt; (DEVICE_CONTEXT),&lt;br /&gt;     &amp;usDeviceName, FILE_DEVICE_MYREGFILTER, &lt;span class=&quot;cpp-literal&quot;&gt;0&lt;/span&gt;, FALSE,&lt;br /&gt;     &amp;amp;pDeviceObject)) == STATUS_SUCCESS)&lt;br /&gt; {&lt;br /&gt;     &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; ((ns = IoCreateSymbolicLink(&amp;usSymbolicLinkName,&lt;br /&gt;         &amp;amp;usDeviceName)) == STATUS_SUCCESS)&lt;br /&gt;     {&lt;br /&gt;         g_pDeviceObject  = pDeviceObject;&lt;br /&gt;         g_pDeviceContext = pDeviceObject-&gt;DeviceExtension;&lt;br /&gt;&lt;br /&gt;         g_pDeviceContext-&gt;pDriverObject = pDriverObject;&lt;br /&gt;         g_pDeviceContext-&gt;pDeviceObject = pDeviceObject;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;     &lt;span class=&quot;cpp-keyword&quot;&gt;else&lt;/span&gt;&lt;br /&gt;     {&lt;br /&gt;         IoDeleteDevice(pDeviceObject);&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; ns;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,&lt;br /&gt;                  PUNICODE_STRING pusRegistryPath)&lt;br /&gt;{&lt;br /&gt; PDRIVER_DISPATCH *ppdd;&lt;br /&gt; NTSTATUS ns = STATUS_DEVICE_CONFIGURATION_ERROR;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; ((ns = DriverInitialize(pDriverObject, pusRegistryPath))&lt;br /&gt;                                                         == STATUS_SUCCESS)&lt;br /&gt; {&lt;br /&gt;     ppdd = pDriverObject-&gt;MajorFunction;&lt;br /&gt;&lt;br /&gt;     ppdd[IRP_MJ_CREATE                  ] =&lt;br /&gt;     ppdd[IRP_MJ_CREATE_NAMED_PIPE       ] =&lt;br /&gt;     ppdd[IRP_MJ_CLOSE                   ] =&lt;br /&gt;     ppdd[IRP_MJ_READ                    ] =&lt;br /&gt;     ppdd[IRP_MJ_WRITE                   ] =&lt;br /&gt;     ppdd[IRP_MJ_QUERY_INFORMATION       ] =&lt;br /&gt;     ppdd[IRP_MJ_SET_INFORMATION         ] =&lt;br /&gt;     ppdd[IRP_MJ_QUERY_EA                ] =&lt;br /&gt;     ppdd[IRP_MJ_SET_EA                  ] =&lt;br /&gt;     ppdd[IRP_MJ_FLUSH_BUFFERS           ] =&lt;br /&gt;     ppdd[IRP_MJ_QUERY_VOLUME_INFORMATION] =&lt;br /&gt;     ppdd[IRP_MJ_SET_VOLUME_INFORMATION  ] =&lt;br /&gt;     ppdd[IRP_MJ_DIRECTORY_CONTROL       ] =&lt;br /&gt;     ppdd[IRP_MJ_FILE_SYSTEM_CONTROL     ] =&lt;br /&gt;     ppdd[IRP_MJ_DEVICE_CONTROL          ] =&lt;br /&gt;     ppdd[IRP_MJ_INTERNAL_DEVICE_CONTROL ] =&lt;br /&gt;     ppdd[IRP_MJ_SHUTDOWN                ] =&lt;br /&gt;     ppdd[IRP_MJ_LOCK_CONTROL            ] =&lt;br /&gt;     ppdd[IRP_MJ_CLEANUP                 ] =&lt;br /&gt;     ppdd[IRP_MJ_CREATE_MAILSLOT         ] =&lt;br /&gt;     ppdd[IRP_MJ_QUERY_SECURITY          ] =&lt;br /&gt;     ppdd[IRP_MJ_SET_SECURITY            ] =&lt;br /&gt;     ppdd[IRP_MJ_POWER                   ] =&lt;br /&gt;     ppdd[IRP_MJ_SYSTEM_CONTROL          ] =&lt;br /&gt;     ppdd[IRP_MJ_DEVICE_CHANGE           ] =&lt;br /&gt;     ppdd[IRP_MJ_QUERY_QUOTA             ] =&lt;br /&gt;     ppdd[IRP_MJ_SET_QUOTA               ] =&lt;br /&gt;     ppdd[IRP_MJ_PNP                     ] = DriverDispatcher;&lt;br /&gt;     pDriverObject-&gt;DriverUnload           = DriverUnload;&lt;br /&gt;&lt;br /&gt;     &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;cpp-comment&quot;&gt;// Filter the registry&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     ns = CmRegisterCallback(RegistryCallback, g_pDeviceContext,&lt;br /&gt;                             &amp;g_pDeviceContext-&gt;RegCookie);&lt;br /&gt;&lt;br /&gt;     &lt;span class=&quot;cpp-keyword&quot;&gt;if&lt;/span&gt; (!NT_SUCCESS(ns)) IoDeleteDevice(g_pDeviceObject);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; ns;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;// Registry Filter Callback&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;NTSTATUS RegistryCallback(PVOID CallbackContext, PVOID Argument1,&lt;br /&gt;                       PVOID Argument2)&lt;br /&gt;{&lt;br /&gt; PDEVICE_CONTEXT pContext = (PDEVICE_CONTEXT) CallbackContext;&lt;br /&gt; REG_NOTIFY_CLASS Action  = (REG_NOTIFY_CLASS) Argument1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;switch&lt;/span&gt; (Action)&lt;br /&gt; {&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; RegNtPreDeleteKey:&lt;br /&gt;     {&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// Pre DeleteKey&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         PREG_DELETE_KEY_INFORMATION pInfo&lt;br /&gt;                             = (PREG_DELETE_KEY_INFORMATION) Argument2;&lt;br /&gt;&lt;br /&gt;         DbgPrint(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Delete Key\n&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// You can prevent this operation from happening&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// Without having the thread noticing it&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// Only on Windows Vista&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// return STATUS_CALLBACK_BYPASS;&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;case&lt;/span&gt; RegNtPreCreateKeyEx:&lt;br /&gt;     {&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// Pre CreateKey&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         PREG_CREATE_KEY_INFORMATION pInfo&lt;br /&gt;                             = (PREG_CREATE_KEY_INFORMATION) Argument2;&lt;br /&gt;&lt;br /&gt;         DbgPrint(&lt;span class=&quot;cpp-string&quot;&gt;&quot;Create Key\n&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;default&lt;/span&gt;:&lt;br /&gt;     {&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;// Return STATUS_SUCCESS&lt;/span&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-comment&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         &lt;span class=&quot;cpp-keyword&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span class=&quot;cpp-keyword&quot;&gt;return&lt;/span&gt; STATUS_SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;In this code sample I use DbgPrint to be notified of registry operations. On Vista the output of DbgPrint is disabled by default. If you want to enable it, follow &lt;a href=&quot;http://www.osronline.com/article.cfm?id=295&quot;&gt;these&lt;/a&gt; instructions.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Power_Management_&quot;&gt;Power Management &lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Power Management was improved in Vista, not only because new things have been introduced, but also because the Power Management for device driver programmers has been made easier. These &lt;a href=&quot;http://www.microsoft.com/whdc/system/pnppwr/powermgmt/default.mspx&quot;&gt;WinHec docs&lt;/a&gt; are a very good source to start from. One of the big news is the introduction of the Hybrid Sleep (the default off-mode). In this sleep mode the system image is written on a hybernation file on disk from where the system can be resumed. Drivers are notified of entering the Hybrid Sleep (S4 state) by IRP_MN_SET_POWER (Parameters.Power.State == PowerSystemHybernate). Use the SYSTEM_POWER_STATE_CONTEXT structure (Parameters.Power.SystemPowerStateContext) to determine the state transition process.&lt;/p&gt; &lt;p&gt;Also, it might not be very important, but I happened to read what follows. Silent shutdown cancellations (in user mode) are no longer allowed on Vista. This means that if your application gets a WM_QUERYENDSESSION and doesn&#39;t return TRUE (in order to let the system shut down), Vista will show a dialog box informing the user of this behavior.&lt;/p&gt; &lt;h2&gt;&lt;a name=&quot;.NET_Framework_3.0&quot;&gt;.NET Framework 3.0&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The .NET Framework 3.0 is shipped along with Vista. However, it can be &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=10cc340b-f857-4a14-83f5-25634c3bf043&amp;displaylang=en&quot;&gt;installed on XP SP2&lt;/a&gt; as well. To use the new technologies introduced by this new framework with your Visual Studio 2005, you&#39;ll need two extensions. One for the &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyId=F54F5537-CC86-4BF5-AE44-F5A1E805680D&amp;amp;displaylang=enx&quot;&gt;Windows Presentation Foundation (WPF) and Windows Communication Foundation (WCF)&lt;/a&gt;. And one for the &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=5D61409E-1FA3-48CF-8023-E8F38E709BA6&amp;displaylang=en&quot;&gt;Windows Workflow Foundation (WWF)&lt;/a&gt;. I cannot discuss these technologies extensively, of course, but I can try to give an insight to programmers who have never worked with them.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Windows_Presentation_Foundation&quot;&gt;Windows Presentation Foundation&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;I&#39;m very enthusiastic about this technology, but it takes a moment or two for old fashioned C/C++ programmers (like myself) to understand how it works. Basically, it&#39;s a new way of creating GUIs for desktop applications and web pages. The main difference from the old way, is that these GUIs are created through XAML (eXtensible Application Markup Language), a language based on XML. The advantages of using the WPF are many. You can use 2D/3D, audio, video, animations etc. in seconds. There are no more HWNDs, and all the work is delegated to the GPU. On &lt;a href=&quot;http://msdn2.microsoft.com/en-us/netframework/aa663326.aspx&quot;&gt;MSDN TV&lt;/a&gt; there are a few demonstrations of how through the WPF you can design beautiful and advanced GUIs. The WPF offers a very good separation between GUI development and the internal code implementation. Also, a lot of things can be achieved through XAML without having to use C#/VB code (smallWPF.zip download available at the top of the article)&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/smallwpf.jpg&quot; border=&quot;0&quot; height=&quot;450&quot; width=&quot;465&quot; /&gt;&lt;/p&gt; &lt;p&gt;In this little code sample I bind sliders to values of a listbox in order to change its appearance (position and shadow). What&#39;s so stunning is that the listbox can still be used, you can scroll it, select items, etc. I don&#39;t want to say that rotating a listbox is useful, but this is just a sample of what can be done. As I said, the slider are bound to values, this means that I didn&#39;t use code. Everything this application does is written in XAML. Here&#39;s all the code:&lt;/p&gt;&lt;div class=&quot;smallText&quot; id=&quot;premain38&quot; style=&quot;width: 100%;&quot;&gt;&lt;img preid=&quot;38&quot; src=&quot;http://www.codeproject.com/images/minus.gif&quot; id=&quot;preimg38&quot; height=&quot;9&quot; width=&quot;9&quot; /&gt;&lt;span preid=&quot;38&quot; style=&quot;margin-bottom: 0pt;&quot; id=&quot;precollapse38&quot;&gt; Collapse&lt;/span&gt;&lt;/div&gt;&lt;pre style=&quot;margin-top: 0pt;&quot; id=&quot;pre38&quot; lang=&quot;xml&quot;&gt;&lt;window class=&quot;SmallWPF.Window1&quot; xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot; x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot; title=&quot;SmallWPF&quot; height=&quot;339&quot; width=&quot;454&quot; my=&quot;clr-namespace:System;assembly=mscorlib&quot;&gt;&lt;br /&gt;&lt;grid&gt;&lt;br /&gt; &lt;border borderbrush=&quot;White&quot; borderthickness=&quot;5&quot; horizontalalignment=&quot;Center&quot; verticalalignment=&quot;Top&quot;&gt;&lt;br /&gt;   &lt;listbox width=&quot;200&quot; height=&quot;200&quot; name=&quot;listBox1&quot;&gt;&lt;br /&gt;     &lt;listboxitem&gt;Hello,&lt;/listboxitem&gt;&lt;br /&gt;     &lt;listboxitem isselected=&quot;True&quot;&gt;how are you?&lt;/listboxitem&gt;&lt;br /&gt;     &lt;listboxitem&gt;This&lt;/listboxitem&gt;&lt;br /&gt;     &lt;listboxitem&gt;is&lt;/listboxitem&gt;&lt;br /&gt;     &lt;listboxitem&gt;a&lt;/listboxitem&gt;&lt;br /&gt;     &lt;listboxitem&gt;3D&lt;/listboxitem&gt;&lt;br /&gt;     &lt;listboxitem&gt;ListBox!&lt;/listboxitem&gt;&lt;br /&gt;   &lt;/listbox&gt;&lt;br /&gt;   &lt;border.bitmapeffect&gt;&lt;br /&gt;     &lt;bitmapeffectgroup&gt;&lt;br /&gt;       &lt;dropshadowbitmapeffect color=&quot;Black&quot; direction=&quot;{Binding ElementName=MySlider4, Path=Value}&quot; shadowdepth=&quot;{Binding ElementName=MySlider5, Path=Value}&quot; softness=&quot;1&quot; opacity=&quot;0.5&quot;&gt;&lt;br /&gt;     &lt;/dropshadowbitmapeffect&gt;&lt;br /&gt;   &lt;/bitmapeffectgroup&gt;&lt;br /&gt;   &lt;border.rendertransform&gt;&lt;br /&gt;     &lt;transformgroup&gt;&lt;br /&gt;       &lt;skewtransform centerx=&quot;0&quot; centery=&quot;0&quot; anglex=&quot;{Binding ElementName=MySlider1, Path=Value}&quot; angley=&quot;{Binding ElementName=MySlider2, Path=Value}&quot;&gt;&lt;br /&gt;       &lt;rotatetransform angle=&quot;{Binding ElementName=MySlider3, Path=Value}&quot;&gt;&lt;br /&gt;     &lt;/rotatetransform&gt;&lt;br /&gt;   &lt;/skewtransform&gt;&lt;br /&gt; &lt;/transformgroup&gt;&lt;br /&gt; &lt;slider height=&quot;21&quot; margin=&quot;42,0,0,43&quot; name=&quot;MySlider1&quot; verticalalignment=&quot;Bottom&quot; horizontalalignment=&quot;Left&quot; width=&quot;104&quot; minimum=&quot;0&quot; maximum=&quot;50&quot;&gt;&lt;br /&gt; &lt;slider height=&quot;21&quot; margin=&quot;184,0,158,43&quot; name=&quot;MySlider2&quot; verticalalignment=&quot;Bottom&quot; width=&quot;104&quot; minimum=&quot;0&quot; maximum=&quot;50&quot;&gt;&lt;br /&gt; &lt;slider height=&quot;21&quot; margin=&quot;0,0,33,43&quot; name=&quot;MySlider3&quot; verticalalignment=&quot;Bottom&quot; horizontalalignment=&quot;Right&quot; width=&quot;104&quot; minimum=&quot;0&quot; maximum=&quot;50&quot;&gt;&lt;br /&gt; &lt;slider height=&quot;21&quot; margin=&quot;42,0,0,15&quot; name=&quot;MySlider4&quot; verticalalignment=&quot;Bottom&quot; width=&quot;104&quot; minimum=&quot;0&quot; maximum=&quot;200&quot; horizontalalignment=&quot;Left&quot;&gt;&lt;br /&gt; &lt;slider height=&quot;21&quot; margin=&quot;184,0,158,13&quot; name=&quot;MySlider5&quot; verticalalignment=&quot;Bottom&quot; width=&quot;104&quot; minimum=&quot;0&quot; maximum=&quot;100&quot;&gt;&lt;br /&gt;&lt;/slider&gt;&lt;br /&gt;&lt;/slider&gt;&lt;/slider&gt;&lt;/slider&gt;&lt;/slider&gt;&lt;/border.rendertransform&gt;&lt;/border.bitmapeffect&gt;&lt;/border&gt;&lt;/grid&gt;&lt;/window&gt;&lt;/pre&gt; &lt;p&gt;I used this code to bind a value to a slider:&lt;/p&gt;&lt;pre lang=&quot;xml&quot;&gt;AngleX=&quot;{Binding ElementName=MySlider1, Path=Value}&quot;&lt;/pre&gt; &lt;p&gt;ElementName is the name of the control to bind and Path is the property of the bound control which should be used to fill the value. In this case, the position of MySlider1 fills the AngleX field. I could also bind a control&#39;s behavior to C# code. But, of course, this is not the place to discuss every property of this technology. I just hope that this paragraph got you intrigued enough to make you want to read more about it.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Windows_Communication_Foundation&quot;&gt;Windows Communication Foundation&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;The WCF is an interface to design services. The background idea is unified programming model for already existing technologies: COM+ / .NET Enterprise services, MSMQ, .NET Remoting, ASP.NET Web Services, Web Services Enhancements (WSE). Moreover, the ability of intercommunication between these technologies handled by the WCF, without having the programmer to worry about it, through reliable and secure ways. From what I could read, it seems a very good final solution to all the problems we know from the past, since from now on the programmer doesn&#39;t have to think about the communication process itself, which is handled by the WCF, meaning he doesn&#39;t have to worry about which technology he is communicating with and where from. For more information, this is the official &lt;a href=&quot;http://wcf.netfx3.com/&quot;&gt;Windows Communication Foundation&lt;/a&gt; hompage. However, there are even more practical samples on codeproject.&lt;/p&gt; &lt;h3&gt;&lt;a name=&quot;Windows_Workflow_Foundation&quot;&gt;Windows Workflow Foundation&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;The WWF is a good way of formalizing workflow-based activities through visual items which are bound to code. Ok, this sounds strange, I&#39;ll try again. Basically, if you are a company and have to formalize a process of activities and want the comfort of having a visual model, then the WWF is what you are looking for. I can&#39;t talk about this subject extensively because I haven&#39;t used this technology extensively myself. However, since many programmers might wonder what this technology is all about, I&#39;ll try a simple understanding approach. Here&#39;s a workflow graph I made:&lt;/p&gt; &lt;center&gt;&lt;img src=&quot;http://www.codeproject.com/vista/vista_x64/smallwwf.jpg&quot; border=&quot;0&quot; height=&quot;456&quot; width=&quot;312&quot; /&gt;&lt;/center&gt; &lt;p&gt;As you can see, the graph is divided in single activities (very few, because I have no imagination). The activities can be bound through declarative rules. This means that if a have a condition that needs to be satisfied, I can declare the condition as a property. There are a many workflow components, each of them has its own properties. For instance, the code-workflow component can define a code function in a C# file, which is executed when it&#39;s the component turn of activity. In this little sample, the first activity is to wait for the user&#39;s input. After that, a declarative rule is set, which sub-divides the workflow in two separate activity flows.&lt;/p&gt; &lt;p&gt;I hope that, in spite of my terrible workflow model, you got the general purpose of the Windows Workflow Foundation. If you&#39;re interested in learning more, check out the &lt;a href=&quot;http://wf.netfx3.com/&quot;&gt;official homepage&lt;/a&gt; where you can also find a lot of &lt;a href=&quot;http://wf.netfx3.com/files/13/default.aspx&quot;&gt;code samples&lt;/a&gt;. As usual, there&#39;s plenty of guides about this subject.&lt;/p&gt; &lt;h2&gt;&lt;a name=&quot;Conclusions&quot;&gt;Conclusions&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;It&#39;s over now. I hope you enjoyed the article and didn&#39;t dislike the idea of such a general overview about two really extensive subjects like x64 and Windows Vista. I noticed during the writing that I had to put a lot of images in the article and that this might be problem for slow connections. I&#39;m sorry for that, but this is the direct consequence of not subdividing this paper in more articles.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 78%;&quot;&gt;Courtesy : http://www.codeproject.com&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/2513060173224100123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/2513060173224100123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/2513060173224100123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/2513060173224100123'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/windows-vista-x64.html' title='Windows Vista x64'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-1121117887230331258</id><published>2007-05-14T09:20:00.000-07:00</published><updated>2007-05-14T09:21:36.241-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><title type='text'>Google to Lose the FIRST Place Soon</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Google, the leader of the online search engines, is more and more challenged by other Internet companies that are aiming to build similar solutions with the ones developed by the search giant. In the recent period, the most threatened product is surely YouTube, the online video sharing service, acquired in October 2006 for $1.6 billion. Microsoft and News Corporation announced their plans to build a solution similar with the one powered by Google, aiming to lure the same segment of users. GodTube is also a YouTube competitor that was created to attract Christians and offer them church-related content. As a reply, Google created a special YouTube channel for bishops that will offer the same type of clips.&lt;br /&gt;     &lt;br /&gt;The most powerful news service on the Internet, Google News, is now challenged by MySpace News a similar solution that receives news from numerous sources. Just like the Google product, MySpace received headlines from several publications and organizes them on categories, offering a Digg-like functionality that enables users to vote the news. Although the solution was launched yesterday, it&#39;s obvious the company will have a new rival for the news service.&lt;br /&gt;&lt;br /&gt;Some days ago, the Checkout solution offered by Google received a new rival after Yahoo announced a deal with PayPal to allow users to buy products straight from the SERP. Using the new deal, the giant portal will include a product link on the search engine result page, offering a small checkout sign, enabling the visitors to buy stuff. As a reply, Google renamed it Froogle, the old shopping service to Product Search.&lt;br /&gt;&lt;br /&gt;Only one thing is sure: Google has numerous competitors in multiple domains but, this is surely a good thing especially for us, the users. The competition promotes better solution and better performance, creating new solutions.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/1121117887230331258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/1121117887230331258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/1121117887230331258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/1121117887230331258'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/google-to-lose-first-place-soon.html' title='Google to Lose the FIRST Place Soon'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-4676200661201120582</id><published>2007-05-14T09:16:00.000-07:00</published><updated>2007-05-14T09:22:26.774-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AJAX"/><category scheme="http://www.blogger.com/atom/ns#" term="Distributed Application"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Technology"/><title type='text'>AJAX - A New Technology for Web</title><content type='html'>&lt;table style=&quot;text-align: left; margin-left: 0px; margin-right: 0px;&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;97%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: justify;&quot;&gt;&lt;p&gt;&lt;strong&gt;Ajax&lt;/strong&gt;, shorthand for &lt;em&gt;Asynchronous JavaScript and XML&lt;/em&gt;, is a web development technique for creating interactive web applications. The intent is to make web pages feel more responsive by exchanging small amounts of data with the server behind the scenes, so that the entire web page does not have to be reloaded each time the user makes a change. This is meant to increase the web page&#39;s interactivity, speed, and usability.&lt;/p&gt;             &lt;p&gt;The Ajax technique uses a combination of&lt;/p&gt;             &lt;ul lastcheckbox=&quot;null&quot;&gt;&lt;li&gt;XHTML (or HTML) and CSS, for marking up and styling   information. &lt;/li&gt;&lt;li&gt;The DOM accessed with a client-side scripting language, especially ECMAScript implementations such as JavaScript and JScript, to dynamically display and interact with the information presented. &lt;/li&gt;&lt;li&gt;The XMLHttpRequest object is used to exchange data asynchronously with the web server. In some Ajax frameworks and in certain situations, an IFrame object is used instead of the XMLHttpRequest object to exchange data with the web server, and in other implementations, dynamically added &lt;script&gt;&lt;/script&gt; tags may be used. &lt;/li&gt;&lt;li&gt;XML is sometimes used as the format for transferring data between the server and client, although any format will work, including preformatted HTML, plain text, JSON and even EBML. These files may be created dynamically by some form of server-side scripting. &lt;/li&gt;&lt;/ul&gt;              &lt;p&gt;Like DHTML, LAMP and SPA, Ajax is not a technology in itself, but a term that refers to the use of a group of technologies together.&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;         &lt;/tr&gt;       &lt;tr&gt;         &lt;td&gt;&lt;p&gt; &lt;/p&gt;      &lt;br /&gt;&lt;/td&gt;       &lt;/tr&gt;       &lt;tr&gt;         &lt;td&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;           &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;Ajax is a new meme for an old concept - but what is it and   how has it changed since being defined?&lt;br /&gt;&lt;br /&gt;AJAX is not a new concept or even a single technology. It only gives a name to techniques that have been in use on the web for many years - techniques that eBusiness Applications is proud to have been developing with since 1998. &lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;           &lt;/div&gt;&lt;h2 style=&quot;text-align: justify;&quot; class=&quot;subtitle1&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Traditional Web Components&lt;/span&gt;&lt;/h2&gt;           &lt;p style=&quot;text-align: justify;&quot;&gt;In traditional web applications, interactions with the server require time-consuming page reloads. A user completes a web-form, clicks submit, waits for the entire page and all related data to refresh, and then resumes work.&lt;/p&gt;           &lt;h3 class=&quot;subtitle&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Positive Aspects:&lt;/span&gt;&lt;/h3&gt;           &lt;ul&gt;&lt;ul&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Produces web applications that have higher levels of compatibility with   legacy browsers and mobile systems. &lt;/li&gt;&lt;li&gt;Easy to implement using native HTML controls &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;           &lt;h3 class=&quot;subtitle&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Negative Aspects:&lt;/span&gt;&lt;/h3&gt;           &lt;ul&gt;&lt;ul&gt;&lt;li&gt;Workflow is continually interrupted by page refreshes. &lt;/li&gt;&lt;li&gt;Innefficient use of bandwidth.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXs2GR-l98Ml1730bgXq6nsiwGiuqsW7ykHQ9Al9lezDMWa57y3_LuCc9JbWZUkXM5gDEQM3lACA3AsRxXPEd1L7PpZ_rSDqQE3zkpJeMzPrYgzQNLF96TJJxbdsSNi3NmCaIrlXkDZaYM/s1600-h/traditionalmodel.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXs2GR-l98Ml1730bgXq6nsiwGiuqsW7ykHQ9Al9lezDMWa57y3_LuCc9JbWZUkXM5gDEQM3lACA3AsRxXPEd1L7PpZ_rSDqQE3zkpJeMzPrYgzQNLF96TJJxbdsSNi3NmCaIrlXkDZaYM/s320/traditionalmodel.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5059521837060583202&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;h2 class=&quot;subtitle1&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;AJAX Based Web Components&lt;/span&gt;&lt;/h2&gt;           &lt;p style=&quot;text-align: justify;&quot;&gt;In the case of software components that use an AJAX model,   requests are sent to the server only for the data that is needed, &lt;em&gt;not the   whole page&lt;/em&gt;. AJAX applications use the following technologies to facilitate   this process:&lt;/p&gt;           &lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;XML&lt;/strong&gt; data sources &lt;/li&gt;&lt;li&gt;&lt;strong&gt;XSLT&lt;/strong&gt; to transform data into HTML quickly &lt;/li&gt;&lt;li&gt;&lt;strong&gt;XMLHttpRequest&lt;/strong&gt; to perform asynchronous requests for data &lt;/li&gt;&lt;li&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;, &lt;strong&gt;HTML&lt;/strong&gt;, and &lt;strong&gt;DHTML&lt;/strong&gt; to display data on the web page &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;           &lt;h3 class=&quot;subtitle&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Positive Aspects:&lt;/span&gt;&lt;/h3&gt;           &lt;ul&gt;&lt;ul&gt;&lt;li&gt;Can produce smooth, uninterrupted user workflow. &lt;/li&gt;&lt;li&gt;Saves bandwidth by only transmitting new information. &lt;/li&gt;&lt;li&gt;Creates possibility of entirely new types of user interfaces not possible in   traditional model. &lt;/li&gt;&lt;li&gt;Doesn`t require 3rd party software like JAVA or Flash. &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;           &lt;h3 class=&quot;subtitle&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Negative Aspects:&lt;/span&gt;&lt;/h3&gt;           &lt;ul&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Can be difficult to implement WAI and other accessibility guidelines, including compability with text-to-speech devices for the blind, and other assistive technologies. &lt;/li&gt;&lt;li&gt;Poor compatibility with very old or obscure browsers, and many mobile   devices.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2BO5UbcQpGaugqn0yzBizDc3NGTmzP5nToeH5386tZqFinKCGL3yflQqcwGG_2kC97kxlDb2mQpVNqA7E3SskDuCdacmu4a-z8EcUirOLn-V1Bds2Yyl-Ag1isRowfCd214BRjStYuED7/s1600-h/ajaxmodel.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2BO5UbcQpGaugqn0yzBizDc3NGTmzP5nToeH5386tZqFinKCGL3yflQqcwGG_2kC97kxlDb2mQpVNqA7E3SskDuCdacmu4a-z8EcUirOLn-V1Bds2Yyl-Ag1isRowfCd214BRjStYuED7/s320/ajaxmodel.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5059522124823392050&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;                              &lt;span style=&quot;font-size:78%;&quot;&gt;&lt;strong&gt;Courtesy:&lt;/strong&gt; Wikipedia&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/4676200661201120582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/4676200661201120582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/4676200661201120582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/4676200661201120582'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/ajax-new-technology-for-weba.html' title='AJAX - A New Technology for Web'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXs2GR-l98Ml1730bgXq6nsiwGiuqsW7ykHQ9Al9lezDMWa57y3_LuCc9JbWZUkXM5gDEQM3lACA3AsRxXPEd1L7PpZ_rSDqQE3zkpJeMzPrYgzQNLF96TJJxbdsSNi3NmCaIrlXkDZaYM/s72-c/traditionalmodel.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-1040829233526583365</id><published>2007-05-14T09:13:00.000-07:00</published><updated>2007-05-14T09:14:57.144-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AJAX"/><category scheme="http://www.blogger.com/atom/ns#" term="Distributed Application"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Technology"/><title type='text'>What is AJAX?</title><content type='html'>&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom: 0.0001pt; line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;AJAX is a not a new technology used in web development. This statement is encouraged by the endless news articles showing sites made with AJAX. In fact AJAX is neither new, nor a technology. It can be seen as a mix of several popular technologies put together to build a friendlier web.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;  &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom: 0.0001pt; line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The name itself is an acronym for &lt;b&gt;A&lt;/b&gt;synchronous &lt;b&gt;JA&lt;/b&gt;vaScript and &lt;b&gt;X&lt;/b&gt;ML, which already contains two technologies and a technique for loading information. The name was coined by Jesse James Garrett in &lt;/span&gt;&lt;a href=&quot;http://www.adaptivepath.com/publications/essays/archives/000385.php&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; color: blue;&quot;&gt;this essay&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt; from the Adaptive Path website.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom: 0.0001pt; line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;In this mix, XML is used to store and move information between the client and server, HTML and CSS to format the output and JavaScript to bind all of these elements together in a dynamic manner.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom: 0.0001pt; line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The asynchronous part comes from the fact that when a change has to be made to the current page (the user clicks on a link, or submits some information), only the part to change is transferred from the server, and not the entire page.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom: 0.0001pt; line-height: normal; text-align: justify;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Besides these, AJAX is about much more:&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;ul style=&quot;text-align: justify;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot; style=&quot;line-height: normal;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The way information is displayed in a browser - using HTML/XHTML and CSS. To present information to the client, you still need to use the language that browsers understand: HTML for content and CSS for layout and formatting.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;MsoNormal&quot; style=&quot;line-height: normal;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;In the age of dynamic websites, displaying content is not enough. You have to first retrieve it from a dynamic data source, and process it for final output. This is where XML and XSLT come into play.Tip: Not familiar with XML and XSLT? Read more &lt;/span&gt;&lt;a href=&quot;http://www.macromedia.com/devnet/dreamweaver/articles/xml_overview.html&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; color: blue;&quot;&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;MsoNormal&quot; style=&quot;line-height: normal;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Getting the information from the server and in the user&#39;s browser is the next step. The XMLHttpRequest JavaScript object is used for this part. This JavaScript object will be covered in detail later on this article.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;MsoNormal&quot; style=&quot;line-height: normal;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Once the information is displayed you need to modify it dynamically. For this you will use the Document Object Model (or DOM, for short). To provide dynamics to a static HTML page, DOM manipulation is used to alter the properties of already created page elements. It is done through JavaScript and allows (for example) a div element to become visible, or a button to gray-out when a certain selection has been made.Tip: To learn more about the Document Object Model check out this article from &lt;/span&gt;&lt;a href=&quot;http://www.w3schools.com/w3c/w3c_dom.asp&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; color: blue;&quot;&gt;W3 Consortium&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;MsoNormal&quot; style=&quot;line-height: normal;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The glue that holds all these elements together is JavaScript. This allows retrieving dynamic information, displaying and modifying the page elements. JavaScript is a lightweight programming language used to perform various tasks on the web client.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The notion AJAX has come to define a development framework which aims to improve web page usability.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;As you can see from the list above, none of the technologies used within AJAX are new. What is new is the way these technologies are used together to create new types of web applications that are much more responsive and intuitive than the existing ones. To illustrate this, just have a look at &lt;/span&gt;&lt;a href=&quot;http://www.gmail.com/&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; color: blue;&quot;&gt;Gmail&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt; and &lt;/span&gt;&lt;a href=&quot;http://maps.google.com/&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; color: blue;&quot;&gt;Google Maps&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;. The user interfaces are quick in providing the user with the desired information, while performing the minimum of page reloads possible.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;  &lt;/div&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;This new approach to user interaction and application responsiveness is part of a wider technology trend, aimed at making the Internet more friendly and faster.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/1040829233526583365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/1040829233526583365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/1040829233526583365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/1040829233526583365'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/what-is-ajax.html' title='What is AJAX?'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-694899070343816794</id><published>2007-05-14T09:12:00.000-07:00</published><updated>2007-05-14T09:13:32.361-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><title type='text'>Google GEMS</title><content type='html'>&lt;p style=&quot;text-align: justify;&quot;&gt; Google provides very simple Interface, with most powerful &amp; faster way to fine the relevant information on the Internet. Apart from the Google search, Gmail, Google also provides more technologies to make our life easier.&lt;br /&gt;         &lt;br /&gt;        This article will explore some of the Google’s technologies,  which are less known to the most Google users.&lt;br /&gt;     &lt;br /&gt;        &lt;span style=&quot;font-weight: bold;&quot; class=&quot;articletitle&quot;&gt;Google Calculator&lt;/span&gt;&lt;br /&gt;Google search provides calculator function by default to solve complex problems. For any calculations just go to google.com and type in the value for the calculation.&lt;br /&gt;        &lt;span class=&quot;articleex&quot;&gt;Ex: &lt;/span&gt;7567 + 358&lt;br /&gt;     &lt;br /&gt;        &lt;span style=&quot;font-weight: bold;&quot; class=&quot;articletitle&quot;&gt;Google Currency Conversion&lt;/span&gt;&lt;br /&gt;Like Google calculator, Google currency converter function is provided by default in Google earth to know the currency conversion or equivalent of any value.&lt;br /&gt;        &lt;span class=&quot;articleex&quot;&gt;Ex:&lt;/span&gt; 20 US$ in Indian Money.&lt;br /&gt;     &lt;br /&gt;        &lt;span style=&quot;font-weight: bold;&quot; class=&quot;articletitle&quot;&gt;Google Trends &lt;/span&gt;&lt;br /&gt;Google trends graphs the popularity of particular search terms over time. Results are displayed by city, region or language.&lt;br /&gt;        &lt;a href=&quot;http://www.google.com/trends&quot; target=&quot;_blank&quot;&gt;http://www.google.com/trends&lt;/a&gt;&lt;br /&gt;     &lt;br /&gt;        &lt;span style=&quot;font-weight: bold;&quot; class=&quot;articletitle&quot;&gt;Google special searches&lt;/span&gt;&lt;br /&gt;         Google’s special search narrows our search on to specific  topics.&lt;br /&gt;        &lt;span class=&quot;articleex&quot;&gt;Ex:&lt;/span&gt; Windows specific search&lt;br /&gt;        &lt;a href=&quot;http://www.google.com/microsoft.html&quot; target=&quot;_blank&quot;&gt;http://www.google.com/microsoft.html&lt;/a&gt;&lt;br /&gt;        &lt;a href=&quot;http://www.google.com/linux&quot; target=&quot;_blank&quot;&gt;http://www.google.com/linux&lt;/a&gt;&lt;br /&gt;        &lt;a href=&quot;http://www.google.com/mac.html&quot; target=&quot;_blank&quot;&gt;http://www.google.com/mac.html&lt;/a&gt;&lt;br /&gt;     &lt;br /&gt;        &lt;span style=&quot;font-weight: bold;&quot; class=&quot;articletitle&quot;&gt;Google Sketchup&lt;/span&gt;&lt;br /&gt;         &lt;a href=&quot;http://sketchup.google.com/&quot; target=&quot;_blank&quot;&gt;http://sketchup.google.com&lt;/a&gt;&lt;br /&gt;        Google sketchup is a very simple 3d sketching application to  models 3d objects quickly &amp; easily.&lt;/p&gt;&lt;div&gt;             &lt;/div&gt;&lt;p style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot; class=&quot;articletitle&quot;&gt;Google Page Creation&lt;/span&gt;&lt;br /&gt;             Google page creator helps us to create page our own web  pages.&lt;br /&gt;            &lt;a href=&quot;http://pages.google.com/&quot; target=&quot;_blank&quot;&gt;http://pages.google.com&lt;/a&gt;&lt;br /&gt;         &lt;br /&gt;            &lt;span style=&quot;font-weight: bold;&quot; class=&quot;articletitle&quot;&gt;Google Spread Sheet&lt;/span&gt;&lt;br /&gt;             &lt;a href=&quot;http://spreadsheets.google.com/&quot; target=&quot;_blank&quot;&gt;http://spreadsheets.google.com&lt;/a&gt;&lt;br /&gt;         &lt;br /&gt;            &lt;span style=&quot;font-weight: bold;&quot; class=&quot;articletitle&quot;&gt;Google Calendar&lt;/span&gt;&lt;br /&gt;             &lt;a href=&quot;http://www.google.com/calendar/render&quot; target=&quot;_blank&quot;&gt;http://www.google.com/calendar/render&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/694899070343816794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/694899070343816794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/694899070343816794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/694899070343816794'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/google-gems.html' title='Google GEMS'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-4429202042599012983</id><published>2007-05-14T09:10:00.000-07:00</published><updated>2007-05-14T09:12:03.054-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="OS"/><title type='text'>Google OS by 2010</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Wishful thinking? Yes, but let&#39;s consider the possibilities. The last couple years have seen significant advances in hardware production and design. One of the more interesting (and potentially revolutionary) developments to take place this past year is the announcement of a new CPU, the STI (Sony, Toshiba, IBM) Cell processor.&lt;br /&gt;&lt;br /&gt;Acting like several CPUs in one, the Cell will be able to power multiple operating systems at once, as well as bear the heavy computing load that a single system can place on the CPU. These past couple years have also seen significant shifts in the direction that computers and their operating systems are to take. Phones, computers, gaming systems, and entertainment centers are becoming more complex, more integrated with each other and the distinction between these devices are becoming more and more blurred. Modern operating systems are reflecting this shift as well, supporting VoiP, integrating audio and video with IM and email, etc. With the maturity of the cell processor, tech manufacturers have the opportunity to combine these functions completely on a single home machine, with dedicated processors or cores for each task, and perhaps dedicated operating systems--or environments--to enhance task performance and simplify the interface.&lt;br /&gt;&lt;br /&gt;As hardware complexity increases, a simpler, more elegant and straightforward computing interface will likely emerge, separating media from computing, design and multimedia work from office work, with all tied to the Web. With multimedia and gaming relegated to their own places--all of which can operate simultaneously without interfering with one another (thanks to Cell)--there is no need for one beastly, complicated interface to control them all. Each environment can have its own simple, straightforward interface, and the Cell will ensure ease of mobility between environments without disturbing the workflow of any particular environment.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;faqtitle&quot;&gt;Enter Google &lt;/span&gt;&lt;br /&gt;This is Google&#39;s specialty: a simple, easy to use interface, accessible to all levels of users. Though there is no indication that anything like this is in the works, one can easily imagine a streamlined Google OS on its own hard disk partition, separated from the entertainment, gaming, and media production environments. In addition to Google&#39;s signature services—a high-powered internet, media, and local disk search engine—it would likely consist of an office suite, a lean web browser, and various other applications and utilities. Consider the technology already at Google&#39;s disposal. Start with the world&#39;s best search engine with access to the largest body of searchable information and media. Add Gmail: a clean, JavaScript-based application, stored on a server, accessed via the internet, from which a user can not only compose, read, organize, and search their email, but also quickly access Google&#39;s search and other services. Now, look at Google News: a world of online news sources, which can be customized to an individual users preferences. Throw in Google&#39;s desktop search, the Picasa photo software, and Firefox (Mozilla and Google have significant overlap in their employed workforces) with live bookmarks, and cool research extensions such as dictionary and thesaurus lookup, linky, launchy, and the like. Extend all of this technology to typical desktop applications like office software, then combine them all into one interface and bundle the OS. Simple, powerful, and totally Google.&lt;br /&gt;&lt;br /&gt;Let&#39;s take it one step further. Imagine that all of this software—like the Google search engine, Gmail, etc.—is stored on Google&#39;s notoriously well-backed-up servers and operates at relatively high speed with any internet connection, thanks to its simplicity and javascript code base. Supported by unobtrusive (sometimes even helpful) ads, and hosted on a distant server, this is free, convenient, and accessible from ANY computer, anywhere, anytime. Additionally, you have the world&#39;s best IT department working on your behalf to protect your software, its accessibility, and its security. No viruses, no worms, no corrupted disks.&lt;br /&gt;&lt;br /&gt;Let&#39;s say they go even further: Google gives you, say, 1000GB on their servers, hosts all your data (with multiple levels of permissions), and provides everything mentioned above, and extends their video search (currently in beta) to provide access to a wealth of streaming audio (like iTunes radio) and video. All of it is free, all of it is easily accessible through a powerful, extensible web browser, and all of it simple and easy to use (it&#39;s still Google, remember). What are the implications of such a system? First, no more purchasing software (at least not the consumer grade applications hosted on the server); second, companies actually competing for your business (Google would surely be followed by the other major players); third, your work is finally mobile.&lt;br /&gt;&lt;br /&gt;Students can more comfortably use computer labs, knowing that everything will be right where they left it, no matter what machine they use. You can replace a machine without copying and reconfiguring everything. Any web-enabled computer can handle most home users&#39; desktop computing needs with relative consistency. You can experiment with or switch to a new operating system (Yahoo, MSN, .Mac) without buying a new machine or partitioning your hard drive. Ads--not consumers--pay for consumer-grade software, and since more apps will be web-based, you can try out these proprietary programs on any machine at no cost, and without the process of downloading and installing. And, as creepy as it may sound to leave your data permanently on a server, this would actually be more secure than the data on many computers out there today.&lt;br /&gt;&lt;br /&gt;Now for the fun. Right now, open source programs like Firefox boast some killer extensions that make browsing a lot more fun and a lot more productive. Imagine the kinds of plug-ins and extensions one could write for this Google OS, were it based on open standards (this past week, Google released much of its code as open source, and posted some key APIs at code.google.com). Perhaps you mouse over a URL, and a preview of the page pops up in the corner. A couple mouse clicks or a keyboard shortcut puts a graphic or media clip from the web right into your slide presentation. When working on a research project, you can bookmark sites of interest right into the outline of your paper. Or imagine a database of freely-downloadable music, from top artists, television shows, news videos, etc., paid for by inconspicuous Google text ads.&lt;br /&gt;&lt;br /&gt;Every user could have a personal database where you can put information about yourself, with varying permission levels. Anytime your screen name shows up in an email, a letter, a website, mousing over it will preview your data. If someone not in your access list does this, it merely shows a link to your home page. For those in your address book, it shows your full name, location, a flattering picture (maybe it&#39;s even one of you!), and links to your blog and your favorite websites and activities. For certain close friends and family members, your phone number, IM account, and email address popup, so they can communicate with you instantly with one click. Any document you create can be instantly uploaded to a community database, indexed by Google, and accessed by anyone, or only those of your choosing. And not just text documents and spreadsheets. Oh, no. Posters, magazines, songs, animated shorts, even feature-length movies! All powered by software hosted on the servers, paid for by ads just like the ones you already have in your Gmail account and your Google searches. And for projects requiring professional software running on a studio machine, the server can still act as a central storage area—tied to a webpage outlining the project details and timeline—where files can be checked in and out as various project members work on them.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/4429202042599012983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/4429202042599012983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/4429202042599012983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/4429202042599012983'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/google-os-by-2010.html' title='Google OS by 2010'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8858753366790500904.post-2601358744027738509</id><published>2007-05-11T10:26:00.000-07:00</published><updated>2007-05-11T10:27:50.484-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AJAX"/><category scheme="http://www.blogger.com/atom/ns#" term="Distributed Application"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Technology"/><title type='text'>AJAX - Overtaking Desktop Applications</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The domain where desktop applications beat web applications hands-down is user interaction. In desktop applications, you do not have to wait and stare at a blank screen (most of the time) until an action completes. The user interface is integrated with the actual application and allows instantaneous response. In classic web applications, when some information is submitted or requested you have to wait for an entire new page to load.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The key word that might just change all of that and bring desktop response times to the web is AJAX. This is THE buzz word on the Internet nowadays, appearing everywhere.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Some voices say it&#39;s a good thing that will revolutionize the web, while others argue that it is already a dead technology that will never yield anything useful. To truly understand what AJAX is all about, you need to spend some time and browse through a hand-full of articles.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Without covering in detail every little aspect of AJAX, this article will try to shed some light on what AJAX really is, where you should use it and where you shouldn&#39;t. No special prerequisite knowledge is required in order to follow this article, but some notions of HTML, CSS and JavaScript will come in handy.&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://onlinestuffs2u.blogspot.com/feeds/2601358744027738509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8858753366790500904/2601358744027738509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/2601358744027738509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8858753366790500904/posts/default/2601358744027738509'/><link rel='alternate' type='text/html' href='http://onlinestuffs2u.blogspot.com/2007/05/ajax-overtaking-desktop-applications.html' title='AJAX - Overtaking Desktop Applications'/><author><name>Kumaravel P</name><uri>http://www.blogger.com/profile/15064488828866664558</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>