<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1650318142382098495</id><updated>2012-03-12T13:04:28.787-07:00</updated><title type='text'>Sam's Code</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-7846757551038028722</id><published>2012-03-07T17:23:00.002-08:00</published><updated>2012-03-08T10:48:22.247-08:00</updated><title type='text'>How to Setup a KD (Kernel Deugger) in Windows With 1394 or Over the Network</title><content type='html'>Lets say you are starting to write drivers and need some kernel mode (km) debugging, or lets say&amp;nbsp;you've&amp;nbsp;decided that user mode (UM) debugging using windbg on the host is for sissies. &amp;nbsp;In this post I will show you how to setup a KD.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Assumptions:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;You will need two machines: the &lt;b&gt;TARGET&lt;/b&gt;&amp;nbsp;machine that you want to debug, and the&amp;nbsp;&lt;b&gt;HOST&lt;/b&gt;&amp;nbsp;machine that you will be doing the actual debugging.&lt;br /&gt;&lt;br /&gt;First thing you need to do is install windbg on both the target and host. &amp;nbsp;You can find the installer &lt;a href="http://msdn.microsoft.com/en-us/windows/hardware/gg463009" target=""&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Pick a You KD Method:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Next decide what kind of debugging you want to do. &amp;nbsp;The options are:&lt;br /&gt;NET (i.e. debugging over a TCP/IP network just using NICs) (supported on Win8+),&lt;br /&gt;1394 (supported on WinXP+),&lt;br /&gt;COM (serial) (supported since the dawn of KD), or&lt;br /&gt;USB (2.0 supported on Vista+, 3.0 in Win8+)&lt;br /&gt;&lt;br /&gt;Generally the port you use is decided for you based on what OS you need to debug, and what hardware your machines have. &amp;nbsp;I will make it simple, use 1394 (aka firewire) if you can,&amp;nbsp;or if the machines aren't close, net. &lt;br /&gt;&lt;br /&gt;If you two machines are next to each other favor 1394. &amp;nbsp;If you are going to be kernel debugging often and don't have 1394 in your machines, buy some cards. &amp;nbsp;1394 is simple and fast. &lt;br /&gt;&lt;br /&gt;If your target isn't close to your debugger machine, use net, short for network, debugging, but note it is a Win8+ feature at the moment. &amp;nbsp;Net debugging is also great for getting someone else to remote debug something. &amp;nbsp;Also in Win8, over 90+% of the mainstream NICs are supported for net debugging; most Intel, Broadcom, and Realtek NICs are supported. &lt;br /&gt;&lt;br /&gt;COM is slow, but works assuming your machines have serial ports. &lt;br /&gt;&lt;br /&gt;USB might be a choice if your USB&amp;nbsp;controllers&amp;nbsp;support kernel debugging. &amp;nbsp;In my&amp;nbsp;experience, they&amp;nbsp;rarely&amp;nbsp;do. &amp;nbsp;This is&amp;nbsp;especially&amp;nbsp;true when the machine doesn't have 1394 and you can't net debug. &amp;nbsp;You are kind of screwed at this point. &amp;nbsp;The joke is even funnier when you do find a port that does support KD, but it is internally wired to the built in webcam, or doesn't have an external port.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Setting Up a 1394 KD&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TARGET&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;open a command prompt&lt;/li&gt;&lt;li&gt;bcdedit -debug on&lt;/li&gt;&lt;li&gt;bcdedit -dbgsettings 1394 channel:&lt;span style="background-color: yellow;"&gt;1&lt;/span&gt;&lt;br /&gt;- you will have to pass bus params if you have more than one 1394 controler)&lt;br /&gt;- channel can be 1-62&lt;/li&gt;&lt;li&gt;reboot&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HOST&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;plug in 1394 cable into target and host&lt;/li&gt;&lt;li&gt;open a command prompt&lt;/li&gt;&lt;li&gt;kd -k 1394:channel=&lt;span style="background-color: yellow;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;windbg work instead of kd as well&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Setting Up a NET KD&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;TARGET&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;open a command prompt&lt;/li&gt;&lt;li&gt;bcdedit -dbgsettings net hostip:&lt;span style="background-color: yellow;"&gt;192.168.1.11&lt;/span&gt; port:&lt;span style="background-color: lime;"&gt;50000&lt;/span&gt;&lt;br /&gt;- for hostip, put your machine's IP instead of&amp;nbsp;&lt;span style="background-color: yellow;"&gt;192.168.1.11&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;- you can pick whatever &lt;/span&gt;&lt;span style="background-color: lime;"&gt;TCP port&lt;/span&gt;&lt;span style="background-color: white;"&gt; you want as long it is between&amp;nbsp;&lt;/span&gt;49151 and 65536.&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;It will output something like:&lt;br /&gt;"Key=&lt;/span&gt;&lt;span style="background-color: cyan;"&gt;aaaaaaaaaaaaa.vvvvvvvvvvvvv.yyyyyyyyyyyyy.xxxxxxxxxxxxx&lt;/span&gt;&lt;span style="background-color: white;"&gt;"&lt;br /&gt;Save that string in a text file to a thumb drive or network share, you will need it again on the host&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;bcdedit -debug on&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;reboot&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;HOST&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;open a command prompt&lt;/li&gt;&lt;li&gt;windbg -k net:port=&lt;span style="background-color: lime;"&gt;50000&lt;/span&gt;,key=&lt;span style="background-color: cyan;"&gt;aaaaaaaaaaaaa.vvvvvvvvvvvvv.yyyyyyyyyyyyy.xxxxxxxxxxxxx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;you can use kd instead of windbg if you want&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-7846757551038028722?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/7846757551038028722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2012/03/how-to-setup-kd-kernel-deugger-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7846757551038028722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7846757551038028722'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2012/03/how-to-setup-kd-kernel-deugger-in.html' title='How to Setup a KD (Kernel Deugger) in Windows With 1394 or Over the Network'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-2314287502032978380</id><published>2012-03-02T13:24:00.000-08:00</published><updated>2012-03-12T13:04:28.807-07:00</updated><title type='text'>Debugging Heap Failures</title><content type='html'>Sometimes heap failures can be mysterious, but they don't have to be. &amp;nbsp;For instance, today I got this kd (kernel debugger) break.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Output of !analyze -v&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;*******************************************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Exception Analysis &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;*******************************************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Loading symbols for 680c0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;component.dll -&amp;gt; &amp;nbsp;&amp;nbsp;component&amp;nbsp;.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Loading symbols for 75fb0000 &amp;nbsp; &amp;nbsp; KERNEL32.DLL -&amp;gt; &amp;nbsp; KERNEL32.DLL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Force unload of C:\Windows\SYSTEM32\user32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Loading symbols for 76680000 &amp;nbsp; &amp;nbsp; &amp;nbsp; user32.dll -&amp;gt; &amp;nbsp; user32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ModLoad: 76680000 767a1000 &amp;nbsp; C:\Windows\SYSTEM32\user32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Force unload of C:\Windows\system32\ole32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Loading symbols for 76560000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ole32.dll -&amp;gt; &amp;nbsp; ole32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ModLoad: 76560000 76672000 &amp;nbsp; C:\Windows\system32\ole32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Debugger Dbgportaldb Connection::Open failed 80040e4d&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Database Dbgportaldb not connected&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FAULTING_IP:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ntdll!RtlReportCriticalFailure+33&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;001b:77d912d6 cc &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int &amp;nbsp; &amp;nbsp; 3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;EXCEPTION_RECORD: &amp;nbsp;ffffffff -- (.exr 0xffffffffffffffff)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ExceptionAddress: 77d912d6 (ntdll!RtlReportCriticalFailure+0x00000033)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;ExceptionCode: 80000003 (Break instruction exception)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ExceptionFlags: 00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;NumberParameters: 3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;Parameter[0]: 00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;Parameter[1]: 83b70d40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;Parameter[2]: 0000fffd&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} &amp;nbsp;Breakpoint &amp;nbsp;A breakpoint has been reached.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;EXCEPTION_PARAMETER1: &amp;nbsp;00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;EXCEPTION_PARAMETER2: &amp;nbsp;83b70d40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;EXCEPTION_PARAMETER3: &amp;nbsp;0000fffd&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;NTGLOBALFLAG: &amp;nbsp;0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;APPLICATION_VERIFIER_FLAGS: &amp;nbsp;0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;APP: &amp;nbsp;ntkrpamp.exe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;LAST_CONTROL_TRANSFER: &amp;nbsp;from 77d924a1 to 77d912d6&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FAULTING_THREAD: &amp;nbsp;ffffffff&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;BUGCHECK_STR: &amp;nbsp;APPLICATION_FAULT_ACTIONABLE_HEAP_CORRUPTION_&lt;span style="background-color: yellow;"&gt;heap_failure_lfh_bitmap_mismatch&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;PRIMARY_PROBLEM_CLASS: &amp;nbsp;ACTIONABLE_HEAP_CORRUPTION_heap_failure_lfh_bitmap_mismatch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;DEFAULT_BUCKET_ID: &amp;nbsp;ACTIONABLE_HEAP_CORRUPTION_heap_failure_lfh_bitmap_mismatch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;STACK_TEXT:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f520 77d924a1 c0000374 77dc0130 0225f564 ntdll!RtlReportCriticalFailure+0x33&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f530 77d9168d 00000002 934d01f7 00000016 ntdll!RtlpReportHeapFailure+0x21&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f564 77d6434b 0000000e 00ce0000 00dd22d0 ntdll!RtlpLogHeapFailure+0xa2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f604 77cc3561 00000050 00fa6728 00000000 ntdll!RtlpLowFragHeapAllocFromContext+0x2d4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f68c 680ca40f 00ce0000 00000000 00000050 ntdll!RtlAllocateHeap+0x105&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f6d4 680c981a 00fa6728 00d4b774 00000000&amp;nbsp;component&amp;nbsp;!DoMoreWork+0x37&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f768 680c8f84 00000001 00d4b774 00000000&amp;nbsp;component&amp;nbsp;!DoWork+0xce&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f918 680d0169 00d27c48 02483530 02483590&amp;nbsp;component&amp;nbsp;!Query+0x12b&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f92c 77cf5935 00d4d170 00000000 02483530&amp;nbsp;component&amp;nbsp;!WorkDispatchThreadProc+0x99&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225fa70 77cd9139 0225fad4 02483590 934d08cb ntdll!TppWorkpExecuteCallback+0x338&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225fc58 75fb2a32 00cef980 0225fca4 77d0cdfe ntdll!TppWorkerThread+0x6da&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225fc64 77d0cdfe 00cef980 934d0837 00000000 KERNEL32!BaseThreadInitThunk+0xe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225fca4 77d0cdaa ffffffff 77d88566 00000000 ntdll!__RtlUserThreadStart+0x4a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225fcb4 00000000 77d0d633 00cef980 00000000 ntdll!_RtlUserThreadStart+0x1c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;1: kd&amp;gt; .frame 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;02 0225f564 77d6434b ntdll!RtlpLogHeapFailure+0xa2 [d:\5858\minkernel\ntos\rtl\heaplog.c @ 672]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;1: kd&amp;gt; dv&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f56c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FailureType = &lt;span style="background-color: yellow;"&gt;heap_failure_lfh_bitmap_mismatch&lt;/span&gt; (0n14)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f570 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HeapAddress = &lt;span style="background-color: lime;"&gt;0x00ce0000&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f574 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Address = 0x00dd22d0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f578 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Param1 = 0x00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f57c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Param2 = 0x00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;0225f580 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Param3 = 0x00000000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;My code in question is uninteresting:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp; &amp;nbsp; pData =(PDATA)&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;HeapAlloc(GetProcessHeap(),0, &lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;(DATA) *m_cData);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(!pData) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr =E_OUTOFMEMORY;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;goto&lt;/span&gt; Exit;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;//////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;So what is a&amp;nbsp;HEAP_FAILURE_LFH_BITMAP_MISMATCH? &amp;nbsp;I wasn't sure, so I had to find out. &amp;nbsp;First off LFH refers to the Low-Fragmentation Heap which became the default in Windows Vista; you can read more about &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v=vs.85).aspx"&gt;here&lt;/a&gt;. &amp;nbsp;Basically the LFH uses bitmap masks to track whether blocks are free or busy. &amp;nbsp;This information is also available in each LFH block's metadata. &amp;nbsp;This failure indicates that the busy status between these two do not agree and is therefore corrupted. &amp;nbsp;This still doesn't solve the mystery. &amp;nbsp;Luckily&amp;nbsp;there is a debugger extension help us find more clues, !heap.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;/////////////////////////////////////////////////////////////&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;1: kd&amp;gt; !heap -triage &lt;span style="background-color: lime;"&gt;ce0000&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;**************************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HEAP ERROR DETECTED &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;**************************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Details:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Heap address: &amp;nbsp;00ce0000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Error address: 00dd22d0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Error type: &amp;nbsp; &amp;nbsp;HEAP_FAILURE_LFH_BITMAP_MISMATCH&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Details: &amp;nbsp; &amp;nbsp; &amp;nbsp; The LFH detected a mismatch between an individual&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;block's metadata and its corresponding subsegment's&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;metadata.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Follow-up: &amp;nbsp; &amp;nbsp; Enable pageheap.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Error type: Unrecognized failure.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Follow-up: &amp;nbsp;This may be a bug in the extension. Send a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; remote or dump to ______.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Stack trace:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 77d6434b: ntdll!RtlpLowFragHeapAllocFromContext+0x000002d4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 77cc3561: ntdll!RtlAllocateHeap+0x00000105&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 680ca40f: component!DoMoreWork+0x00000037&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 680c981a: component!DoWork+0x000000ce&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 680c8f84: component!DoWork+0x0000012b&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 680d0169: Component!Query+0x00000099&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 77cf5935: ntdll!TppWorkpExecuteCallback+0x00000338&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 77cd9139: ntdll!TppWorkerThread+0x000006da&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 75fb2a32: KERNEL32!BaseThreadInitThunk+0x0000000e&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 77d0cdfe: ntdll!__RtlUserThreadStart+0x0000004a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 77d0cdaa: ntdll!_RtlUserThreadStart+0x0000001c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;**********************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;** !heap: Searching for the heap and segment that&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;** &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contain the specified address. To search&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;** &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for the entry that contains this address,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;** &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;use !heap -x 00ce0000.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;**********************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;** !heap: Analyzing heap at 00ce0000...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;** !heap: The following LFH allocations are missing a flag in their&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'unused bytes' field that identifies them as LFH allocations.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; This is usually caused by entry corruption in the client&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; application.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;** !heap: To view the state of the invalid blocks:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; !heap -i &lt;heap address=""&gt;&lt;/heap&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; !heap -i &lt;entry address=""&gt;&lt;/entry&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Heap address &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Entry address &amp;nbsp; &amp;nbsp; &amp;nbsp; Unused bytes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;----------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd1b98 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd22d0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd2590 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd1b98 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd22d0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd2590 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd1b98 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd22d0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd2590 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd1b98 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd22d0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ce0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dd2590 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;49&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;** !heap: If these failures are easily reproducible, they can&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; be detected as they occur by enabling pageheap for&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this scenario.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;1: kd&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;///////////////////////////////////////////////////////////////////////////////////////&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ok, still no luck. &amp;nbsp;I will try enabling pageheap if this issue is&amp;nbsp;reproducible.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff543094(v=vs.85).aspx"&gt;This is how you enable page heap verification.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;//////// update /////////&lt;br /&gt;&lt;br /&gt;The corruption of the heap is&amp;nbsp;indicative&amp;nbsp;of a buffer overrun. &amp;nbsp;I think I have been able to pinpoint the source. &amp;nbsp;I have a RTL linked list that tracks the state of sub-operations&amp;nbsp;within a larger RPC client driven operation. &amp;nbsp;It&amp;nbsp;turned&amp;nbsp;out there were two latent&amp;nbsp;conditions&amp;nbsp;where this list was not correctly locked: the first one was when a sub-operation failed to initialize and I would remove it out of the list without locking it, and the second was when sub-operations in other threads would send a state update (which causes the lock to be taken) at the same moment when the list was getting torn down. &amp;nbsp;Obviously removing elements from the list while some other thread is&amp;nbsp;actively&amp;nbsp;traversing it can cause the other thread to be executing on bad Flinks. &amp;nbsp;Fixing these issues should make this corruption go away. &amp;nbsp;This was a very seldom repro on x86 and AMD64, but&amp;nbsp;apparently&amp;nbsp;common on ARM.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff554296(v=vs.85).aspx"&gt;RTL linked lists&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms683472(v=vs.85).aspx"&gt;critical sections&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-2314287502032978380?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/2314287502032978380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2012/03/debugging-heap-failures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2314287502032978380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2314287502032978380'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2012/03/debugging-heap-failures.html' title='Debugging Heap Failures'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4993575784135540478</id><published>2012-02-17T13:25:00.000-08:00</published><updated>2012-02-17T13:30:50.673-08:00</updated><title type='text'>Conditional WPP Tracing with WPP_LEVEL_ENABLED</title><content type='html'>In general WPP tracing is a no-op if tracing is not enabled on your component. &amp;nbsp;For instance, you don't need to worry about if this line is making your production code slower when tracing is not enabled:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;LogTrace(MY_ERROR_LEVEL, L"Failed to start the RPC subsystem. hr = 0x%08x", hr);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But, there are times when you would like to trace something more involved than capturing an error and HRESULT. &lt;br /&gt;&lt;br /&gt;For instance in this code, I wanted to be able to trace what SIDs I was generating, so to trace the string of the SID, some memory needed to be allocated. &amp;nbsp;I didn't want this to happen in my production code if tracing wasn't enabled.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;LPWSTR pszSid = NULL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if (!ConvertSidToStringSid(pTokenGroups-&amp;gt;Groups[i].Sid, &amp;amp;pszSid)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; LogTrace(DAS_ERROR_LEVEL, "Could not generate SID string 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;else {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; LogTrace(DAS_INFO_LEVEL, "Created process SID %ls\n", (LPCWSTR)pszSid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if (pszSid) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; LocalFree(pszSid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sure, the LogTrace is a no-op if tracing isn't enabled, but I will always be allocating the string regardless. &amp;nbsp;I didn't want that in my production code. &amp;nbsp;This is where the&amp;nbsp;WPP_LEVEL_ENABLED macro comes in. &lt;br /&gt;&lt;br /&gt;WPP_LEVEL_ENABLED(level)&amp;nbsp;can check to see if a certain level is currently enabled. &amp;nbsp;It is generated by the preproccessor, and uses the same mechanism the other WPP generated functions use to decided when to actually&amp;nbsp;do work.&lt;br /&gt;&lt;br /&gt;So, to fix that code snip:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if (WPP_LEVEL_ENABLED(MY_INFO_LEVEL) || WPP_LEVEL_ENABLED(MY_ERROR_LEVEL)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; LPWSTR pszSid = NULL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if (!ConvertSidToStringSid(pTokenGroups-&amp;gt;Groups[i].Sid, &amp;amp;pszSid)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LogTrace(MY_ERROR_LEVEL, "Could not generate SID string 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; else {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LogTrace(MY_INFO_LEVEL, "Created process SID %ls\n", (LPCWSTR)pszSid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if (pszSid) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LocalFree(pszSid);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ConvertSidToStringSid&amp;nbsp;&lt;/span&gt;will not be called and the string will not be allocated unless the component's WPP info level or error level is&amp;nbsp;enabled.&lt;br /&gt;&lt;br /&gt;Use this macro then to programmatically skip work that is only needed for WPP logging when logging isn't turned on.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4993575784135540478?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4993575784135540478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2012/02/conditional-wpp-tracing-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4993575784135540478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4993575784135540478'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2012/02/conditional-wpp-tracing-with.html' title='Conditional WPP Tracing with WPP_LEVEL_ENABLED'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-2505184046279588202</id><published>2012-01-05T15:15:00.000-08:00</published><updated>2012-01-05T15:46:52.567-08:00</updated><title type='text'>Looking at Heap Allocations With Windbg</title><content type='html'>I will keep this&amp;nbsp;brief. &amp;nbsp;!heap is main debugger extension for allocation debugging.&amp;nbsp; I will show you some tricks to get started using it.&amp;nbsp;&amp;nbsp;You can read up on all of the options by either typing !heap -? in the debugger or reading up on it in &lt;a href="http://msdn.microsoft.com/en-us/library/ff563189(v=VS.85).aspx"&gt;MSDN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As always, don't do it the hard way.&amp;nbsp; Use tools like Application Verifier&amp;nbsp;to help you find issues more quickly.&amp;nbsp; Appverif is awesome at identifying and even root causing many heap, leak, deadlock, and many other issues.&amp;nbsp; You should get in the habit of always debugging with it on.&amp;nbsp; Still, you should still know how to debug heap issues, so read on.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-d9Z0LxOK2qg/TwY1Q6HQMkI/AAAAAAAAAzc/Y4OGLdhTapI/s1600/appverif.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="366" src="http://1.bp.blogspot.com/-d9Z0LxOK2qg/TwY1Q6HQMkI/AAAAAAAAAzc/Y4OGLdhTapI/s640/appverif.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;First think you will notice is that most of !heap's options take either a heap index or a heap address. &amp;nbsp;You can use 0 for process' heap, but there can be a lot and you might have to wait a while.&amp;nbsp; I will show you how to get it, and then you can play with the other options to learn what they do.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Generally you have a pointer of an allocation, and you want to know more about it. &amp;nbsp;To find the heap for the allocation you are looking for there are two simple ways that I can think of.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;!heap -x ptr_address&lt;br /&gt;&lt;br /&gt;This will cause the debugger to search for the heap block with that address. &amp;nbsp;This can take a little while depending on how many allocations there are. &amp;nbsp;Using the -v option will take even longer, so you should probably avoid using it.&lt;br /&gt;&lt;br /&gt;example, double free:&lt;br /&gt;0:000&amp;gt; !analyze -v&lt;br /&gt;...&lt;br /&gt;STACK_TEXT:&amp;nbsp; &lt;br /&gt;008ffbf4 77b37d01 c0000374 77b67130 008ffc38 ntdll!RtlReportCriticalFailure+0x33&lt;br /&gt;008ffc04 77b36eb5 00000002 91731eca 00c50000 ntdll!RtlpReportHeapFailure+0x21&lt;br /&gt;008ffc38 77b06e39 00000008 00c50000 00c50d88 ntdll!RtlpLogHeapFailure+0xa2&lt;br /&gt;008ffc6c 76de9898 00c50000 00000000 00c50d90 ntdll!RtlFreeHeap+0x5c&lt;br /&gt;008ffcb8 00df14c2 00c50d90 00000000 00c50d90 msvcrt!free+0x65&lt;br /&gt;008ffcd0 00df1884 00000001 00c50c80 00c52f10 program!wmain+0x42&lt;br /&gt;008ffd20 00df193f 008ffd34 759c2914 7fe6f000 program!__wmainCRTStartup+0x164&lt;br /&gt;008ffd28 759c2914 7fe6f000 008ffd74 77ab7fb6 program!wmainCRTStartup+0xf&lt;br /&gt;008ffd34 77ab7fb6 7fe6f000 91731f86 00000000 KERNEL32!BaseThreadInitThunk+0xe&lt;br /&gt;008ffd74 77ab7f62 ffffffff 77b2db43 00000000 ntdll!__RtlUserThreadStart+0x4a&lt;br /&gt;008ffd84 00000000 00df1930 7fe6f000 00000000 ntdll!_RtlUserThreadStart+0x1c&lt;br /&gt;&lt;br /&gt;FOLLOWUP_IP: &lt;br /&gt;program!wmain+42 [s:\program\program.cpp @ 423]&lt;br /&gt;00df14c2 83c404&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esp,4&lt;br /&gt;&lt;br /&gt;FAULTING_SOURCE_CODE:&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; 419:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNREFERENCED_PARAMETER(argv);&lt;br /&gt;&amp;nbsp;&amp;nbsp; 420: &lt;br /&gt;&amp;nbsp;&amp;nbsp; 421:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = malloc(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; 422:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(p);&lt;br /&gt;&amp;gt;&amp;nbsp; 423:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(p);&lt;br /&gt;&amp;nbsp;&amp;nbsp; 424: &lt;br /&gt;&amp;nbsp;&amp;nbsp; 425: &lt;br /&gt;&lt;br /&gt;So&amp;nbsp;the double free&amp;nbsp;in this case is obvious, but normally if you hit one it wasn't.&lt;br /&gt;&lt;br /&gt;0:000&amp;gt; .frame 7&lt;br /&gt;07 008ffcd0 00df1884 program!wmain+0x42 [s:\program\program.cpp @ 423]&lt;br /&gt;0:000&amp;gt; dv&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; argc = 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; argv = 0x00c50c80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = 0x00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = &lt;span style="background-color: cyan;"&gt;0x00c50d90&lt;/span&gt;&lt;br /&gt;0:000&amp;gt; !heap -x 0x00c50d90&lt;br /&gt;Entry&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Heap&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Segment&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&amp;nbsp; PrevSize&amp;nbsp; Unused&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags&lt;br /&gt;-----------------------------------------------------------------------------&lt;br /&gt;00c50d88&amp;nbsp; 00c50d90&amp;nbsp; &lt;span style="background-color: yellow;"&gt;00c50000&lt;/span&gt;&amp;nbsp; 00c50000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4c0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 110&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp; free fill&lt;br /&gt;&lt;br /&gt;0:000&amp;gt; !heap -a &lt;span style="background-color: yellow;"&gt;00c50000&lt;/span&gt; &lt;br /&gt;Index&amp;nbsp;&amp;nbsp; Address&amp;nbsp; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debugging options enabled&lt;br /&gt;&amp;nbsp; 3:&amp;nbsp;&amp;nbsp; 00c50000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Segment at 00c50000 to 00c5f000 (00004000 bytes committed)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40001062&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ForceFlags:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40000060&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Granularity:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 bytes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Segment Reserve:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00100000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Segment Commit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00002000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeCommit Block Thres: 00000200&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeCommit Total Thres: 00002000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total Free Size:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 000002a7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Max. Allocation Size: 7ffdefff&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lock Variable at:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c50248&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next TagIndex:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum TagIndex:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tag Entries:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PsuedoTag Entries:&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Virtual Alloc List:&amp;nbsp;&amp;nbsp; 00c5009c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Uncommitted ranges:&amp;nbsp;&amp;nbsp; 00c5008c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c54000: 0000b000&amp;nbsp; (45056 bytes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FreeList[ 00 ] at 00c500c0: 00c52388 . 00c50d90&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c50d88: 00110 . 004c0 [104] - free&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c53af0: 00be8 . 004f0 [104] - free&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c52380: 00818 . 00b88 [104] - free&lt;br /&gt;&lt;br /&gt;Segment00 at 00c50000:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Base:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c50000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; First Entry:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c50498&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Last Entry:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c5f000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total Pages:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0000000f&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total UnCommit:&amp;nbsp; 0000000b&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Largest UnCommit:00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UnCommitted Ranges: (1)&lt;br /&gt;&lt;br /&gt;Heap entries for Segment00 in Heap 00c50000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; address: psize . size&amp;nbsp; flags&amp;nbsp;&amp;nbsp; state (requested size)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c50000: 00000 . 00498 [101] - busy (497)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c50498: 00498 . 00118 [107] - busy (117), tail fill Internal &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c505b0: 00118 . 00230 [107] - busy (214), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c507e0: 00230 . 00498 [107] - busy (480), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c50c78: 00498 . 00110 [107] - busy (f8), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: cyan;"&gt;00c50d88: 00110 . 004c0 [104] free fill&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c51248: 004c0 . 00238 [107] - busy (220), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c51480: 00238 . 00650 [107] - busy (632), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c51ad0: 00650 . 00098 [107] - busy (80), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c51b68: 00098 . 00818 [107] - busy (800), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c52380: 00818 . 00b88 [104] free fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c52f08: 00b88 . 00be8 [107] - busy (bd0), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c53af0: 00be8 . 004f0 [104] free fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c53fe0: 004f0 . 00020 [111] - busy (1d)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00c54000:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0000b000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - uncommitted bytes.&lt;br /&gt;&lt;br /&gt;You can see the memory is already freed.&amp;nbsp; &lt;/li&gt;&lt;li&gt;If your heap call is on the stack at the time, you can find this value by walking the stack to and dumping variables. &amp;nbsp;This can be helpful where there are a lot of allocations and -x will take a long time.&amp;nbsp; The heap handle is the first parameter passed in to the ntdll RtlHeap*/Heap* functions.&lt;br /&gt;&lt;br /&gt;example:&lt;br /&gt;&lt;code&gt;free((void*)1234);&lt;/code&gt;&lt;code&gt;&lt;span style="font-family: Times New Roman;"&gt;This will cause an access violation.&lt;br /&gt;&lt;span style="color: black;"&gt;0:000&amp;gt; kn&lt;br /&gt;&amp;nbsp;# ChildEBP RetAddr&amp;nbsp; &lt;br /&gt;00 0102fa6c 77b37d01 ntdll!RtlReportCriticalFailure+0x33 [d:\6588\minkernel\ntos\rtl\rtlutil.c @ 161]&lt;br /&gt;01 0102fa7c 77b36eb5 ntdll!RtlpReportHeapFailure+0x21 [d:\6588\minkernel\ntos\rtl\heaplog.c @ 161]&lt;br /&gt;02 0102fab0 77b06e4c ntdll!RtlpLogHeapFailure+0xa2 [d:\6588\minkernel\ntos\rtl\heaplog.c @ 672]&lt;br /&gt;03 (Inline) -------- ntdll!RtlpProbeUserBufferUnsafe+0x8066d [d:\6588\minkernel\ntos\rtl\heappriv.h @ 2720]&lt;br /&gt;04 (Inline) -------- ntdll!RtlpProbeUserBuffer+0x80677 [d:\6588\minkernel\ntos\rtl\heappriv.h @ 2754]&lt;br /&gt;05 0102fae4 76de9898 ntdll!RtlFreeHeap+0x6c [d:\6588\minkernel\ntos\rtl\heap.c @ 1910]&lt;br /&gt;06 0102fb30 00ce14a1 msvcrt!free+0x65 [d:\6588\minkernel\crts\crtw32\heap\free.c @ 183]&lt;br /&gt;07 0102fb44 00ce1864 program!wmain+0x21 [s:\program\program.cpp @ 420]&lt;br /&gt;08 0102fb94 00ce191f program!__wmainCRTStartup+0x164 [s:\dep\minkernel\crts\crtw32\dllstuff\crtexe.c @ 692]&lt;br /&gt;09 0102fb9c 759c2914 program!wmainCRTStartup+0xf [s:\dep\minkernel\crts\crtw32\dllstuff\crtexe.c @ 510]&lt;br /&gt;0a 0102fba8 77ab7fb6 KERNEL32!BaseThreadInitThunk+0xe [d:\6588\base\win32\client\thread.c @ 65]&lt;br /&gt;0b 0102fbe8 77ab7f62 ntdll!__RtlUserThreadStart+0x4a [d:\6588\minkernel\ntdll\rtlstrt.c @ 1018]&lt;br /&gt;0c 0102fbf8 00000000 ntdll!_RtlUserThreadStart+0x1c [d:\6588\minkernel\ntdll\rtlstrt.c @ 936]&lt;br /&gt;0:000&amp;gt; .frame 5&lt;br /&gt;05 0102fae4 76de9898 ntdll!RtlFreeHeap+0x6c [d:\6588\minkernel\ntos\rtl\heap.c @ 1910]&lt;br /&gt;0:000&amp;gt; dv&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HeapHandle = &lt;span style="background-color: yellow;"&gt;0x010d0000&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BaseAddress = 0x000004d2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BusyBlock = 0x00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interceptor = &lt;value unavailable=""&gt;&lt;br /&gt;0:000&amp;gt; !heap -a &lt;span style="background-color: yellow;"&gt;0x010d0000&lt;/span&gt;Index&amp;nbsp;&amp;nbsp; Address&amp;nbsp; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debugging options enabled&lt;br /&gt;&amp;nbsp; 3:&amp;nbsp;&amp;nbsp; 010d0000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Segment at 010d0000 to 010df000 (00004000 bytes committed)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40001062&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ForceFlags:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40000060&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Granularity:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 bytes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Segment Reserve:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00100000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Segment Commit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00002000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeCommit Block Thres: 00000200&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeCommit Total Thres: 00002000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total Free Size:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 000002a7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Max. Allocation Size: 7ffdefff&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lock Variable at:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d0248&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next TagIndex:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum TagIndex:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tag Entries:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PsuedoTag Entries:&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Virtual Alloc List:&amp;nbsp;&amp;nbsp; 010d009c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Uncommitted ranges:&amp;nbsp;&amp;nbsp; 010d008c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d4000: 0000b000&amp;nbsp; (45056 bytes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FreeList[ 00 ] at 010d00c0: 010d2388 . 010d0d90&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d0d88: 00110 . 004c0 [104] - free&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d3af0: 00be8 . 004f0 [104] - free&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d2380: 00818 . 00b88 [104] - free&lt;/value&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: black; font-family: Times New Roman;"&gt;Segment00 at 010d0000:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Base:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; First Entry:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d0498&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Last Entry:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010df000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total Pages:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0000000f&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total UnCommit:&amp;nbsp; 0000000b&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Largest UnCommit:00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UnCommitted Ranges: (1)&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="font-family: Times New Roman;"&gt;&lt;span style="color: black;"&gt;Heap entries for Segment00 in Heap 010d0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; address: psize . size&amp;nbsp; flags&amp;nbsp;&amp;nbsp; state (requested size)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d0000: 00000 . 00498 [101] - busy (497)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d0498: 00498 . 00118 [107] - busy (117), tail fill Internal &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d05b0: 00118 . 00230 [107] - busy (214), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d07e0: 00230 . 00498 [107] - busy (480), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d0c78: 00498 . 00110 [107] - busy (f8), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d0d88: 00110 . 004c0 [104] free fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d1248: 004c0 . 00238 [107] - busy (220), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d1480: 00238 . 00650 [107] - busy (632), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d1ad0: 00650 . 00098 [107] - busy (80), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d1b68: 00098 . 00818 [107] - busy (800), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d2380: 00818 . 00b88 [104] free fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d2f08: 00b88 . 00be8 [107] - busy (bd0), tail fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d3af0: 00be8 . 004f0 [104] free fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d3fe0: 004f0 . 00020 [111] - busy (1d)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 010d4000:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0000b000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - uncommitted bytes.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;code&gt;&lt;span style="font-family: Times New Roman;"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-2505184046279588202?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/2505184046279588202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2012/01/looking-at-heap-allocations-with-windbg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2505184046279588202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2505184046279588202'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2012/01/looking-at-heap-allocations-with-windbg.html' title='Looking at Heap Allocations With Windbg'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-d9Z0LxOK2qg/TwY1Q6HQMkI/AAAAAAAAAzc/Y4OGLdhTapI/s72-c/appverif.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4370763485066265265</id><published>2011-12-06T17:28:00.001-08:00</published><updated>2011-12-06T17:38:54.876-08:00</updated><title type='text'>Retrieving GetLastError() in Windbg</title><content type='html'>Let's say that you are debugging some code with windbg and some error happened, but the code doesn't call GetLastError() and store it in a local variable.  Don't worry, you can still find out what the error was.  It is stored in the TEB (thread environment block) and there is a debugger extension for the TEB.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;0:002&amp;gt; !teb&lt;br /&gt;TEB at 7f38d000&lt;br /&gt;    ExceptionList:        018bfad0&lt;br /&gt;    StackBase:            018c0000&lt;br /&gt;    StackLimit:           018bc000&lt;br /&gt;    SubSystemTib:         00000000&lt;br /&gt;    FiberData:            00001e00&lt;br /&gt;    ArbitraryUserPointer: 00000000&lt;br /&gt;    Self:                 7f38d000&lt;br /&gt;    EnvironmentPointer:   00000000&lt;br /&gt;    ClientId:             0000076c . 00000518&lt;br /&gt;    RpcHandle:            00000000&lt;br /&gt;    Tls Storage:          0115a170&lt;br /&gt;    PEB Address:          7f384000&lt;br /&gt;    LastErrorValue:       &lt;span class="Apple-style-span" style="color: red;"&gt;1168&lt;/span&gt;&lt;br /&gt;    LastStatusValue:      &lt;span class="Apple-style-span" style="color: orange;"&gt;c000000d&lt;/span&gt;&lt;br /&gt;    Count Owned Locks:    0&lt;br /&gt;    HardErrorMode:        0&lt;br /&gt;0:002&amp;gt; !error &lt;span class="Apple-style-span" style="color: orange;"&gt;c000000d&lt;/span&gt;&lt;br /&gt;Error code: (NTSTATUS) 0xc000000d (3221225485) - An invalid parameter was passed to a service or function.&lt;br /&gt;0:002&amp;gt; !error &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;0n&lt;/span&gt;1168&lt;/span&gt;&lt;br /&gt;Error code: (Win32) 0x490 (1168) - Element not found.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note LastErrorValue is in decimal and not hex so be sure to add the 0n when using !error. &amp;nbsp;There you go, there is the last error.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/marcelolr/archive/2010/04/22/getlasterror-on-windbg.aspx"&gt;source&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4370763485066265265?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4370763485066265265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2011/12/retrieving-getlasterror-in-windbg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4370763485066265265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4370763485066265265'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2011/12/retrieving-getlasterror-in-windbg.html' title='Retrieving GetLastError() in Windbg'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-7482782641475215551</id><published>2011-12-02T11:38:00.001-08:00</published><updated>2011-12-02T12:45:14.099-08:00</updated><title type='text'>new nothrow</title><content type='html'>I don't use STL, and I don't C++ exceptions. &amp;nbsp;I avoid them for a few reasons: under debugger, they make it a pain to find and walk the faulting call stack after they are thrown, and mostly I lean towards a more C style of programming style personally. &amp;nbsp;Still, you need to use the new operator to create new C++ objects, and new can throw and exception in low resource conditions. &amp;nbsp;There are a few ways to change this default behavior so that it just returns NULL instead of throwing.&lt;br /&gt;&lt;br /&gt;One way is to add this into your sources file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;TARGETLIBS=\    &lt;br /&gt;    $(SDK_LIB_PATH)\nothrownew.obj &amp;nbsp; &amp;nbsp; &amp;nbsp; \&lt;/pre&gt;&lt;br /&gt;Another way is to add a no throw each time you use the new operator:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    ClassX *pObj = new (std::nothrow) ClassX();&lt;br /&gt;&lt;br /&gt;    if (!pObj)&lt;br /&gt;        return E_OUTOFMEMORY;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-7482782641475215551?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/7482782641475215551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2011/12/new-nothrow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7482782641475215551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7482782641475215551'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2011/12/new-nothrow.html' title='new nothrow'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-7623955970593289497</id><published>2011-11-15T19:14:00.001-08:00</published><updated>2011-11-15T19:35:59.468-08:00</updated><title type='text'>Synchronization Primitives Available in Win32</title><content type='html'>&lt;div&gt;I ran into this table in a concurrency training class. &amp;nbsp;It gives you the quick and dirty on synchronization primitives&amp;nbsp;available&amp;nbsp;in Win32.&lt;/div&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; margin-left: 47.6pt; width: 497px;"&gt; &lt;tbody&gt;&lt;tr style="height: 18.2pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;"&gt;  &lt;td style="background: #339911; border-bottom: solid #F8F8F8 3.0pt; border: solid #F8F8F8 1.0pt; height: 18.2pt; padding: 3.3pt .1in 3.3pt .1in; width: 124.2pt;" valign="top" width="166"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Characteristic&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #339911; border-bottom: solid #F8F8F8 3.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: solid #F8F8F8 1.0pt; height: 18.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 81.0pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;CriticalSection&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #339911; border-bottom: solid #F8F8F8 3.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: solid #F8F8F8 1.0pt; height: 18.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 63.0pt;" valign="top" width="84"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;SRWLocks&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #339911; border-bottom: solid #F8F8F8 3.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: solid #F8F8F8 1.0pt; height: 18.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 104.75pt;" valign="top" width="140"&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Mutex&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Semaphores&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Events&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr style="height: 45.95pt; mso-yfti-irow: 1;"&gt;  &lt;td style="background: #CDDECC; border-top: none; border: solid #F8F8F8 1.0pt; height: 45.95pt; mso-border-top-alt: solid #F8F8F8 3.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 124.2pt;" valign="top" width="166"&gt;&lt;div class="MsoNormal"&gt;Kernel call even if free and upon creation&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 45.95pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 3.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 81.0pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 45.95pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 3.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 63.0pt;" valign="top" width="84"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 45.95pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 3.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 104.75pt;" valign="top" width="140"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr style="height: 26.2pt; mso-yfti-irow: 2;"&gt;  &lt;td style="background: #E8EFE7; border-top: none; border: solid #F8F8F8 1.0pt; height: 26.2pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 124.2pt;" valign="top" width="166"&gt;&lt;div class="MsoNormal"&gt;Non-FIFO (no convoys)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 81.0pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 63.0pt;" valign="top" width="84"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 104.75pt;" valign="top" width="140"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr style="height: 26.2pt; mso-yfti-irow: 3;"&gt;  &lt;td style="background: #CDDECC; border-top: none; border: solid #F8F8F8 1.0pt; height: 26.2pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 124.2pt;" valign="top" width="166"&gt;&lt;div class="MsoNormal"&gt;Spin before wait option&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 81.0pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 63.0pt;" valign="top" width="84"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 104.75pt;" valign="top" width="140"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr style="height: 26.2pt; mso-yfti-irow: 4;"&gt;  &lt;td style="background: #E8EFE7; border-top: none; border: solid #F8F8F8 1.0pt; height: 26.2pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 124.2pt;" valign="top" width="166"&gt;&lt;div class="MsoNormal"&gt;Try to acquire option&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 81.0pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 63.0pt;" valign="top" width="84"&gt;&lt;div class="MsoNormal"&gt;N/Y on Win7&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 104.75pt;" valign="top" width="140"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr style="height: 26.2pt; mso-yfti-irow: 5;"&gt;  &lt;td style="background: #CDDECC; border-top: none; border: solid #F8F8F8 1.0pt; height: 26.2pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 124.2pt;" valign="top" width="166"&gt;&lt;div class="MsoNormal"&gt;Cross-process&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 81.0pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 63.0pt;" valign="top" width="84"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 104.75pt;" valign="top" width="140"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr style="height: 26.2pt; mso-yfti-irow: 6;"&gt;  &lt;td style="background: #E8EFE7; border-top: none; border: solid #F8F8F8 1.0pt; height: 26.2pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 124.2pt;" valign="top" width="166"&gt;&lt;div class="MsoNormal"&gt;Recursive acquires&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 81.0pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 63.0pt;" valign="top" width="84"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #E8EFE7; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 104.75pt;" valign="top" width="140"&gt;&lt;div class="MsoNormal"&gt;Mutex only &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr style="height: 26.2pt; mso-yfti-irow: 7; mso-yfti-lastrow: yes;"&gt;  &lt;td style="background: #CDDECC; border-top: none; border: solid #F8F8F8 1.0pt; height: 26.2pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 124.2pt;" valign="top" width="166"&gt;&lt;div class="MsoNormal"&gt;Use in WaitForMultiple..&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 81.0pt;" valign="top" width="108"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 63.0pt;" valign="top" width="84"&gt;&lt;div class="MsoNormal"&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;td style="background: #CDDECC; border-bottom: solid #F8F8F8 1.0pt; border-left: none; border-right: solid #F8F8F8 1.0pt; border-top: none; height: 26.2pt; mso-border-left-alt: solid #F8F8F8 1.0pt; mso-border-top-alt: solid #F8F8F8 1.0pt; padding: 3.3pt .1in 3.3pt .1in; width: 104.75pt;" valign="top" width="140"&gt;&lt;div class="MsoNormal"&gt;Y&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;CriticalSections are the lightest weight and normally the best to use.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;you can use them recursively on the same thread&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;SRWLocks are best if you need to differentiate reading and writing access. &amp;nbsp;For example you can take a shared lock for read only access to a shared resource and exclusive lock for writing.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;It is generally better than just using a critical section if the ratio is 2 reads : 1 write&lt;/li&gt;&lt;li&gt;Cannot be used&amp;nbsp;recursively&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Mutex/Semaphores/Events are kernel objects&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Can be used across process.&lt;/li&gt;&lt;li&gt;Obviously available in krenel mode.&lt;/li&gt;&lt;li&gt;In user mode, the will be less performant than critical sections and SRWlocks and will cause more context switching.&lt;/li&gt;&lt;li&gt;Are processed in convoys so they can avoid starvation&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Instrumentation is the best way to know what kind of synchronization is best for your code. &amp;nbsp;Look at my previous post on how to&amp;nbsp;instrument&amp;nbsp;with ETW and XPerf for industrial grade perf testing. &amp;nbsp;Try&amp;nbsp;different&amp;nbsp;synchronization&amp;nbsp;mechanisms and measure performance.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-7623955970593289497?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/7623955970593289497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2011/11/i-ran-into-this-table-in-concurrency.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7623955970593289497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7623955970593289497'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2011/11/i-ran-into-this-table-in-concurrency.html' title='Synchronization Primitives Available in Win32'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-8701509189343389993</id><published>2011-08-04T15:05:00.000-07:00</published><updated>2011-08-04T15:09:17.572-07:00</updated><title type='text'>How to Add Instrumentation to Your Manifest</title><content type='html'>&lt;pre&gt;&lt;div&gt;&lt;p class="MsoNormal" style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none;"&gt;&lt;events&gt;&lt;event keywords="Component query" template="INFO_CONTEXT_INFO" all="" full="" the="" inside="" up="" line="" bits="" where="" you="" show="" will="" i="" some="" with="" event="" value="5500" task="component_CreateQuery" symbol="CREATE_QUERY_START" opcode="win:Start" message="$(string.event_5501)" level="win:Informational" channel="50" events=""&gt;&lt;event keywords="Component query" template="INFO_CONTEXT_INFO" full="" the="" event="" value="5500" task="component_CreateQuery" symbol="CREATE_QUERY_START" opcode="win:Start" message="$(string.event_5501)" level="win:Informational" channel="50" standalone="yes" encoding="utf-8" version="1.0" is="" here="" xml=""&gt;&lt;assembly language="neutral" xmlns="urn:schemas-microsoft-com:asm.v3" win="http://manifests.microsoft.com/win/2004/08/windows/events" version="$(build.version)" versionscope="nonSxS" publickeytoken="$(Build.WindowsPublicKeyToken)" processorarchitecture="$(build.arch)" name="Microsoft-Windows-Component" buildtype="$(build.buildType)" manifestversion="1.0" xsi="http://www.w3.org/2001/XMLSchema-instance" xsd="http://www.w3.org/2001/XMLSchema" assemblyidentity="" instrumentation=""&gt;&lt;events xmlns="http://schemas.microsoft.com/win/2004/08/events"&gt;&lt;provider symbol="component" message="$(string.EventProviderName)" name="Microsoft-Windows-ComponentProvider" resourcefilename="%SystemRoot%\system32\component.dll" messagefilename="%SystemRoot%\system32\component.dll" guid="{56c71c31-cfbd-4cdd-8559-505e042bbbe1}" channels=""&gt;&lt;channel keywords="" symbol="MS_COMPONENT_PERFORMANCE" channel="" name="Microsoft-Windows-ComponentProvider/Performance" type="Analytic" chid="50"&gt;&lt;keyword name="PerfTrackContext" keyword="" mask="0x1" tasks=""&gt;&lt;task value="5000" task="" name="component_CreateQuery" templates=""&gt;&lt;template tid="INFO_CONTEXT_INFO"&gt;&lt;data template="" name="Context" data="" intype="win:Pointer"&gt;&lt;events&gt;&lt;localization&gt;&lt;resources culture="en-US"&gt;&lt;stringtable&gt;&lt;string id="EventProviderName" dependencytype="prerequisite" value="Microsoft-Windows-Component" resourcetype="Resources" optional="false" discoverable="false" string="" dependentassembly="" dependency=""&gt;&lt;assemblyidentity language="*" version="$(build.version)" versionscope="nonSxS" publickeytoken="$(Build.WindowsPublicKeyToken)" processorarchitecture="$(build.processorArchitecture)" name="Microsoft-Windows-Component.Resources" buildtype="$(build.buildType)" dependentassembly="" assemblyidentity=""&gt;&lt;/assemblyidentity&gt;&lt;/string&gt;&lt;/stringtable&gt;&lt;/resources&gt;&lt;/localization&gt;&lt;/events&gt;&lt;/data&gt;&lt;/template&gt;&lt;/task&gt;&lt;/keyword&gt;&lt;/channel&gt;&lt;/provider&gt;&lt;/events&gt;&lt;/assembly&gt;&lt;/event&gt;&lt;/event&gt;&lt;/events&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;To enable ETW performance tracing for your binary, the first thing you need to do is add an instrumentation section.&lt;span&gt;  &lt;/span&gt;Here is the MSDN documentation on how to do this if you want to read about this in detail:&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa382776(v=VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa382776(v=VS.85).aspx&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;Also in the introduction for ETW (http://msdn.microsoft.com/en-us/magazine/cc163437.aspx), they make a tool recommendation for generating a manifest for ETW (ecmangen.exe).&lt;span&gt;  &lt;/span&gt;It is available in the Windows SDK.&lt;span&gt;  &lt;/span&gt;You can try it out; it may meet your needs just fine.&lt;span&gt;  &lt;/span&gt;As a person who still favors writing code in Vi, I opted to roll my own.&lt;span&gt;  &lt;/span&gt;Tools are great when they work for you.&lt;span&gt;  &lt;/span&gt;Using a tool; however, doesn’t make up for actually knowing how things work.&lt;span&gt;  &lt;/span&gt;It is good to understand how things work when things don’t come together.&lt;span&gt;  &lt;/span&gt;Read on if you would rather roll your own.&lt;br /&gt;&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;So below is the events section instrumentation manifest that has one start and stop even.&lt;span&gt;  &lt;/span&gt;You will need a start and stop for everything you want to time.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;events&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;event&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;channel&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;50&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;keywords&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Component query&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;level&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Informational&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;message&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(string.event_5501)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;opcode&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Start&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;symbol&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;CREATE_QUERY_START&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;task&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;component_CreateQuery&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;template&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;INFO_CONTEXT_INFO&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;5500&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;event&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;channel&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;50&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;keywords&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Component query&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;level&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Informational&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;message&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(string.event_5502)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;opcode&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Stop&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;symbol&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;CREATE_QUERY_STOP&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;task&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;component_CreateQuery&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;template&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;INFO_CONTEXT_INFO&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;5501&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;events&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;With some highlighting, I will show you where all the bits line up inside the full manifest.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;events&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;event&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:yellow;mso-highlight:yellow"&gt;channel&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:yellow; mso-highlight:yellow"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:yellow;mso-highlight:yellow"&gt;"&lt;span style="color:blue"&gt;50&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:lime;mso-highlight:lime"&gt;keywords&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:lime; mso-highlight:lime"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:lime;mso-highlight:lime"&gt;"&lt;span style="color:blue"&gt;Component query&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;level&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Informational&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:aqua;mso-highlight:aqua"&gt;message&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:aqua; mso-highlight:aqua"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:aqua;mso-highlight:aqua"&gt;"&lt;span style="color:blue"&gt;$(string.event_5501)&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;opcode&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Start&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;symbol&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;CREATE_QUERY_START&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:fuchsia;mso-highlight:fuchsia"&gt;task&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:fuchsia; mso-highlight:fuchsia"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:fuchsia;mso-highlight:fuchsia"&gt;"&lt;span style="color:blue"&gt;component_CreateQuery&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;template&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;INFO_CONTEXT_INFO&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;5500&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;event&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;channel&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;50&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;keywords&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Component query&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;level&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Informational&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;message&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(string.event_5502)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;opcode&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Stop&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;symbol&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;CREATE_QUERY_STOP&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;task&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;component_CreateQuery&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;template&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;INFO_CONTEXT_INFO&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;5501&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;events&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;Here is the full manifest:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;!--?&lt;/span--&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#A31515"&gt;xml&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red"&gt;version&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;'&lt;span style="color:blue"&gt;1.0&lt;/span&gt;'&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;encoding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;'&lt;span style="color:blue"&gt;utf-8&lt;/span&gt;'&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;standalone&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;'&lt;span style="color:blue"&gt;yes&lt;/span&gt;'&lt;span style="color:blue"&gt;?&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#A31515"&gt;assembly&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;xmlns&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;urn:schemas-microsoft-com:asm.v3&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;xmlns:xsd&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;http://www.w3.org/2001/XMLSchema&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;xmlns:xsi&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;manifestVersion&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;1.0&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;  &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;assemblyIdentity&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;buildType&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(build.buildType)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;language&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;neutral&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Microsoft-Windows-Component&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;processorArchitecture&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(build.arch)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;publicKeyToken&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(Build.WindowsPublicKeyToken)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;version&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(build.version)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;versionScope&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;nonSxS&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;  &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;instrumentation&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;xmlns:win&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;http://manifests.microsoft.com/win/2004/08/windows/events&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;events&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;xmlns&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;http://schemas.microsoft.com/win/2004/08/events&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;provider&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;guid&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;{56c71c31-cfbd-4cdd-8559-505e042bbbe1}&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;message&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(string.EventProviderName)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;messageFileName&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;%SystemRoot%\system32\component.dll&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Microsoft-Windows-ComponentProvider&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;resourceFileName&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;%SystemRoot%\system32\component.dll&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;symbol&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;component&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;channels&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;span style="background:yellow;mso-highlight:yellow"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515;background:yellow; mso-highlight:yellow"&gt;channel&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family: Consolas;background:yellow;mso-highlight:yellow"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:yellow;mso-highlight:yellow"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:yellow;mso-highlight:yellow"&gt;chid&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:yellow; mso-highlight:yellow"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:yellow;mso-highlight:yellow"&gt;"&lt;span style="color:blue"&gt;50&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:yellow;mso-highlight:yellow"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:yellow;mso-highlight:yellow"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:yellow; mso-highlight:yellow"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:yellow;mso-highlight:yellow"&gt;"&lt;span style="color:blue"&gt;Microsoft-Windows-ComponentProvider/Performance&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:yellow;mso-highlight:yellow"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:yellow;mso-highlight:yellow"&gt;symbol&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:yellow; mso-highlight:yellow"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:yellow;mso-highlight:yellow"&gt;"&lt;span style="color:blue"&gt;MS_COMPONENT_PERFORMANCE&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:yellow;mso-highlight:yellow"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:yellow;mso-highlight:yellow"&gt;type&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:yellow; mso-highlight:yellow"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:yellow;mso-highlight:yellow"&gt;"&lt;span style="color:blue"&gt;Analytic&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:yellow;mso-highlight:yellow"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;channels&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;keywords&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;keyword&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;mask&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;0x1&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;PerfTrackContext&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;span style="background:lime;mso-highlight:lime"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515;background:lime; mso-highlight:lime"&gt;keyword&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family: Consolas;background:lime;mso-highlight:lime"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:lime;mso-highlight:lime"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:lime;mso-highlight:lime"&gt;mask&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:lime; mso-highlight:lime"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:lime;mso-highlight:lime"&gt;"&lt;span style="color:blue"&gt;0x2&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:lime;mso-highlight:lime"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:lime;mso-highlight:lime"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:lime; mso-highlight:lime"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:lime;mso-highlight:lime"&gt;"&lt;span style="color:blue"&gt;Component&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:lime;mso-highlight:lime"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;background:lime;mso-highlight:lime"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:lime;mso-highlight:lime"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#A31515;background:lime;mso-highlight:lime"&gt;keyword&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;background:lime;mso-highlight:lime"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:lime;mso-highlight:lime"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:lime;mso-highlight:lime"&gt;mask&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:lime; mso-highlight:lime"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:lime;mso-highlight:lime"&gt;"&lt;span style="color:blue"&gt;0x4&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:lime;mso-highlight:lime"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:lime;mso-highlight:lime"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:lime; mso-highlight:lime"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:lime;mso-highlight:lime"&gt;"&lt;span style="color:blue"&gt;query&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:lime;mso-highlight:lime"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;keywords&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;tasks&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;span style="background:fuchsia;mso-highlight:fuchsia"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515;background:fuchsia; mso-highlight:fuchsia"&gt;task&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family: Consolas;background:fuchsia;mso-highlight:fuchsia"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:fuchsia;mso-highlight:fuchsia"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:fuchsia;mso-highlight:fuchsia"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:fuchsia; mso-highlight:fuchsia"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:fuchsia;mso-highlight:fuchsia"&gt;"&lt;span style="color:blue"&gt;component_CreateQuery&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:fuchsia;mso-highlight:fuchsia"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red;background:fuchsia;mso-highlight:fuchsia"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:fuchsia; mso-highlight:fuchsia"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:fuchsia;mso-highlight:fuchsia"&gt;"&lt;span style="color:blue"&gt;5000&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:fuchsia;mso-highlight:fuchsia"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;tasks&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;templates&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;template&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;tid&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;INFO_CONTEXT_INFO&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;            &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:#A31515"&gt;data&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;inType&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Pointer&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Context&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;                &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;template&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;templates&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;events&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;event&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;channel&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;50&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;keywords&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Component query&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;level&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Informational&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;message&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(string.event_5501)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;opcode&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Start&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;symbol&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;CREATE_QUERY_START&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;task&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;component_CreateQuery&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;template&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;INFO_CONTEXT_INFO&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;5500&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;event&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;channel&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;50&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;keywords&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Component query&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;level&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Informational&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;message&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(string.event_5502)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;opcode&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;win:Stop&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;symbol&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;CREATE_QUERY_STOP&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;task&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;component_CreateQuery&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;template&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;INFO_CONTEXT_INFO&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:red"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;5501&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;              &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;events&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;provider&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;events&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;  &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;instrumentation&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family: Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;  &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;localization&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;resources&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;culture&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;en-US&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;stringTable&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;string&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red"&gt;id&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;EventProviderName&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Microsoft-Windows-Component&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;            &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="background:aqua;mso-highlight:aqua"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515;background:aqua; mso-highlight:aqua"&gt;string&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:aqua;mso-highlight:aqua"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:aqua;mso-highlight:aqua"&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;background:aqua;mso-highlight:aqua"&gt;id&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:aqua; mso-highlight:aqua"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:aqua;mso-highlight:aqua"&gt;"&lt;span style="color:blue"&gt;event_5501&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:aqua;mso-highlight:aqua"&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red;background:aqua;mso-highlight:aqua"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue;background:aqua; mso-highlight:aqua"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; background:aqua;mso-highlight:aqua"&gt;"&lt;span style="color:blue"&gt;create query has started.&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue;background:aqua;mso-highlight:aqua"&gt;&lt;span&gt;            &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;string&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red"&gt;id&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;event_5502&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:red"&gt;value&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;create query has exited.&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;            &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;stringTable&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;resources&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;  &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;localization&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family: Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;  &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;dependency&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;discoverable&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;false&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;optional&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;false&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;resourceType&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Resources&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt; &lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;dependencyType&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;prerequisite&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;      &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:#A31515"&gt;assemblyIdentity&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;buildType&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(build.buildType)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;language&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;*&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;name&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;Microsoft-Windows-Component.Resources&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;processorArchitecture&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(build.processorArchitecture)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;publicKeyToken&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(Build.WindowsPublicKeyToken)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;version&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;$(build.version)&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:red"&gt;versionScope&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas;color:blue"&gt;=&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;"&lt;span style="color:blue"&gt;nonSxS&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;          &lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;    &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;dependentAssembly&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family: Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;span&gt;  &lt;/span&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:#A31515"&gt;dependency&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas; color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt;font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:0in;margin-bottom:.0001pt;line-height: normal;mso-layout-grid-align:none;text-autospace:none"&gt;&lt;span style="font-size: 9.5pt;font-family:Consolas;color:blue"&gt;&lt;!--&lt;/span--&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:#A31515"&gt;assembly&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas;color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:9.5pt; font-family:Consolas"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-8701509189343389993?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/8701509189343389993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2011/08/how-to-add-instrumentation-to-your.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/8701509189343389993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/8701509189343389993'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2011/08/how-to-add-instrumentation-to-your.html' title='How to Add Instrumentation to Your Manifest'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-8353893415346198205</id><published>2011-07-18T21:00:00.000-07:00</published><updated>2011-07-18T21:04:15.087-07:00</updated><title type='text'>Performance Instrumentation Testing for Windows Programming</title><content type='html'>&lt;div&gt;Performance is something you should always build in as you are writing code whether you are building something from the ground up or working on bug fixes for some legacy code.  Performance is one of those core software principals that is just good hygiene.  Similarly you should always write secure code, reliable code, et cetera, but those are separate topics.&lt;br /&gt;&lt;br /&gt;Performance considerations start at the very beginning when you start designing your features, and continue throughout the process.  So, let’s say that you already came up with a high performance design that you validated through prototyping.  Great, you are starting off the project on the right foot; as you know it becomes much harder to make design changes as the project goes down the pike, or even impossible towards the end of the development cycle. &lt;br /&gt;&lt;br /&gt;So now you are in the thick of coding, or perhaps on the tail end of development, and you want to make sure that you are still meeting your performance goals for your feature work.  Saying you are a good programmer and you always right high performance code isn’t quite good enough; you have to actually test your code.  Writing code with timers in it and doing a printf with times is ok for prototypes, but doesn’t work for real production code.  Not to worry, there are a number of tools at the Windows developer’s disposal to actually do the job right.&lt;br /&gt;&lt;br /&gt;Profiling is one tool in the toolbox; one such profiler is Microsoft’s F1 made by the developer division.  I think it is available in the wild as a standalone, or it looks like it has been included with VS08 and VS10.  I personally have used the standalone F1 and still write code in Vim, but maybe I am weird like that.  The basic idea of F1 is that it breaks into your process at a certain time interval and check to see what is on your threads’ call stacks.  Based on what is on the stacks, F1 can give you ideas as to how much time is spent in each function, and about allocations being made.  The advantages to using a profiler like F1 are: you don’t have to modify your binaries to instrument, it is light weight, and it gives you an idea how much time your code spends in functions.  Some downsides are: you don’t get call count information, CPU usage is skewed by timer caused context switching, doesn’t profile kernel mode usage, it is less effective for system wide issues, it is heavy weight, and it doesn’t scale well if you want to profile often.  To sum it up, F1 is a great tool with limitations.  It really can give you a real-world performance view of your code (if it runs in UM), but there are better ways to instrument if want to look at performance more than a few times.&lt;br /&gt;&lt;br /&gt;One of these better ways is ETW (Event Tracing for Windows).  I will not get into the nitty-gritty of ETW; I will assume that the reader knows how to Google and can read the copious content out there, but I will give you a quick a dirty idea as to what it is.  Basically ETW is the Windows operating system’s built in tracing mechanism.  It is baked in all the way to the kernel level, and is very high performance.  Since ETW is baked into the operating system, you can track scenarios from process to process to even KM components with very little overhead.  You can use it for many other things as well, like writing events to logs and so on, but I will focus on using ETW for instrumenting your code for performance.  For some reason though, I haven’t found too much help on the Internet on how to do performance instrumentation.  I plan to help with that.&lt;br /&gt;&lt;br /&gt;In the days and weeks to come, I will break it down how to instrument your code with ETW, and use the Windows tools for performance tracking and testing.&lt;br /&gt;&lt;br /&gt;ETW Overview: http://msdn.microsoft.com/en-us/magazine/cc163437.aspx&lt;br /&gt;&lt;br /&gt;Do not confuse ETW with WPP.  Yes WPP is built on ETW, but I use WPP for more conventional printf style tracing.  It is good to also add WPP tracing to your code for debugging purposes, but I don’t use it for performance testing.  In fact WPP tracing is probably the best way to debug nasty concurrency issues that don’t repro well on a debugger, so you should look into it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-8353893415346198205?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/8353893415346198205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2011/07/performance-instrumentation-testing-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/8353893415346198205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/8353893415346198205'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2011/07/performance-instrumentation-testing-for.html' title='Performance Instrumentation Testing for Windows Programming'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-5713916152674564678</id><published>2011-01-07T15:27:00.000-08:00</published><updated>2011-01-07T15:28:18.063-08:00</updated><title type='text'>CreateThread Usage Pattern</title><content type='html'>I don’t really use the old thread pool (Windows 2000 &amp; XP) in favor of the new awesome thread pool introduced in Vista, but sometimes you might inherit old code that does.  I just finished fixing a bug related to the old CreateThread.  I have some time before my team’s Friday afternoon party, so I thought I would share.  I found the error thanks to App Verifier; +1 to App Verifier’s awesomeness.  &lt;br /&gt;&lt;br /&gt;Basically the usage pattern is:&lt;br /&gt;1. get the module handle (GetModuleHandleEx)&lt;br /&gt;2. create the thread (CreateThread)&lt;br /&gt;3. If COM, CoInitialize a new apartment for the thread&lt;br /&gt;4. Do work&lt;br /&gt;5. If COM, CoUninitialize&lt;br /&gt;6. FreeLibraryAndExitThread with the handle gotten in #1&lt;br /&gt;7. Return&lt;br /&gt;&lt;br /&gt;Steps 1-2, The thread creator would do something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)&amp;Class::ThreadProc , &amp;s_hModule))&lt;br /&gt;    hr = HRESULT_FROM_WIN32( GetLastError() ); &lt;br /&gt;&lt;br /&gt;if (S_OK == hr) {&lt;br /&gt;    if (s_hThread)&lt;br /&gt;        CloseHandle(s_hThread);&lt;br /&gt;    s_hThread = CreateThread(NULL, 0, ThreadProc, this, 0, &amp;s_dwThreadID);&lt;br /&gt;    if (!s_hThread) {&lt;br /&gt;        hr = HRESULT_FROM_WIN32(::GetLastError());&lt;br /&gt;        FreeLibrary( s_hModule );&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In my case, the bug was in the GetModuleHandleEx.  Take heed that if you are using the GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRES flag, then the second parameter should an address inside of your DLL; I have read that &amp;__ImageBase or the HINSTANCE passed into DllMain should also do the trick.  Also the third parameter will be used inside the thread proc. &lt;br /&gt;&lt;br /&gt;Steps 3-7:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DWORD WINAPI Class::ThreadProc(void *pv)&lt;br /&gt;{&lt;br /&gt;    if (S_OK == CoInitializeEx( NULL, COINIT_MULTITHREADED)) {&lt;br /&gt;        //...&lt;br /&gt;        // do work here&lt;br /&gt;        CoUninitialize();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    FreeLibraryAndExitThread(s_hModule, 0);&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As always, read the documentation to go deeper in the topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-5713916152674564678?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/5713916152674564678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2011/01/createthread-usage-pattern.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/5713916152674564678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/5713916152674564678'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2011/01/createthread-usage-pattern.html' title='CreateThread Usage Pattern'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-1018679285470174403</id><published>2011-01-07T10:35:00.001-08:00</published><updated>2011-01-07T10:35:47.228-08:00</updated><title type='text'>Setting a Processor Breakpoint in WinDbg</title><content type='html'>If you have a variable like a pointer or a ref count that seems to be getting clobbered or incorrectly accessed, the ba (break on access) command can be a life saver.  Setting a break on the memory address allows you to break in with windbg, inspect the stack, or do whatever else you need to do the moment the memory is accessed.  &lt;br /&gt;&lt;br /&gt;The basic usage is:&lt;br /&gt;ba address access memory_size&lt;br /&gt;&lt;br /&gt;Ex. Tracking write access of a pointer on an AMD64 machine:&lt;br /&gt;ba 0000000070540018 w8&lt;br /&gt;&lt;br /&gt;Ex. Tracking read/write of a DWORD ref count on x86:&lt;br /&gt;ba 7124220 r4&lt;br /&gt;&lt;br /&gt;Look at the windbg documentation for info.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-1018679285470174403?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/1018679285470174403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2011/01/setting-processor-breakpoint-in-windbg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/1018679285470174403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/1018679285470174403'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2011/01/setting-processor-breakpoint-in-windbg.html' title='Setting a Processor Breakpoint in WinDbg'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-373084987519929427</id><published>2010-08-03T18:02:00.001-07:00</published><updated>2010-08-03T18:02:56.176-07:00</updated><title type='text'>HOWTO Debug a Windows Service Using windbg</title><content type='html'>There are a lot of ways to debug a Windows service.  &lt;br /&gt;&lt;br /&gt;The simplest is to attach the debugger directly.  &lt;br /&gt;1. Use Task Manager to discover the PID for the service or service host.  You can also use tlist.exe.&lt;br /&gt;2. Use windbg and attach to that PID&lt;br /&gt;&lt;br /&gt;Oftentimes you need to debug the service right from startup.  Also it is a good idea to isolate the service in its own process since Windows generally runs several processes that have the same security context in the same host process. &lt;br /&gt;1. Stop the service - 'net stop service_name' &lt;br /&gt;2. Edit the following keys in the registry: &lt;br /&gt; - HKLM\System\CurrentControlSet\Control - create new DWORD value - name = 'ServicesPipeTimeout', value = 86400000.  The longer timeout gives you a chance to attach a debugger and set things up. &lt;br /&gt; - HKLM\System\CurrentControlSet\Services\service_name - edit the ImagePath to launch myhost.exe instead of svchost.exe &lt;br /&gt; - HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options - Add a new subkey called 'myhost.exe'. Under it, create a 'String' value called 'Debugger' and set the value to "C:\debuggers\ntsd.exe -server npipe:pipe=service_name_debug"&lt;br /&gt;3. Make a copy of svchost.exe and name it myhost.exe ('copy \windows\system32\svchost.exe myhost.exe') &lt;br /&gt;4. Enable the service to run in its own process - 'sc config service_name type= own' &lt;br /&gt;5. You might need to reboot now if the service dll was in use still (was not unloaded on service stop).  Also, it's better to mark the service as 'Manual' start so that it doesn't start automatically at boot - this way you can be ready when you launch the service.&lt;br /&gt;6. Start the service – ‘net start service_name’&lt;br /&gt;7. Attach the debugger ‘windbg –remote npipe:pipe=service_name_debug,server=localhost’.  In the debugger, you can setup breakpoints, exceptions, and whatever else you need to do to debug the service, then type ‘g’ to let the service startup.  &lt;br /&gt;&lt;br /&gt;This article provides more ways to debug a Windows service.&lt;br /&gt;http://support.microsoft.com/kb/824344&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-373084987519929427?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/373084987519929427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2010/08/howto-debug-windows-service-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/373084987519929427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/373084987519929427'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2010/08/howto-debug-windows-service-using.html' title='HOWTO Debug a Windows Service Using windbg'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4563845593788602086</id><published>2010-03-09T09:03:00.000-08:00</published><updated>2010-03-09T09:13:16.523-08:00</updated><title type='text'>Link Error LNK2001 __cdecl</title><content type='html'>You may have ran into a link error like this while trying to link your driver or something.&lt;br /&gt;&lt;br /&gt;Linking Executable - s:\depot.obj.amd64\proj\objchk\amd64\proj.dll&lt;br /&gt;errors in directory s:\depot\proj&lt;br /&gt;s:\depot\proj\proj.obj : error LNK2001: unresolved external symbol "long __cdecl _LibFunction(unsigned long,void *, ...)" (?_LibFunction@@YAJKPEAX000PEAPEAUHPNPCTX__@@@Z)&lt;br /&gt;&lt;br /&gt;This recently happened to me while I was trying to link a C lib file into my C++ project.  If this doesn't already cue you to the problem, this link error is caused by trying to link a C lib object in my C++ code.  In the lib's header or around the #include in your C++ project, wrap the prototypes with this:&lt;br /&gt;&lt;br /&gt;#if __cplusplus&lt;br /&gt;extern "C" {&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;_LibFunction(...);&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;#if __cplusplus&lt;br /&gt;}&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;If you just forgot to add the lib to your TARGETLIBS macro in your sources file, the error would look like this instead:&lt;br /&gt;&lt;br /&gt;Linking Executable - s:\depot.obj.amd64chk\proj\objchk\amd64\proj.dll&lt;br /&gt;errors in directory s:\depot\proj&lt;br /&gt;s:\depot\proj.obj : error LNK2001: unresolved external symbol _LibFunction&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4563845593788602086?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4563845593788602086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2010/03/link-error-lnk2001-cdecl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4563845593788602086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4563845593788602086'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2010/03/link-error-lnk2001-cdecl.html' title='Link Error LNK2001 __cdecl'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-6491126707473357303</id><published>2010-02-01T16:15:00.000-08:00</published><updated>2010-02-01T16:17:00.505-08:00</updated><title type='text'>Automatically Launching the Debugger windbg</title><content type='html'>Having the debugger attach to a process as soon as it is created is something that I always end up needing to do, but don’t do every day and sometimes forget how to do it.  Today I needed to do it again, so one of my coworkers reminded me how to do it. &lt;br /&gt;&lt;br /&gt;One way is to just debug with the kernel debugger which is the more hardcore way to always debug.  Once you have attached remotely to your test machine with the kernel debugger, you can go to any process you want.  I think this is the best way if you regularly write kernel code. &lt;br /&gt;&lt;br /&gt;I don’t write kernel code all that often, so I normally use windbg on the machine directly.  If you need to debug two processes because the talk to each other via DCOM or RPC directly, you will need to attach windbg to each process.  If the other process launches on demand, you will need a way to automatically launch windbg to attach to the process.  There is a mechanism built into Windows for just the thing.  You can read this MSDN blog post about it. &lt;br /&gt;&lt;a href="http://blogs.msdn.com/junfeng/archive/2004/04/28/121871.aspx"&gt;&lt;br /&gt;http://blogs.msdn.com/junfeng/archive/2004/04/28/121871.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The short of it is to add the value “Debugger” to a key that is the name of your executable at:&lt;br /&gt;&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options&lt;br /&gt;&lt;br /&gt;So, the common case would be to add the key “dllhost.exe” and then give that key a new string value called “Debugger” with “windbg.exe” as the data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-6491126707473357303?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/6491126707473357303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2010/02/automatically-launching-debugger-windbg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/6491126707473357303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/6491126707473357303'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2010/02/automatically-launching-debugger-windbg.html' title='Automatically Launching the Debugger windbg'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4924749905633170275</id><published>2010-01-26T11:34:00.000-08:00</published><updated>2010-01-26T12:58:55.777-08:00</updated><title type='text'>BEGIN_OBJECT_MAP Removal Update</title><content type='html'>I recently run into a bug in where my dll was supposed to support multiple objects.  In my &lt;a href="http://samscode.blogspot.com/2009/10/atl-removal-part-3-tackling-module-and.html"&gt;previous post&lt;/a&gt;, I was just supporting one.  When com was calling DllGetClassObject, it was always just getting one object, which was incorrect.  So this is how I went about fixing it.&lt;br /&gt;Imagine you ATL code had something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;BEGIN_OBJECT_MAP(ObjectMap)&lt;br /&gt;   OBJECT_ENTRY(CLSID_Obj1, CObj1)&lt;br /&gt;   OBJECT_ENTRY(CLSID_Obj2, CObj2)&lt;br /&gt;   OBJECT_ENTRY(CLSID_Obj3, CObj3)&lt;br /&gt;END_OBJECT_MAP()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In your class factory, you need to be able to create the correct object.  First I fixed my class factory object.&lt;br /&gt;I added a new member variable:&lt;br /&gt;REFCLSID m_clsid;&lt;br /&gt;And got is set in the constructor:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CClassFactory::CClassFactory(&lt;br /&gt;   REFCLSID clsid) : m_cRef(1), m_clsid(clsid)&lt;br /&gt;{&lt;br /&gt;   IncModuleCount();&lt;br /&gt;}  // CClassFactory::CClassFactory&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next I fixed my CreateInstance method&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;STDMETHODIMP CClassFactory::CreateInstance(&lt;br /&gt;   __in_opt IUnknown *pUnkownOuter,&lt;br /&gt;   REFIID riid,&lt;br /&gt;   __deref_out_opt void **ppv)&lt;br /&gt;{&lt;br /&gt;   HRESULT   hr = S_OK;&lt;br /&gt;   IUnknown *pUnknown = NULL;&lt;br /&gt;&lt;br /&gt;   if (ppv)&lt;br /&gt;   {&lt;br /&gt;       *ppv = NULL;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;       hr = E_INVALIDARG;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (S_OK == hr)&lt;br /&gt;   {&lt;br /&gt;       if (pUnkownOuter)&lt;br /&gt;       {&lt;br /&gt;           hr =  CLASS_E_NOAGGREGATION;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (S_OK == hr)&lt;br /&gt;   {&lt;br /&gt;       if (CLSID_Obj1 == m_clsid)&lt;br /&gt;       {&lt;br /&gt;           pUnknown = new CObj1();&lt;br /&gt;       }&lt;br /&gt;       else if (CLSID_Obj2 == m_clsid)&lt;br /&gt;       {&lt;br /&gt;           pUnknown = new CObj2();&lt;br /&gt;       }&lt;br /&gt;       else if (CLSID_Obj3 == m_clsid)&lt;br /&gt;       {&lt;br /&gt;           pUnknown = new CObj3();&lt;br /&gt;       }&lt;br /&gt;       else&lt;br /&gt;       {&lt;br /&gt;           hr = E_NOINTERFACE;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       if (S_OK == hr &amp;amp;&amp;amp; !pUnknown)&lt;br /&gt;       {&lt;br /&gt;           hr =  E_OUTOFMEMORY;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (S_OK == hr)&lt;br /&gt;   {&lt;br /&gt;       hr = pUnknown-&gt;QueryInterface(riid, ppv);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (pUnknown)&lt;br /&gt;   {&lt;br /&gt;       pUnknown-&gt;Release();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return hr;&lt;br /&gt;}  // CClassFactory::CreateInstance&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then fixed my DllGetClassObject&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;STDAPI  DllGetClassObject(&lt;br /&gt;   __in REFCLSID rclsid,&lt;br /&gt;   __in REFIID riid,&lt;br /&gt;   __deref_out LPVOID FAR *ppv)&lt;br /&gt;{&lt;br /&gt;   HRESULT hr = S_OK;&lt;br /&gt;   CClassFactory *pClassFactory = NULL;&lt;br /&gt;&lt;br /&gt;   if (ppv)&lt;br /&gt;   {&lt;br /&gt;       *ppv = NULL;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;       hr = E_INVALIDARG;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (S_OK == hr)&lt;br /&gt;   {&lt;br /&gt;       pClassFactory = new CClassFactory(rclsid);&lt;br /&gt;&lt;br /&gt;       if (!pClassFactory)&lt;br /&gt;       {&lt;br /&gt;           hr =  E_OUTOFMEMORY;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (S_OK == hr)&lt;br /&gt;   {&lt;br /&gt;       hr = pClassFactory-&gt;QueryInterface(riid, ppv);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (pClassFactory)&lt;br /&gt;   {&lt;br /&gt;       pClassFactory-&gt;Release();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return hr;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4924749905633170275?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4924749905633170275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2010/01/beginobjectmap-removal-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4924749905633170275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4924749905633170275'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2010/01/beginobjectmap-removal-update.html' title='BEGIN_OBJECT_MAP Removal Update'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4054632852403720968</id><published>2009-12-14T13:38:00.000-08:00</published><updated>2009-12-14T13:52:21.319-08:00</updated><title type='text'>Windows Win32 Timer or Time Counting</title><content type='html'>If you want to make a timer that only depends on the kernel, GetTickCount64 is an easy way to do it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms724411%28VS.85%29.aspx"&gt;&lt;br /&gt;http://msdn.microsoft.com/en-us/library/ms724411%28VS.85%29.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The code is simple and would look like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ULONGLONG Ticks = 0;&lt;br /&gt;&lt;br /&gt;Ticks = GetTickCount64();&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;// some code to time&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;Ticks = GetTickCount64() - Ticks;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: GetTickCount64 returns the number of ms since the system was last booted.  Theoretically you might have check for wrapping of the clock; however, 2^64 ms or ~49.7 days is a long time.  If you are worried about that, you might consider other APIs that keep track of the full time with a ms resolution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4054632852403720968?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4054632852403720968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/12/windows-win32-timer-or-time-counting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4054632852403720968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4054632852403720968'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/12/windows-win32-timer-or-time-counting.html' title='Windows Win32 Timer or Time Counting'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4295803402279164441</id><published>2009-12-11T18:06:00.001-08:00</published><updated>2009-12-11T18:07:23.309-08:00</updated><title type='text'>Running cmd.exe as SYSTEM on Win 7 and Vista</title><content type='html'>In Windows, being Administrator has its limitations.  Running as SYSTEM is all powerful.  It is kind of like being root in the UNIX world except you can just su or sudo to SYSTEM.&lt;br /&gt;&lt;br /&gt;I have this lib that can run in kernel mode and in user mode.  I would like to simulate a UM process using the lib doing the same things I would have it do in KM tp measure the performance difference.  To solve this issue, I need to run the process as SYSTEM.&lt;br /&gt;&lt;br /&gt;A while back, I remember doing exactly that in a sysintenrals class.  I ran across &lt;a href="http://verbalprocessor.com/2007/12/05/running-a-cmd-prompt-as-local-system/"&gt;this blog post&lt;/a&gt; that reminded me how to do it.&lt;br /&gt;&lt;br /&gt;1. Download the &lt;a href="http://sysinternals.com"&gt;sysinternals&lt;/a&gt; &lt;a href="http://download.sysinternals.com/Files/PsTools.zip"&gt;PSTools&lt;/a&gt;&lt;br /&gt;2. Copy the files to somewhere in your path&lt;br /&gt;3. In an admin cmd.exe run &gt; psexec -i -s cmd.exe&lt;br /&gt;&lt;br /&gt;That is it.  Anything you run in the shell will be run as LOCAL SYSTEM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4295803402279164441?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4295803402279164441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/12/running-cmdexe-as-system-on-win-7-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4295803402279164441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4295803402279164441'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/12/running-cmdexe-as-system-on-win-7-and.html' title='Running cmd.exe as SYSTEM on Win 7 and Vista'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-2228488192694125473</id><published>2009-10-27T16:50:00.000-07:00</published><updated>2010-03-09T09:23:51.164-08:00</updated><title type='text'>ATL Removal: Part 6 – Replacing CComQIPtr with _com_ptr_t</title><content type='html'>ATL Removal: Part 6 – Replacing CComQIPtr with _com_ptr_t&lt;br /&gt;In part 4 of ATL removal, I talked about removing CComPtr and replacing it with _com_ptr_t.  You may run into some smart pointers in the form of CComQIPtr.  CComPtr and CComQIPtr have the same base class and CComQIPtr is a super set of CComPtr.  I tried to read up on CComQIPtr in MSDN, but the documentation wasn’t really very helpful.  In the code I am working on, CComQIPtr is used to create a smart pointer and then do a QueryInterface hence the QI.  I verified this is what goes on by looking through the atlbase.h header file from the SDK.&lt;br /&gt;&lt;br /&gt;If you don’t want to depend on ATL in the sense that your binary doesn't load the ATL dlls, the it is fine to still include the .h file, but if you want to purge ATL altogether, read on.  Keep in mind _com_ptr_t doesn't do everything that ATL smart pointers, so some extra manual work may still be required.  This is an example of a case where the extra legwork is required.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;CComQIPtr(IUnknown* lp)&lt;br /&gt;{&lt;br /&gt;        p=NULL;&lt;br /&gt;        if (lp != NULL)&lt;br /&gt;                lp-&gt;QueryInterface(*piid, (void **)&amp;p);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Before I had some code that looked like this:&lt;br /&gt;&lt;pre&gt;CComQIPtr&lt;IYourInterface&gt; spLocaclVariable( m_spMemberProperty);&lt;/pre&gt;&lt;br /&gt;To fix it, I changed it to this:&lt;br /&gt;&lt;pre&gt;_com_ptr_t&lt;_com_IIID&lt; IYourInterface, &amp;__uuidof(IYourInterface)&gt; &gt; spLocaclVariable;&lt;br /&gt;if (spMemberProperty)&lt;br /&gt;{&lt;br /&gt;    spMemberProperty -&gt;QueryInterface(__uuidof(IYourInterface), (void**)&amp; spLocaclVariable);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;I think this should do the trick for your CComQIPtr smart pointers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-2228488192694125473?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/2228488192694125473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-6-replacing-ccomqiptr.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2228488192694125473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2228488192694125473'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-6-replacing-ccomqiptr.html' title='ATL Removal: Part 6 – Replacing CComQIPtr with _com_ptr_t'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-5953084494584155105</id><published>2009-10-27T13:39:00.000-07:00</published><updated>2009-10-27T13:42:19.921-07:00</updated><title type='text'>ATL Removal: Part 5 – Changing ATL’s Lock and Unlock to Slim Reader/Writer (SRW) Locks</title><content type='html'>You may encounter Lock() and Unlock() calls in your ATL based code to synchronize the usage of shared memory amongst your threads.  You get these bonus methods thanks to inheriting from ATL base classes (CComObjectRoot).  Since we are removing ATL, we will have to find an alternative.  Enter Slim Reader/Writer (SRW) locks.&lt;br /&gt;&lt;br /&gt;SRW locks are not loaded with tons of features like some of the other locks that Microsoft has to offer ; however, they fast and easy on the memory foot print.  In fact, you can consider using SRW locks instead of ATL locking as a performance enhancement.  I won’t get into SRW locks here, but you can read more about them on MSDN here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa904937%28VS.85%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa904937%28VS.85%29.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first thing to do is add a SRWLOCK member like so:&lt;br /&gt;&lt;br /&gt;SRWLOCK m_Lock;&lt;br /&gt;&lt;br /&gt;Then in your class’ constructor add the initialization:&lt;br /&gt;&lt;br /&gt;InitializeSRWLock(&amp;amp;m_Lock);&lt;br /&gt;&lt;br /&gt;Replace Lock() with this:&lt;br /&gt;&lt;br /&gt;AcquireSRWLockExclusive(&amp;amp;m_Lock);&lt;br /&gt;&lt;br /&gt;And Unlock() with this:&lt;br /&gt;&lt;br /&gt;ReleaseSRWLockExclusive(&amp;amp;m_Lock);&lt;br /&gt;&lt;br /&gt;As you can see from the MSDN documentation SRW locks can do more than exclusive locks.  You might want to look at these other SRW functions to give your critical sections just the right amount of protection. &lt;br /&gt;&lt;p&gt;The following are the SRW lock functions (&lt;a href="http://msdn.microsoft.com/en-us/library/aa904937%28VS.85%29.aspx"&gt;from MSDN&lt;/a&gt;).&lt;/p&gt; &lt;table&gt; &lt;tbody&gt;&lt;tr&gt;&lt;th&gt;SRW lock function&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;a id="ctl00_MainContent_ctl01" href="http://msdn.microsoft.com/en-us/library/ms681930%28VS.85%29.aspx" onclick="javascript:Track('ctl00_MainContent_ctl00|ctl00_MainContent_ctl01',this);"&gt;&lt;strong&gt;AcquireSRWLockExclusive&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Acquires an SRW lock in exclusive mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;a id="ctl00_MainContent_ctl02" href="http://msdn.microsoft.com/en-us/library/ms681934%28VS.85%29.aspx" onclick="javascript:Track('ctl00_MainContent_ctl00|ctl00_MainContent_ctl02',this);"&gt;&lt;strong&gt;AcquireSRWLockShared&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Acquires an SRW lock in shared mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;a id="ctl00_MainContent_ctl03" href="http://msdn.microsoft.com/en-us/library/ms683483%28VS.85%29.aspx" onclick="javascript:Track('ctl00_MainContent_ctl00|ctl00_MainContent_ctl03',this);"&gt;&lt;strong&gt;InitializeSRWLock&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Initialize an SRW lock.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;a id="ctl00_MainContent_ctl04" href="http://msdn.microsoft.com/en-us/library/ms685076%28VS.85%29.aspx" onclick="javascript:Track('ctl00_MainContent_ctl00|ctl00_MainContent_ctl04',this);"&gt;&lt;strong&gt;ReleaseSRWLockExclusive&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Releases an SRW lock that was opened in exclusive mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;a id="ctl00_MainContent_ctl05" href="http://msdn.microsoft.com/en-us/library/ms685080%28VS.85%29.aspx" onclick="javascript:Track('ctl00_MainContent_ctl00|ctl00_MainContent_ctl05',this);"&gt;&lt;strong&gt;ReleaseSRWLockShared&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Releases an SRW lock that was opened in shared mode.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;a id="ctl00_MainContent_ctl06" href="http://msdn.microsoft.com/en-us/library/ms686304%28VS.85%29.aspx" onclick="javascript:Track('ctl00_MainContent_ctl00|ctl00_MainContent_ctl06',this);"&gt;&lt;strong&gt;SleepConditionVariableSRW&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sleeps on the specified condition variable and releases the specified lock as an atomic operation.&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-5953084494584155105?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/5953084494584155105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-5-changing-atls-lock.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/5953084494584155105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/5953084494584155105'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-5-changing-atls-lock.html' title='ATL Removal: Part 5 – Changing ATL’s Lock and Unlock to Slim Reader/Writer (SRW) Locks'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-3771172012855818921</id><published>2009-10-26T18:19:00.000-07:00</published><updated>2010-03-09T09:22:15.516-08:00</updated><title type='text'>ATL Removal: Part 4 – Replacing CComPtr with _com_ptr_t</title><content type='html'>CComPtr (a.k.a. smart pointer) is another helpful template class provided in ATL that is intended to make COM programming easier.  CComPtr wraps and abstracts the com object and does all of the lifetime management stuff automatically for you like calling AddRef and Release.  Lifetime management is not that tricky to do it on your own.  A pattern I like to use is call AddRef when I get passed a com object that I need to use, and then call Release when I am done using it.  It’s not very complicated to get it right.  Also, just because you are using a CComPtr, it is possible to still screw up the ref count and cause leaks or double frees, so you still need to know what you are doing with them to avoid these issues.  Let’s move on to the topic at hand, replacing CComPtr.&lt;br /&gt;&lt;br /&gt;Trying to just get rid of CComPtrs and code straight com objects could be a pain since it more about redoing the entire coding pattern of the project instead of modifying declarations.  If you don’t want to depend on ATL in the sense that your binary doesn't load the ATL dlls, the it is fine to still include the .h file, but if you want to purge ATL altogether, read on.  Keep in mind _com_ptr_t doesn't do everything that ATL smart pointers, so some extra manual work may still be required.&lt;br /&gt;&lt;br /&gt;Luckily there is compiler support for non-ATL smart pointers in the form of _com_ptr_t that will allow us to change the declarations instead of the coding pattern.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/417w8b3b%28VS.80%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/417w8b3b(VS.80).aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So this is what a declaration might look like before:&lt;br /&gt;&lt;br /&gt;CComPtr&lt;iyourinterface&gt; m_spYourInterface;&lt;br /&gt;&lt;br /&gt;And this is what it would look like afterwards:&lt;br /&gt;&lt;br /&gt;_com_ptr_t&lt;_com_iiid&lt;&gt; &gt; m_spYourInterface;&lt;br /&gt;&lt;br /&gt;Additionally you will need to add comip.h to your stdafx.h file, and USE_MSVCRT=1 comsuppw.lib to your TARGETLIBS in the sources file to get your project to compile and link.&lt;br /&gt;&lt;br /&gt;Here are some errors you might hit:&lt;br /&gt;&lt;br /&gt;file.cpp(776) : error C2039: 'CopyTo' : is not a member of '_com_ptr_t&lt;_iiid&gt;'&lt;br /&gt;&lt;br /&gt;The code looks something like this:&lt;br /&gt;&lt;br /&gt;hr = m_spObject.CopyTo( ppObject );&lt;br /&gt;&lt;br /&gt;Change it to this:&lt;br /&gt;&lt;br /&gt;if (&lt;/iyourinterface&gt;m_spObject) &lt;iyourinterface&gt;m_spObject.AddRef();&lt;br /&gt;*ppObject = m_spObject;&lt;br /&gt;&lt;br /&gt;I guess _com_ptr_t&lt;_iiid&gt; does not provide that method, but the little AddRef and assignment does the same thing.&lt;br /&gt;&lt;/iyourinterface&gt;&lt;br /&gt;&lt;br /&gt;You might see this linking error as well:&lt;br /&gt;error LNK2001: unresolved external symbol "void __stdcall _com_issue_error(long)" (?&lt;br /&gt;_com_issue_error@@YGXJ@Z)&lt;br /&gt;&lt;br /&gt;You need to make sure you enable compiler support for _com_ptr_t smart pointers.  Add the following to your sources file:&lt;br /&gt;&lt;br /&gt;USE_MSVCRT=1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-3771172012855818921?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/3771172012855818921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-4-replacing-ccomptr.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/3771172012855818921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/3771172012855818921'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-4-replacing-ccomptr.html' title='ATL Removal: Part 4 – Replacing CComPtr with _com_ptr_t'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-257736509736244272</id><published>2009-10-23T13:38:00.000-07:00</published><updated>2009-10-23T13:42:04.768-07:00</updated><title type='text'>ATL Removal: Part 3 – Tackling _Module and OBJECT_MAP</title><content type='html'>&lt;a href="http://samscode.blogspot.com/2009/10/atl-removal-part-1-removing-begincommap.html"&gt;In Part 1, we saw how ATL uses com maps to automatically generate the IUnknown implementation and to manage the objects lifetime.&lt;/a&gt; In this installment we will tackle the object and lifetime management of the DLL.&lt;br /&gt;&lt;br /&gt;Let’s dive into the guts of the DLL management.  This is another place that ATL was intended to save time for the developer.  If you have an ATL based DLL, you might notice something like this in your main DLL source file.&lt;br /&gt;&lt;pre&gt;CComModule _Module;&lt;br /&gt;BEGIN_OBJECT_MAP(ObjectMap)&lt;br /&gt;  OBJECT_ENTRY(CLSID_YourClass, CYourClass)&lt;br /&gt;END_OBJECT_MAP()&lt;br /&gt;&lt;/pre&gt;The _Module object is designed to manage the lifetime of your DLL.  You ATL CComObjects objects will automatically call _Module.Lock() and _Module.Unlock().  Awsome!  If you use _Module in your ATL based DLL and some non ATL com objects, make sure the lock and unlock _Module in the constructors and destructors respectively; I fixed a bug last year where my DLL was prematurely getting unloaded because of this.  The first thing to do to replace _Module is to add:&lt;br /&gt;&lt;pre&gt;LONG g_cLockCount = 0;&lt;br /&gt;&lt;br /&gt;inline VOID IncModuleCount()&lt;br /&gt;{&lt;br /&gt;  InterlockedIncrement(&amp;amp;g_cLockCount);&lt;br /&gt;}  // IncModuleCount&lt;br /&gt;&lt;br /&gt;inline VOID DecModuleCount()&lt;br /&gt;{&lt;br /&gt;  InterlockedDecrement(&amp;amp;g_cLockCount);&lt;br /&gt;}  // DecModuleCount&lt;br /&gt;&lt;/pre&gt;You DLL can use that to keep track of the active objects so I can know when it is safe to unload.&lt;br /&gt;&lt;br /&gt;Next let’s look at the object map.  What does that buy for you?  It basically provides you a free implementation of IClassFactory.  Is it hard to write your own?  No, I will show you how right now.&lt;br /&gt;You can create a file called ClassFactory.h that looks like this:&lt;br /&gt;&lt;pre&gt;class CClassFactory:&lt;br /&gt;  public IClassFactory&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;  // IUnknown&lt;br /&gt;  STDMETHODIMP_(ULONG) AddRef();&lt;br /&gt;  STDMETHODIMP_(ULONG) Release();&lt;br /&gt;  STDMETHODIMP QueryInterface(&lt;br /&gt;      REFIID riid,&lt;br /&gt;      __deref_out_opt void **ppv);&lt;br /&gt;&lt;br /&gt;  // IClassFactory&lt;br /&gt;  STDMETHODIMP CreateInstance(&lt;br /&gt;      __in_opt IUnknown *punkOuter,&lt;br /&gt;      REFIID iid,&lt;br /&gt;      __deref_out_opt void **ppv);&lt;br /&gt;&lt;br /&gt;  STDMETHODIMP LockServer(&lt;br /&gt;      BOOL fLock);&lt;br /&gt;&lt;br /&gt;  // Constructor / Destuctor&lt;br /&gt;  CClassFactory();&lt;br /&gt;  ~CClassFactory();&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;  LONG m_cRef;&lt;br /&gt;}; // CClassFactory&lt;br /&gt;&lt;/pre&gt;Now, let’s look at the implementation.  Here is the content of ClassFactory.cpp:&lt;br /&gt;&lt;pre&gt;#include "stdafx.h"&lt;br /&gt;&lt;br /&gt;//---------------------------------------------------------------------------&lt;br /&gt;// Begin CClassFactory implemetation&lt;br /&gt;//---------------------------------------------------------------------------&lt;br /&gt;extern LONG g_cLockCount;&lt;br /&gt;&lt;br /&gt;CClassFactory::CClassFactory():&lt;br /&gt;  m_cRef(1)&lt;br /&gt;{&lt;br /&gt;  InterlockedIncrement(&amp;amp;g_cLockCount);&lt;br /&gt;}  // CClassFactory::CClassFactory&lt;br /&gt;&lt;br /&gt;CClassFactory::~CClassFactory()&lt;br /&gt;{&lt;br /&gt;  InterlockedDecrement(&amp;amp;g_cLockCount);&lt;br /&gt;}  // CClassFactory::~CClassFactory&lt;br /&gt;&lt;br /&gt;STDMETHODIMP_(ULONG) CClassFactory::AddRef()&lt;br /&gt;{&lt;br /&gt;  return InterlockedIncrement(&amp;amp;m_cRef);&lt;br /&gt;}  // CClassFactory::AddRef&lt;br /&gt;&lt;br /&gt;STDMETHODIMP_(ULONG) CClassFactory::Release()&lt;br /&gt;{&lt;br /&gt;  LONG cRef = InterlockedDecrement(&amp;amp;m_cRef);&lt;br /&gt;&lt;br /&gt;  if (!cRef)&lt;br /&gt;  {&lt;br /&gt;      delete this;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return cRef;&lt;br /&gt;}  // CClassFactory::Release&lt;br /&gt;&lt;br /&gt;STDMETHODIMP CClassFactory::QueryInterface(&lt;br /&gt;  REFIID riid,&lt;br /&gt;  __deref_out_opt void **ppv)&lt;br /&gt;{&lt;br /&gt;  HRESULT hr = S_OK;&lt;br /&gt;&lt;br /&gt;  if (ppv)&lt;br /&gt;  {&lt;br /&gt;      *ppv = NULL;      &lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;      hr = E_INVALIDARG;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;      if (IID_IUnknown == riid)&lt;br /&gt;      {&lt;br /&gt;          AddRef();&lt;br /&gt;          *ppv = (IUnknown*)(IClassFactory*)this;&lt;br /&gt;      }&lt;br /&gt;      else if (IID_IClassFactory == riid)&lt;br /&gt;      {&lt;br /&gt;          AddRef();&lt;br /&gt;          *ppv = (IClassFactory*)this;&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;          hr = E_NOINTERFACE;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return hr;&lt;br /&gt;}  // CClassFactory::QueryInterface&lt;br /&gt;&lt;br /&gt;STDMETHODIMP CClassFactory::CreateInstance(&lt;br /&gt;  __in_opt IUnknown *pUnkownOuter,&lt;br /&gt;  REFIID riid,&lt;br /&gt;  __deref_out_opt void **ppv)&lt;br /&gt;{&lt;br /&gt;  HRESULT   hr = S_OK;&lt;br /&gt;  IUnknown *pUnknown = NULL;&lt;br /&gt;&lt;br /&gt;  if (ppv)&lt;br /&gt;  {&lt;br /&gt;      *ppv = NULL;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;      hr = E_INVALIDARG;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;      if (pUnkownOuter)&lt;br /&gt;      {&lt;br /&gt;          hr =  CLASS_E_NOAGGREGATION;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;      pUnknown = new(std::nothrow) CAudioProvider();&lt;br /&gt;&lt;br /&gt;      if (!pUnknown)&lt;br /&gt;      {&lt;br /&gt;          hr =  E_OUTOFMEMORY;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;      hr = pUnknown-&gt;QueryInterface(riid, ppv);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (pUnknown)&lt;br /&gt;  {&lt;br /&gt;      pUnknown-&gt;Release();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return hr;&lt;br /&gt;}  // CClassFactory::CreateInstance&lt;br /&gt;&lt;br /&gt;STDMETHODIMP CClassFactory::LockServer(&lt;br /&gt;  BOOL fLock)&lt;br /&gt;{&lt;br /&gt;  if (fLock)&lt;br /&gt;  {&lt;br /&gt;      InterlockedIncrement(&amp;amp;g_cLockCount);&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;      InterlockedDecrement(&amp;amp;g_cLockCount);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return S_OK;&lt;br /&gt;}  // CClassFactory::LockServer&lt;br /&gt;//---------------------------------------------------------------------------&lt;br /&gt;// End CClassFactory implemetation&lt;br /&gt;//---------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;Next you will have to fix the rest of the DllMain cpp file.  This is what a simple version would look like clean of ATL&lt;br /&gt;&lt;pre&gt;extern "C"&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;BOOL APIENTRY DllMain(&lt;br /&gt;  HMODULE hModule,&lt;br /&gt;  ULONG ulReason,&lt;br /&gt;  __in_opt PVOID pReserved)&lt;br /&gt;{&lt;br /&gt;  BOOL fRetVal = TRUE;&lt;br /&gt;&lt;br /&gt;  if (DLL_PROCESS_ATTACH == ulReason)&lt;br /&gt;  {&lt;br /&gt;      // Disable thread attach notifications&lt;br /&gt;      fRetVal = DisableThreadLibraryCalls(hModule);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return fRetVal;&lt;br /&gt;} // DllMain&lt;br /&gt;&lt;br /&gt;STDAPI DllGetClassObject(&lt;br /&gt;  __in REFCLSID rclsid,&lt;br /&gt;  __in REFIID riid,&lt;br /&gt;  __deref_out LPVOID FAR *ppv)&lt;br /&gt;{&lt;br /&gt;  HRESULT hr = S_OK;&lt;br /&gt;  CClassFactory* pClassFactory = NULL;&lt;br /&gt;&lt;br /&gt;  if (ppv)&lt;br /&gt;  {&lt;br /&gt;      *ppv = NULL;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;      hr = E_INVALIDARG;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;      if (CLSID_fdAudio != rclsid)&lt;br /&gt;      {&lt;br /&gt;          hr = CLASS_E_CLASSNOTAVAILABLE;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;      pClassFactory = new(std::nothrow) CClassFactory;&lt;br /&gt;&lt;br /&gt;      if (!pClassFactory)&lt;br /&gt;      {&lt;br /&gt;          hr =  E_OUTOFMEMORY;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;      hr = pClassFactory-&gt;QueryInterface(riid, ppv);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (pClassFactory)&lt;br /&gt;  {&lt;br /&gt;      pClassFactory-&gt;Release();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return hr;&lt;br /&gt;}  // DLLGetClassObject&lt;br /&gt;&lt;br /&gt;HRESULT APIENTRY DllCanUnloadNow()&lt;br /&gt;{&lt;br /&gt;  return (g_cLockCount == 0) ? S_OK : S_FALSE;&lt;br /&gt;}  // DllCanUnloadNow&lt;br /&gt;&lt;br /&gt;} // extern "C"&lt;br /&gt;&lt;/pre&gt;Finally you will have to fix your ATL free com objects in their constructors to increment and decrement the DLL lock count.  By calling these:&lt;br /&gt;&lt;pre&gt;inline VOID IncModuleCount()&lt;br /&gt;{&lt;br /&gt;  InterlockedIncrement(&amp;amp;g_cLockCount);&lt;br /&gt;}  // IncModuleCount&lt;br /&gt;&lt;br /&gt;inline VOID DecModuleCount()&lt;br /&gt;{&lt;br /&gt;  InterlockedDecrement(&amp;amp;g_cLockCount);&lt;br /&gt;}  // DecModuleCount&lt;br /&gt;&lt;/pre&gt;Hopefully this will get you one step closer to being ATL free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-257736509736244272?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/257736509736244272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-3-tackling-module-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/257736509736244272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/257736509736244272'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-3-tackling-module-and.html' title='ATL Removal: Part 3 – Tackling _Module and OBJECT_MAP'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-8094159081018222617</id><published>2009-10-22T14:25:00.000-07:00</published><updated>2009-10-22T14:26:27.063-07:00</updated><title type='text'>ATL Removal: Part 2 – Safely Deleting ATL_NO_VTABLE</title><content type='html'>As I was going through and purging ATL from my project, I ran into the macro ATL_NO_VTABLE.  It appears that some ATL project generators slap that baby into your class definition. &lt;br /&gt;&lt;br /&gt;class ATL_NO_VTABLE CYourClass :…&lt;br /&gt;&lt;br /&gt;It turns out that it is an optimization “that prevents the vtable pointer from being initialized in the class's constructor and destructor.  If the vtable pointer is prevented from being initialized in the class's constructor and destructor, the linker can eliminate the vtable and all of the functions to which it points. Expands to __declspec(novtable).”&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/6h06t6s8%28VS.80%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/6h06t6s8%28VS.80%29.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It sounds like a good optimization for ATL code since your object will be wrapped by CComObject anyway; however, with normal com code, having the vtable line up with IUnknown is important.  In turning your ATL com object into to a regular com object, it is safe to just remove ATL_NO_VTABLE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-8094159081018222617?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/8094159081018222617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-2-safely-deleting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/8094159081018222617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/8094159081018222617'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-2-safely-deleting.html' title='ATL Removal: Part 2 – Safely Deleting ATL_NO_VTABLE'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-7936301380552879622</id><published>2009-10-21T16:50:00.000-07:00</published><updated>2009-10-26T16:25:17.391-07:00</updated><title type='text'>ATL Removal: Part 1 – Removing BEGIN_COM_MAP() and END_COM_MAP()</title><content type='html'>There are some who feel that ATL is the best thing since sliced bread for COM programming. ATL can abstract a lot of the nitty gritty COM programming away from the COM programmer. My goal today is not to bash ATL. I think it can be a great time saver if used correctly for the right level of code. If you are programming UI, or an IE plugin, go right ahead and use ATL if you like. If you are writing lower level system APIs, please don’t. Also, ATL cannot be used for an excuse for not understanding COM programming or memory management. I have spent the last year fixing lots of bugs because someone didn’t understand what ATL was doing, things like: double frees, double releases, memory leaks, leaked references, and so on. In other words, ATL is not a sliver bullet for API usage ignorance. I don’t like using ATL because: writing straight COM code is not much harder, and ATL makes debugging more annoying. So, in the end for me, ATL does not buy me much, and is somewhat annoying. If you like ATL and know what it is really doing so you use it correctly, go ahead and use it. Independent of my no ATL preference, one API I am maintaining needs to be “low level” and therefore should not depend on ATL, so I am removing ATL from that API.&lt;br /&gt;&lt;br /&gt;ATL wants to internally manage the ref counts to your ATL based com object. To do this, it wraps your com object using a template class called CComObject. CComObject basically adds two extra layers to your com object. For debugging, it does make things a little bit more annoying, but it is supposed to manage the lifetime of your object for you.&lt;br /&gt;&lt;br /&gt;The first thing to do is to remove the COM_MAP macros needed to set up all of the CComObject hooks. When you have an ATL generated COM object, it creates for you something like this in your header:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;BEGIN_COM_MAP(CYourInterface)&lt;br /&gt;  COM_INTERFACE_ENTRY(IYourInterface)&lt;br /&gt;END_COM_MAP()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Basically these macros help write your IUnknown implementation. Not really that big of a time saver as it is not that hard to implement IUnknown. The first step is to remove COM_MAP macro stuff from your header and swap it for the IUnknown definition. Here is one example that you see often:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;STDMETHOD(QueryInterface)(IN REFIID riid, OUT void ** ppv);&lt;br /&gt;STDMETHOD_(ULONG, AddRef)(void);&lt;br /&gt;STDMETHOD_(ULONG, Release)(void);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next, in your cpp file where you implement your com object, you will need to add the implementation of IUnknown. This too is almost boiler plate.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;// Implementation : IUnknown&lt;br /&gt;//////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;ULONG CYourInterface::AddRef()&lt;br /&gt;{&lt;br /&gt;  return InterlockedIncrement(&amp;amp;m_cRef);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ULONG CYourInterface::Release()&lt;br /&gt;{&lt;br /&gt;  LONG cRef = InterlockedDecrement(&amp;amp;m_cRef);&lt;br /&gt;&lt;br /&gt;  if (0 == cRef)&lt;br /&gt;  {&lt;br /&gt;      delete this;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return cRef;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;HRESULT CYourInterface::QueryInterface(REFIID riid, __deref_out_opt void **ppv)&lt;br /&gt;{&lt;br /&gt;  HRESULT hr = S_OK;&lt;br /&gt;&lt;br /&gt;  if (ppv)&lt;br /&gt;  {&lt;br /&gt;      *ppv = NULL;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;      hr = E_INVALIDARG;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;      if ((__uuidof(IUnknown) == riid)  (riid == __uuidof(IYourInterface)))&lt;br /&gt;      {&lt;br /&gt;          AddRef();&lt;br /&gt;          *ppv = (IYourInterface *)this;&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;          hr = E_NOINTERFACE;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return hr;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally make sure that you add a:&lt;br /&gt;&lt;br /&gt;LONG m_cRef;&lt;br /&gt;&lt;br /&gt;Member in your class, and make sure you initialize it to 1 in your constructor.&lt;br /&gt;&lt;br /&gt;m_cRef(1)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-7936301380552879622?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/7936301380552879622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-1-removing-begincommap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7936301380552879622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7936301380552879622'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/atl-removal-part-1-removing-begincommap.html' title='ATL Removal: Part 1 – Removing BEGIN_COM_MAP() and END_COM_MAP()'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4344132217413803661</id><published>2009-10-13T16:53:00.000-07:00</published><updated>2009-10-13T17:18:50.555-07:00</updated><title type='text'>GPU Accelerated FDTD Using Cg</title><content type='html'>Apparently there has been some interested in my old GPU accelerated FDTD code implemented in C and Cg.  I also had a CUDA version that had a hard time meeting the performance of the Cg version.  I will need to check when I get home to see if I can find the other versions.  Here is one version that I found on one of my old sites.  It looks like it is version 0.1 and about three years old.  I know I have a better versions somewhere out there, but this will give you a "taste" until I can find the other versions.  Still, there are some interesting aspects of this code.  I used an interesting 3D volume packing scheme for 2D textures that you can read about in GPU Gems 2.  Also a lot of the guts of this code initially came from Dom's basic math tutorial for Cg. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cg_fdtd: clean&lt;br /&gt; gcc test.c -o cg_fdtd -lglut -lGLEW -lCgGL -lpthread&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt; rm -f cg_fdtd&lt;br /&gt;&lt;br /&gt;test: cg_fdtd&lt;br /&gt; ./cg_fdtd 256 10&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt; * test.c&lt;br /&gt; *&lt;br /&gt; * author      : Sam Adams&lt;br /&gt; * date        : 20061027&lt;br /&gt; * discription : This is my implementation of a basic FDTD using GPU with Cg&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#include &lt;math.h&gt;&lt;br /&gt;#include &lt;time.h&gt;&lt;br /&gt;#include &lt;GL/glew.h&gt;&lt;br /&gt;#include &lt;GL/glut.h&gt;&lt;br /&gt;#include &lt;Cg/cgGL.h&gt;&lt;br /&gt;&lt;br /&gt;#define GLUT_WINDOW_NAME "fdtd window"&lt;br /&gt;&lt;br /&gt;typedef enum bool{false, true} bool;&lt;br /&gt;//clock_gettime&lt;br /&gt;// struct for variable parts of GL calls (texture format, float format etc)&lt;br /&gt;struct struct_textureParameters {&lt;br /&gt; char* name;&lt;br /&gt; GLenum texTarget;&lt;br /&gt; GLenum texInternalFormat;&lt;br /&gt; GLenum texFormat;&lt;br /&gt; char* shader_source;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// struct actually being used (set from command line)&lt;br /&gt;struct struct_textureParameters textureParameters;&lt;br /&gt;&lt;br /&gt;int verbose = 1;&lt;br /&gt;int numIterations = 100; //timesteps for fdtd&lt;br /&gt;int texSize = 256;&lt;br /&gt;&lt;br /&gt;GLuint glutWindowHandle;&lt;br /&gt;GLuint fb;&lt;br /&gt;&lt;br /&gt;enum components{X, Y, Z};&lt;br /&gt;&lt;br /&gt;GLuint *exTexID; // these are z slices for fdtd&lt;br /&gt;GLuint *eyTexID; // the +1 is for the output of the calculations&lt;br /&gt;GLuint *ezTexID;&lt;br /&gt;GLuint *hxTexID;&lt;br /&gt;GLuint *hyTexID;&lt;br /&gt;GLuint *hzTexID;&lt;br /&gt;GLuint psTexID, psEmptyTexID;&lt;br /&gt;&lt;br /&gt;// Cg vars&lt;br /&gt;CGcontext cgContext;&lt;br /&gt;CGprofile fragmentProfile;&lt;br /&gt;CGprogram fragmentProgram;&lt;br /&gt;//fdtd&lt;br /&gt;////for e fields&lt;br /&gt;CGprogram ex_fp, ey_fp, ez_fp; &lt;br /&gt;CGparameter ex_ps, ex_e, ex_h1, ex_h2, ex_h3, ex_h4, ex_esctc, ex_eincc, ex_ei, ex_edevcn, ex_dei, ex_ecrl1, ex_ecrl2;&lt;br /&gt;CGparameter ey_e, ey_h1, ey_h2, ey_h3, ey_h4, ey_esctc, ey_eincc, ey_ei, ey_edevcn, ey_dei, ey_ecrl1, ey_ecrl2;&lt;br /&gt;CGparameter ez_e, ez_h1, ez_h2, ez_h3, ez_h4, ez_esctc, ez_eincc, ez_ei, ez_edevcn, ez_dei, ez_ecrl1, ez_ecrl2;&lt;br /&gt;////for h fields&lt;br /&gt;CGprogram hx_fp, hy_fp, hz_fp;&lt;br /&gt;CGparameter hx_h, hx_e1, hx_e2, hx_e3, hx_e4, hx_dt, hx_delta1, hx_delta2;&lt;br /&gt;CGparameter hy_h, hy_e1, hy_e2, hy_e3, hy_e4, hy_dt, hy_delta1, hy_delta2;&lt;br /&gt;CGparameter hz_h, hz_e1, hz_e2, hz_e3, hz_e4, hz_dt, hz_delta1, hz_delta2;&lt;br /&gt;&lt;br /&gt;float* tmpData;&lt;br /&gt;//fdtd Cg update sources&lt;br /&gt;char *hx_hUpdate_source = \&lt;br /&gt;"float hUpdate ("\&lt;br /&gt;"in float2 coords : TEXCOORD0, "\&lt;br /&gt;"uniform samplerRECT textureH, "\&lt;br /&gt;"uniform samplerRECT textureE1, "\&lt;br /&gt;"uniform samplerRECT textureE2, "\&lt;br /&gt;"uniform samplerRECT textureE3, "\&lt;br /&gt;"uniform samplerRECT textureE4, "\&lt;br /&gt;"uniform float dt, "\&lt;br /&gt;"uniform float delta1, "\&lt;br /&gt;"uniform float delta2) : COLOR{ "\&lt;br /&gt;"float h = texRECT(textureH, coords); "\&lt;br /&gt;"float e1 = texRECT(textureE1, coords); "\&lt;br /&gt;"float e2 = texRECT(textureE2, coords); "\&lt;br /&gt;"float e3 = texRECT(textureE3, coords+(0.0,1.0)); "\&lt;br /&gt;"float e4 = texRECT(textureE4, coords); "\&lt;br /&gt;"return h + ((dt / 0.0000012566306) *((e1 - e2) / delta1 - (e3 - e4) / delta2)); }";&lt;br /&gt;&lt;br /&gt;char *hy_hUpdate_source = \&lt;br /&gt;"float hUpdate ("\&lt;br /&gt;"in float2 coords : TEXCOORD0, "\&lt;br /&gt;"uniform samplerRECT textureH, "\&lt;br /&gt;"uniform samplerRECT textureE1, "\&lt;br /&gt;"uniform samplerRECT textureE2, "\&lt;br /&gt;"uniform samplerRECT textureE3, "\&lt;br /&gt;"uniform samplerRECT textureE4, "\&lt;br /&gt;"uniform float dt, "\&lt;br /&gt;"uniform float delta1, "\&lt;br /&gt;"uniform float delta2) : COLOR{ "\&lt;br /&gt;"float h = texRECT(textureH, coords); "\&lt;br /&gt;"float e1 = texRECT(textureE1, coords+(1.0,0.0)); "\&lt;br /&gt;"float e2 = texRECT(textureE2, coords); "\&lt;br /&gt;"float e3 = texRECT(textureE3, coords); "\&lt;br /&gt;"float e4 = texRECT(textureE4, coords); "\&lt;br /&gt;"return h + ((dt / 0.0000012566306) *((e1 - e2) / delta1 - (e3 - e4) / delta2)); }";&lt;br /&gt;&lt;br /&gt;char *hz_hUpdate_source = \&lt;br /&gt;"float hUpdate ("\&lt;br /&gt;"in float2 coords : TEXCOORD0, "\&lt;br /&gt;"uniform samplerRECT textureH, "\&lt;br /&gt;"uniform samplerRECT textureE1, "\&lt;br /&gt;"uniform samplerRECT textureE2, "\&lt;br /&gt;"uniform samplerRECT textureE3, "\&lt;br /&gt;"uniform samplerRECT textureE4, "\&lt;br /&gt;"uniform float dt, "\&lt;br /&gt;"uniform float delta1, "\&lt;br /&gt;"uniform float delta2) : COLOR{ "\&lt;br /&gt;"float h = texRECT(textureH, coords); "\&lt;br /&gt;"float e1 = texRECT(textureE1, coords+(0.0,1.0)); "\&lt;br /&gt;"float e2 = texRECT(textureE2, coords); "\&lt;br /&gt;"float e3 = texRECT(textureE3, coords+(1.0,0.0)); "\&lt;br /&gt;"float e4 = texRECT(textureE4, coords); "\&lt;br /&gt;"return h + ((dt / 0.0000012566306) *((e1 - e2) / delta1 - (e3 - e4) / delta2)); }";&lt;br /&gt;&lt;br /&gt;char *ex_eUpdate_source = \&lt;br /&gt;"float eUpdate ("\&lt;br /&gt;"in float2 coords : TEXCOORD0, "\&lt;br /&gt;"uniform samplerRECT texturePS, "\&lt;br /&gt;"uniform samplerRECT textureE, "\&lt;br /&gt;"uniform samplerRECT textureH1, "\&lt;br /&gt;"uniform samplerRECT textureH2, "\&lt;br /&gt;"uniform samplerRECT textureH3, "\&lt;br /&gt;"uniform samplerRECT textureH4, "\&lt;br /&gt;"uniform float esctc, "\&lt;br /&gt;"uniform float eincc, "\&lt;br /&gt;"uniform float ei, "\&lt;br /&gt;"uniform float edevcn, "\&lt;br /&gt;"uniform float dei, "\&lt;br /&gt;"uniform float ecrl1, "\&lt;br /&gt;"uniform float ecrl2 ) : COLOR{ "\&lt;br /&gt;"float ps = texRECT(texturePS, coords); "\&lt;br /&gt;"float e = texRECT(textureE, coords); "\&lt;br /&gt;"float h1 = texRECT(textureH1, coords); "\&lt;br /&gt;"float h2 = texRECT(textureH2, coords+(0.0,1.0)); "\&lt;br /&gt;"float h3 = texRECT(textureH3, coords); "\&lt;br /&gt;"float h4 = texRECT(textureH4, coords); "\&lt;br /&gt;"float tmp = ps;"\&lt;br /&gt;"if(ps != 0.0) tmp = ps;"\&lt;br /&gt;/*"else tmp = e * esctc - eincc * ei - edevcn * dei + (h1 - h2) * ecrl1 - (h3 - h4) * ecrl2;"\*/&lt;br /&gt;"else tmp = e * esctc - eincc * ei - edevcn * dei + ((h1 - h2) * ecrl1) - ((h3 - h4) * ecrl2);"\&lt;br /&gt;"return tmp;}";&lt;br /&gt;&lt;br /&gt;//"return e * esctc - eincc * ei - edevcn * dei + (h1 - h2) * ecrl1 - (h3 - h4) * ecrl2;}";&lt;br /&gt;//"return e * esctc - eincc * ei - edevcn * dei + (h1 -h2) * ecrl1;}";&lt;br /&gt;&lt;br /&gt;char *ey_eUpdate_source = \&lt;br /&gt;"float eUpdate ("\&lt;br /&gt;"in float2 coords : TEXCOORD0, "\&lt;br /&gt;"uniform samplerRECT textureE, "\&lt;br /&gt;"uniform samplerRECT textureH1, "\&lt;br /&gt;"uniform samplerRECT textureH2, "\&lt;br /&gt;"uniform samplerRECT textureH3, "\&lt;br /&gt;"uniform samplerRECT textureH4, "\&lt;br /&gt;"uniform float esctc, "\&lt;br /&gt;"uniform float eincc, "\&lt;br /&gt;"uniform float ei, "\&lt;br /&gt;"uniform float edevcn, "\&lt;br /&gt;"uniform float dei, "\&lt;br /&gt;"uniform float ecrl1, "\&lt;br /&gt;"uniform float ecrl2 ) : COLOR{ "\&lt;br /&gt;"float e = texRECT(textureE, coords); "\&lt;br /&gt;"float h1 = texRECT(textureH1, coords); "\&lt;br /&gt;"float h2 = texRECT(textureH2, coords); "\&lt;br /&gt;"float h3 = texRECT(textureH3, coords); "\&lt;br /&gt;"float h4 = texRECT(textureH4, coords+(1.0,0.0)); "\&lt;br /&gt;"return e * esctc - eincc * ei - edevcn * dei + (h1 - h2) * ecrl1 - (h3 - h4) * ecrl2; }";&lt;br /&gt;&lt;br /&gt;char *ez_eUpdate_source = \&lt;br /&gt;"float eUpdate ("\&lt;br /&gt;"in float2 coords : TEXCOORD0, "\&lt;br /&gt;"uniform samplerRECT textureE, "\&lt;br /&gt;"uniform samplerRECT textureH1, "\&lt;br /&gt;"uniform samplerRECT textureH2, "\&lt;br /&gt;"uniform samplerRECT textureH3, "\&lt;br /&gt;"uniform samplerRECT textureH4, "\&lt;br /&gt;"uniform float esctc, "\&lt;br /&gt;"uniform float eincc, "\&lt;br /&gt;"uniform float ei, "\&lt;br /&gt;"uniform float edevcn, "\&lt;br /&gt;"uniform float dei, "\&lt;br /&gt;"uniform float ecrl1, "\&lt;br /&gt;"uniform float ecrl2 ) : COLOR{ "\&lt;br /&gt;"float e = texRECT(textureE, coords); "\&lt;br /&gt;"float h1 = texRECT(textureH1, coords); "\&lt;br /&gt;"float h2 = texRECT(textureH2, coords+(1.0,0.0)); "\&lt;br /&gt;"float h3 = texRECT(textureH3, coords); "\&lt;br /&gt;"float h4 = texRECT(textureH4, coords+(0.0,1.0)); "\&lt;br /&gt;"return e * esctc - eincc * ei - edevcn * dei + (h1 - h2) * ecrl1 - (h3 - h4) * ecrl2; }";&lt;br /&gt;&lt;br /&gt;time_t start, end;&lt;br /&gt;&lt;br /&gt;/* prototypes */&lt;br /&gt;void initGLUT(int argc, char **argv);&lt;br /&gt;void initGLEW();&lt;br /&gt;void initFBO();&lt;br /&gt;void createTextures();&lt;br /&gt;void initCG();&lt;br /&gt;void performComputation();&lt;br /&gt;void checkGLErrors (const char *label);&lt;br /&gt;double cpuBench();&lt;br /&gt;void printVector(float *v, int len);&lt;br /&gt;void transferFromTexture(float* data, GLenum fb);&lt;br /&gt;void initMemory();&lt;br /&gt;//void nextSlice(int i);&lt;br /&gt;void transferToTexture(float* data, GLuint texID);&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv){&lt;br /&gt; int i;&lt;br /&gt; time_t start, stop;&lt;br /&gt; float simTime;&lt;br /&gt; double mflops;&lt;br /&gt; FILE *f;&lt;br /&gt;&lt;br /&gt; f = fopen("results", "a");&lt;br /&gt;&lt;br /&gt; texSize = atoi(argv[1]);&lt;br /&gt; numIterations = atoi(argv[2]);&lt;br /&gt;&lt;br /&gt;// int start, stop;&lt;br /&gt;// struct timespec res;&lt;br /&gt;// clock_getres(CLOCK_REALTIME, &amp;res);&lt;br /&gt; textureParameters.name                               = "TEXRECT - float_NV - R - 32";&lt;br /&gt; textureParameters.texTarget                          = GL_TEXTURE_RECTANGLE_ARB;&lt;br /&gt; textureParameters.texInternalFormat               = GL_FLOAT_R32_NV;&lt;br /&gt; textureParameters.texFormat                          = GL_LUMINANCE;&lt;br /&gt;// start =  clock_gettime(CLOCK_REALTIME, &amp;res);&lt;br /&gt; start = clock();&lt;br /&gt; initMemory();&lt;br /&gt; if(verbose) fprintf(stderr,"initalizing GLUT\n");&lt;br /&gt; initGLUT(argc, argv);&lt;br /&gt; if(verbose) fprintf(stderr,"initalizing GLEW\n");&lt;br /&gt; initGLEW();&lt;br /&gt; if(verbose) fprintf(stderr,"initalizing FBOs\n");&lt;br /&gt; initFBO();&lt;br /&gt; if(verbose) fprintf(stderr,"creating textures\n");&lt;br /&gt; createTextures();&lt;br /&gt; if(verbose) fprintf(stderr,"initalizing Cg\n");&lt;br /&gt; initCG();&lt;br /&gt; if(verbose) fprintf(stderr,"performing calculations\n");&lt;br /&gt; performComputation();&lt;br /&gt; stop = clock();&lt;br /&gt; simTime = (float)(stop-start)/(float)CLOCKS_PER_SEC;&lt;br /&gt; mflops = (double)(63*texSize*texSize*texSize*numIterations)/1000000.0;&lt;br /&gt; printf("time was %f\n", simTime);&lt;br /&gt; fprintf(f,"%i\t%i\t%e\t%e\n",texSize,numIterations,simTime,mflops);&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void initMemory(){&lt;br /&gt; tmpData =  (float*)calloc(sizeof(float),texSize*texSize); // to initalize textures to 0.0&lt;br /&gt; exTexID = (GLuint*)malloc(sizeof(GLuint) * texSize);&lt;br /&gt; eyTexID = (GLuint*)malloc(sizeof(GLuint) * texSize);&lt;br /&gt; ezTexID = (GLuint*)malloc(sizeof(GLuint) * texSize);&lt;br /&gt; hxTexID = (GLuint*)malloc(sizeof(GLuint) * texSize);&lt;br /&gt; hyTexID = (GLuint*)malloc(sizeof(GLuint) * texSize);&lt;br /&gt; hzTexID = (GLuint*)malloc(sizeof(GLuint) * texSize);&lt;br /&gt;/*&lt;br /&gt; exLocation = (int*)malloc(sizeof(int)*texSize);&lt;br /&gt; eyLocation = (int*)malloc(sizeof(int)*texSize);&lt;br /&gt; ezLocation = (int*)malloc(sizeof(int)*texSize);&lt;br /&gt; hxLocation = (int*)malloc(sizeof(int)*texSize);&lt;br /&gt; hyLocation = (int*)malloc(sizeof(int)*texSize);&lt;br /&gt; hzLocation = (int*)malloc(sizeof(int)*texSize);&lt;br /&gt;&lt;br /&gt; exLocation_out = eyLocation_out = ezLocation_out = hxLocation_out = hyLocation_out = hzLocation_out = texSize;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void printVector(float *v, int len){&lt;br /&gt; int i;&lt;br /&gt;&lt;br /&gt; for(i = 0; i &lt; len; i++) printf("%i)\t%f\n",i,v[i]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Checks framebuffer status.&lt;br /&gt; * Copied directly out of the spec, modified to deliver a return value.&lt;br /&gt; */&lt;br /&gt;int checkFramebufferStatus() {&lt;br /&gt; GLenum status;&lt;br /&gt; status = (GLenum) glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);&lt;br /&gt; switch(status) {&lt;br /&gt;  case GL_FRAMEBUFFER_COMPLETE_EXT:&lt;br /&gt;   printf("Framebuffer complete\n");&lt;br /&gt;   return 1;&lt;br /&gt;  case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:&lt;br /&gt;   printf("Framebuffer incomplete, incomplete attachment\n");&lt;br /&gt;   return 0;&lt;br /&gt;  case GL_FRAMEBUFFER_UNSUPPORTED_EXT:&lt;br /&gt;   printf("Unsupported framebuffer format\n");&lt;br /&gt;   return 0;&lt;br /&gt;  case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:&lt;br /&gt;   printf("Framebuffer incomplete, missing attachment\n");&lt;br /&gt;   return 0;&lt;br /&gt;  case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:&lt;br /&gt;   printf("Framebuffer incomplete, attached images must have same dimensions\n");&lt;br /&gt;   return 0;&lt;br /&gt;  case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:&lt;br /&gt;   printf("Framebuffer incomplete, attached images must have same format\n");&lt;br /&gt;   return 0;&lt;br /&gt;  case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:&lt;br /&gt;   printf("Framebuffer incomplete, missing draw buffer\n");&lt;br /&gt;   return 0;&lt;br /&gt;  case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:&lt;br /&gt;   printf("Framebuffer incomplete, missing read buffer\n");&lt;br /&gt;   return 0;&lt;br /&gt;  default:&lt;br /&gt;   printf("Unknown framebuffer status %i\n", (int)status);&lt;br /&gt; }&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void checkGLErrors (const char *label) {&lt;br /&gt; GLenum errCode;&lt;br /&gt; const GLubyte *errStr;&lt;br /&gt;&lt;br /&gt; if ((errCode = glGetError()) != GL_NO_ERROR) {&lt;br /&gt;  errStr = gluErrorString(errCode);&lt;br /&gt;  printf("OpenGL ERROR: ");&lt;br /&gt;  printf((char*)errStr);&lt;br /&gt;  printf("(Label: ");&lt;br /&gt;  printf(label);&lt;br /&gt;  printf(")\n.");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Performs the actual calculation.&lt;br /&gt; */&lt;br /&gt;void performComputation(){&lt;br /&gt; int i, j;&lt;br /&gt; int tmp;&lt;br /&gt; double total;&lt;br /&gt; double mflops;&lt;br /&gt;&lt;br /&gt; start = clock();&lt;br /&gt; glEnable(textureParameters.texTarget);&lt;br /&gt; // attach textures to FBO&lt;br /&gt; glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, textureParameters.texTarget, exTexID[texSize], 0);&lt;br /&gt; glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, textureParameters.texTarget, eyTexID[texSize], 0);&lt;br /&gt; glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT, textureParameters.texTarget, ezTexID[texSize], 0);&lt;br /&gt; // check if that worked&lt;br /&gt; if(!checkFramebufferStatus()) {&lt;br /&gt;  printf("glFramebufferTexture2DEXT():\t [FAIL]\n");&lt;br /&gt;  exit (-1);&lt;br /&gt; }// else if (mode == 0) {&lt;br /&gt; // printf("glFramebufferTexture2DEXT():\t [PASS]\n");&lt;br /&gt; // }&lt;br /&gt; // enable fragment profile&lt;br /&gt; cgGLEnableProfile(fragmentProfile);&lt;br /&gt; // bind fdtd program&lt;br /&gt; cgSetParameter1f(ex_esctc, 1.0);&lt;br /&gt; cgSetParameter1f(ex_eincc, 1.0);&lt;br /&gt; cgSetParameter1f(ex_ei, 1.0);&lt;br /&gt; cgSetParameter1f(ex_edevcn, 0.0);&lt;br /&gt; cgSetParameter1f(ex_dei, 0.0);&lt;br /&gt; cgSetParameter1f(ex_ecrl1, 217.51);&lt;br /&gt; cgSetParameter1f(ex_ecrl2, 217.51);&lt;br /&gt;&lt;br /&gt; cgGLBindProgram(ey_fp);&lt;br /&gt; cgSetParameter1f(ey_esctc, 1.0);&lt;br /&gt; cgSetParameter1f(ey_eincc, 0.0);&lt;br /&gt; cgSetParameter1f(ey_ei, 0.0);&lt;br /&gt; cgSetParameter1f(ey_edevcn, 0.0);&lt;br /&gt; cgSetParameter1f(ey_dei, 0.0);&lt;br /&gt; cgSetParameter1f(ey_ecrl1, 217.51);&lt;br /&gt; cgSetParameter1f(ey_ecrl2, 217.51);&lt;br /&gt;&lt;br /&gt; cgGLBindProgram(ez_fp);&lt;br /&gt; cgSetParameter1f(ez_esctc, 1.0);&lt;br /&gt; cgSetParameter1f(ez_eincc, 0.0);&lt;br /&gt; cgSetParameter1f(ez_ei, 0.0);&lt;br /&gt; cgSetParameter1f(ez_edevcn, 0.0);&lt;br /&gt; cgSetParameter1f(ez_dei, 0.0);&lt;br /&gt; cgSetParameter1f(ez_ecrl1, 217.51);&lt;br /&gt; cgSetParameter1f(ez_ecrl2, 217.51);&lt;br /&gt;&lt;br /&gt; cgGLBindProgram(hx_fp);&lt;br /&gt; cgSetParameter1f(hx_dt, 1.0);&lt;br /&gt; cgSetParameter1f(hx_delta1, 1.0);&lt;br /&gt; cgSetParameter1f(hx_delta2, 1.0);&lt;br /&gt;&lt;br /&gt; cgGLBindProgram(hy_fp);&lt;br /&gt; cgSetParameter1f(hy_dt, 1.0);&lt;br /&gt; cgSetParameter1f(hy_delta1, 1.0);&lt;br /&gt; cgSetParameter1f(hy_delta2, 1.0);&lt;br /&gt;&lt;br /&gt; cgGLBindProgram(hz_fp);&lt;br /&gt; cgSetParameter1f(hz_dt, 1.0);&lt;br /&gt; cgSetParameter1f(hz_delta1, 1.0);&lt;br /&gt; cgSetParameter1f(hz_delta2, 1.0);&lt;br /&gt;&lt;br /&gt; // sutff that changes should be in the loop...&lt;br /&gt;&lt;br /&gt; for(j = 0; j &lt; numIterations; j++){&lt;br /&gt;  //printf("iteration %i\n",j);&lt;br /&gt;  for(i = 0; i &lt; texSize; i++){&lt;br /&gt;   //update x e field&lt;br /&gt;   cgGLBindProgram(ex_fp);&lt;br /&gt;//   if(i == texSize/2){&lt;br /&gt;//    cgGLSetTextureParameter(ex_ps, psTexID);&lt;br /&gt;//    cgGLEnableTextureParameter(ex_ps);&lt;br /&gt;//   }&lt;br /&gt;//   else{&lt;br /&gt;//    cgGLSetTextureParameter(ex_ps, psEmptyTexID);&lt;br /&gt;//    cgGLEnableTextureParameter(ex_ps);&lt;br /&gt;//   }&lt;br /&gt;   cgGLSetTextureParameter(ex_e, exTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ex_e);&lt;br /&gt;   cgGLSetTextureParameter(ex_h1, hzTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ex_h1);&lt;br /&gt;   cgGLSetTextureParameter(ex_h2, hzTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ex_h2);&lt;br /&gt;   cgGLSetTextureParameter(ex_h3, hyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ex_h3);&lt;br /&gt;//   fprintf(stdout,"we are doing --i- %i --i-1- %i  %i\n",i, i-1,((i-1 &lt;= 0) ? 0 : i-1)); &lt;br /&gt;   //if(i) cgGLSetTextureParameter(ex_h4, hyTexID[i-1]);&lt;br /&gt;   if(i &gt; 0) cgGLSetTextureParameter(ex_h4, hyTexID[i]);&lt;br /&gt;   else cgGLSetTextureParameter(ex_h4, hyTexID[0]);&lt;br /&gt;   cgGLEnableTextureParameter(ex_h4);&lt;br /&gt;   glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);&lt;br /&gt;   glPolygonMode(GL_FRONT,GL_FILL);&lt;br /&gt;   //render/compute &lt;br /&gt;   glBegin(GL_QUADS);&lt;br /&gt;   glTexCoord2f(0.0, 0.0);&lt;br /&gt;   glVertex2f(0.0, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, 0.0);&lt;br /&gt;   glVertex2f(texSize, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, texSize);&lt;br /&gt;   glVertex2f(texSize, texSize);&lt;br /&gt;   glTexCoord2f(0.0, texSize);&lt;br /&gt;   glVertex2f(0.0, texSize);&lt;br /&gt;   glEnd();&lt;br /&gt;   //get result&lt;br /&gt;//    transferFromTexture(tmpData, hyTexID[i]);&lt;br /&gt;   /*if(i == texSize/2){*/// fprintf(stdout,"h%i) hy ps %e\n",i,tmpData[(texSize*texSize)/2 + 1]);&lt;br /&gt;//    printVector(tmpData, texSize*texSize);&lt;br /&gt;   //}&lt;br /&gt;   transferFromTexture(tmpData, GL_COLOR_ATTACHMENT0_EXT);&lt;br /&gt;   transferToTexture(tmpData, exTexID[i]);&lt;br /&gt;//   if(i == texSize/2){ fprintf(stdout,"e%i) ex ps %e\n",j,tmpData[(texSize*texSize)/2 + 1]);&lt;br /&gt;//    printVector(tmpData, texSize*texSize);&lt;br /&gt;//   }&lt;br /&gt;   //update y e field&lt;br /&gt;   cgGLBindProgram(ey_fp);&lt;br /&gt;   cgGLSetTextureParameter(ey_e, eyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ey_e);&lt;br /&gt;   cgGLSetTextureParameter(ey_h1, hxTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ey_h1);&lt;br /&gt;   cgGLSetTextureParameter(ey_h2, hxTexID[((i-1 &lt; 0) ? 0 : i-1)]);&lt;br /&gt;   cgGLEnableTextureParameter(ey_h2);&lt;br /&gt;   cgGLSetTextureParameter(ey_h3, hzTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ey_h3);&lt;br /&gt;   cgGLSetTextureParameter(ey_h4, hyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ey_h4);&lt;br /&gt;   glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);&lt;br /&gt;   glPolygonMode(GL_FRONT,GL_FILL);&lt;br /&gt;   //render/compute &lt;br /&gt;   glBegin(GL_QUADS);&lt;br /&gt;   glTexCoord2f(0.0, 0.0);&lt;br /&gt;   glVertex2f(0.0, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, 0.0);&lt;br /&gt;   glVertex2f(texSize, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, texSize);&lt;br /&gt;   glVertex2f(texSize, texSize);&lt;br /&gt;   glTexCoord2f(0.0, texSize);&lt;br /&gt;   glVertex2f(0.0, texSize);&lt;br /&gt;   glEnd();&lt;br /&gt;   //get result&lt;br /&gt;   transferFromTexture(tmpData, GL_COLOR_ATTACHMENT1_EXT);&lt;br /&gt;   transferToTexture(tmpData, eyTexID[i]);&lt;br /&gt;&lt;br /&gt;//   if(i == texSize/2){ fprintf(stdout,"e%i) ey ps %e\n",j,tmpData[(texSize*texSize)/2 + 1]);&lt;br /&gt;//    printVector(tmpData, texSize*texSize);&lt;br /&gt;//   }&lt;br /&gt;   //update z e field&lt;br /&gt;   cgGLBindProgram(ez_fp);&lt;br /&gt;   cgGLSetTextureParameter(ez_e, ezTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ez_e);&lt;br /&gt;   cgGLSetTextureParameter(ez_h1, hyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ez_h1);&lt;br /&gt;   cgGLSetTextureParameter(ez_h2, hyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ez_h2);&lt;br /&gt;   cgGLSetTextureParameter(ez_h3, hxTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ez_h3);&lt;br /&gt;   cgGLSetTextureParameter(ez_h4, hxTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(ez_h4);&lt;br /&gt;   glDrawBuffer(GL_COLOR_ATTACHMENT2_EXT);&lt;br /&gt;   glPolygonMode(GL_FRONT,GL_FILL);&lt;br /&gt;   //render/compute &lt;br /&gt;   glBegin(GL_QUADS);&lt;br /&gt;   glTexCoord2f(0.0, 0.0);&lt;br /&gt;   glVertex2f(0.0, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, 0.0);&lt;br /&gt;   glVertex2f(texSize, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, texSize);&lt;br /&gt;   glVertex2f(texSize, texSize);&lt;br /&gt;   glTexCoord2f(0.0, texSize);&lt;br /&gt;   glVertex2f(0.0, texSize);&lt;br /&gt;   glEnd();&lt;br /&gt;   //get result&lt;br /&gt;   transferFromTexture(tmpData, GL_COLOR_ATTACHMENT2_EXT);&lt;br /&gt;   transferToTexture(tmpData, ezTexID[i]);&lt;br /&gt;&lt;br /&gt;//   if(i == texSize/2){ fprintf(stdout,"e%i) ez ps %e\n",j,tmpData[(texSize*texSize)/2 + 1]);&lt;br /&gt;//    printVector(tmpData, texSize*texSize);&lt;br /&gt;//   }&lt;br /&gt;   //update x h field&lt;br /&gt;   cgGLBindProgram(hx_fp);&lt;br /&gt;   cgGLSetTextureParameter(hx_h, hxTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hx_h);&lt;br /&gt;   cgGLSetTextureParameter(hx_e1, eyTexID[i+1]);&lt;br /&gt;   cgGLEnableTextureParameter(hx_e1);&lt;br /&gt;   cgGLSetTextureParameter(hx_e2, eyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hx_e2);&lt;br /&gt;   cgGLSetTextureParameter(hx_e3, ezTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hx_e3);&lt;br /&gt;   cgGLSetTextureParameter(hx_e4, ezTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hx_e4);&lt;br /&gt;   glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);&lt;br /&gt;   glPolygonMode(GL_FRONT,GL_FILL);&lt;br /&gt;   //render/compute &lt;br /&gt;   glBegin(GL_QUADS);&lt;br /&gt;   glTexCoord2f(0.0, 0.0);&lt;br /&gt;   glVertex2f(0.0, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, 0.0);&lt;br /&gt;   glVertex2f(texSize, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, texSize);&lt;br /&gt;   glVertex2f(texSize, texSize);&lt;br /&gt;   glTexCoord2f(0.0, texSize);&lt;br /&gt;   glVertex2f(0.0, texSize);&lt;br /&gt;   glEnd();&lt;br /&gt;   //get result&lt;br /&gt;   transferFromTexture(tmpData, GL_COLOR_ATTACHMENT0_EXT);&lt;br /&gt;   transferToTexture(tmpData, hxTexID[i]);&lt;br /&gt;//   if(i == texSize/2){ fprintf(stdout,"h%i) hx ps %e\n",j,tmpData[(texSize*texSize)/2 + 1]);&lt;br /&gt;//    printVector(tmpData, texSize*texSize);&lt;br /&gt;//   }&lt;br /&gt;   &lt;br /&gt;   //update y h field&lt;br /&gt;   cgGLBindProgram(hy_fp);&lt;br /&gt;   cgGLSetTextureParameter(hy_h, hyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hy_h);&lt;br /&gt;   cgGLSetTextureParameter(hy_e1, ezTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hy_e1);&lt;br /&gt;   cgGLSetTextureParameter(hy_e2, ezTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hy_e2);&lt;br /&gt;   cgGLSetTextureParameter(hy_e3, exTexID[i+1]);&lt;br /&gt;   cgGLEnableTextureParameter(hy_e3);&lt;br /&gt;   cgGLSetTextureParameter(hy_e4, exTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hy_e4);&lt;br /&gt;   glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);&lt;br /&gt;   glPolygonMode(GL_FRONT,GL_FILL);&lt;br /&gt;   //render/compute &lt;br /&gt;   glBegin(GL_QUADS);&lt;br /&gt;   glTexCoord2f(0.0, 0.0);&lt;br /&gt;   glVertex2f(0.0, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, 0.0);&lt;br /&gt;   glVertex2f(texSize, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, texSize);&lt;br /&gt;   glVertex2f(texSize, texSize);&lt;br /&gt;   glTexCoord2f(0.0, texSize);&lt;br /&gt;   glVertex2f(0.0, texSize);&lt;br /&gt;   glEnd();&lt;br /&gt;   //get result&lt;br /&gt;   transferFromTexture(tmpData, GL_COLOR_ATTACHMENT1_EXT);&lt;br /&gt;   transferToTexture(tmpData, hyTexID[i]);&lt;br /&gt;&lt;br /&gt;//   if(i == texSize/2){ fprintf(stdout,"h%i) hy ps %e\n",j,tmpData[(texSize*texSize)/2 + 1]);&lt;br /&gt;//    printVector(tmpData, texSize*texSize);&lt;br /&gt;//   }&lt;br /&gt;   //update z h field&lt;br /&gt;   cgGLBindProgram(hz_fp);&lt;br /&gt;   cgGLSetTextureParameter(hz_h, hzTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hz_h);&lt;br /&gt;   cgGLSetTextureParameter(hz_e1, exTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hz_e1);&lt;br /&gt;   cgGLSetTextureParameter(hz_e2, exTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hz_e2);&lt;br /&gt;   cgGLSetTextureParameter(hz_e3, eyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hz_e3);&lt;br /&gt;   cgGLSetTextureParameter(hz_e4, eyTexID[i]);&lt;br /&gt;   cgGLEnableTextureParameter(hz_e4);&lt;br /&gt;   glDrawBuffer(GL_COLOR_ATTACHMENT2_EXT);&lt;br /&gt;   glPolygonMode(GL_FRONT,GL_FILL);&lt;br /&gt;   //render/compute &lt;br /&gt;   glBegin(GL_QUADS);&lt;br /&gt;   glTexCoord2f(0.0, 0.0);&lt;br /&gt;   glVertex2f(0.0, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, 0.0);&lt;br /&gt;   glVertex2f(texSize, 0.0);&lt;br /&gt;   glTexCoord2f(texSize, texSize);&lt;br /&gt;   glVertex2f(texSize, texSize);&lt;br /&gt;   glTexCoord2f(0.0, texSize);&lt;br /&gt;   glVertex2f(0.0, texSize);&lt;br /&gt;   glEnd();&lt;br /&gt;   //get result&lt;br /&gt;   transferFromTexture(tmpData, GL_COLOR_ATTACHMENT2_EXT);&lt;br /&gt;   transferToTexture(tmpData, hzTexID[i]);&lt;br /&gt;//   if(i == texSize/2){ fprintf(stdout,"h%i) hz ps %e\n",j,tmpData[(texSize*texSize)/2 + 1]);&lt;br /&gt;//    printVector(tmpData, texSize*texSize);&lt;br /&gt;//   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; // done, stop timer, calc MFLOP/s if neccessary&lt;br /&gt;// glFinish();&lt;br /&gt;// end = clock();&lt;br /&gt;// total = (double)(end-start)/(double)CLOCKS_PER_SEC;&lt;br /&gt;// mflops = (double)((3*12 + 3*9)*texSize*texSize*texSize*numIterations) / (total * 1000000.0);&lt;br /&gt;// printf("GPU MFLOP/s for N=%d:\t\t%f\n",texSize, mflops);&lt;br /&gt; // done, just do some checks if everything went smoothly.&lt;br /&gt; checkFramebufferStatus();&lt;br /&gt; checkGLErrors("render()");&lt;br /&gt; glDisable(textureParameters.texTarget);&lt;br /&gt;// transferFromTexture(tmpData);&lt;br /&gt;// printVector(tmpData, texSize*texSize);&lt;br /&gt; //printVector(dataX, texSize*texSize);&lt;br /&gt;&lt;br /&gt; // do cpu comarison&lt;br /&gt;// printf("GPU speedup %f\n \n", cpuBench()/total);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void transferFromTexture(float* data, GLenum fb){&lt;br /&gt; // version (a): texture is attached&lt;br /&gt; // recommended on both NVIDIA and ATI&lt;br /&gt; glReadBuffer(fb);&lt;br /&gt; glReadPixels(0, 0, texSize, texSize,textureParameters.texFormat,GL_FLOAT,data);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void cgErrorCallback(){&lt;br /&gt; CGerror lastError = cgGetError();&lt;br /&gt; if(lastError) {&lt;br /&gt;  printf(cgGetErrorString(lastError));&lt;br /&gt;  printf(cgGetLastListing(cgContext));&lt;br /&gt;  exit(lastError);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Sets up the Cg runtime and creates shader.&lt;br /&gt; */&lt;br /&gt;void initCG(void) {&lt;br /&gt; // set up Cg&lt;br /&gt; cgSetErrorCallback(cgErrorCallback);&lt;br /&gt; cgContext = cgCreateContext();&lt;br /&gt; fragmentProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);&lt;br /&gt; cgGLSetOptimalOptions(fragmentProfile);&lt;br /&gt; // create fragment program&lt;br /&gt; ex_fp = cgCreateProgram(cgContext, CG_SOURCE, ex_eUpdate_source, fragmentProfile, "eUpdate", NULL);&lt;br /&gt; ey_fp = cgCreateProgram(cgContext, CG_SOURCE, ey_eUpdate_source, fragmentProfile, "eUpdate", NULL);&lt;br /&gt; ez_fp = cgCreateProgram(cgContext, CG_SOURCE, ez_eUpdate_source, fragmentProfile, "eUpdate", NULL);&lt;br /&gt;&lt;br /&gt; hx_fp = cgCreateProgram(cgContext, CG_SOURCE, hx_hUpdate_source, fragmentProfile, "hUpdate", NULL);&lt;br /&gt; hy_fp = cgCreateProgram(cgContext, CG_SOURCE, hy_hUpdate_source, fragmentProfile, "hUpdate", NULL);&lt;br /&gt; hz_fp = cgCreateProgram(cgContext, CG_SOURCE, hz_hUpdate_source, fragmentProfile, "hUpdate", NULL);&lt;br /&gt;// // load programs&lt;br /&gt; cgGLLoadProgram(ex_fp);&lt;br /&gt; cgGLLoadProgram(ey_fp);&lt;br /&gt; cgGLLoadProgram(ez_fp);&lt;br /&gt; cgGLLoadProgram(hx_fp);&lt;br /&gt; cgGLLoadProgram(hy_fp);&lt;br /&gt; cgGLLoadProgram(hz_fp);&lt;br /&gt; //and get parameter handles by name&lt;br /&gt; //ex&lt;br /&gt; ex_ps = cgGetNamedParameter(ex_fp, "texturePS");&lt;br /&gt; ex_e = cgGetNamedParameter(ex_fp, "textureE");&lt;br /&gt; ex_h1 = cgGetNamedParameter(ex_fp, "textureH1");&lt;br /&gt; ex_h2 = cgGetNamedParameter(ex_fp, "textureH2");&lt;br /&gt; ex_h3 = cgGetNamedParameter(ex_fp, "textureH3");&lt;br /&gt; ex_h4 = cgGetNamedParameter(ex_fp, "textureH4");&lt;br /&gt; ex_esctc = cgGetNamedParameter(ex_fp, "esctc");&lt;br /&gt; ex_eincc = cgGetNamedParameter(ex_fp, "eincc");&lt;br /&gt; ex_ei = cgGetNamedParameter(ex_fp, "ei");&lt;br /&gt; ex_edevcn = cgGetNamedParameter(ex_fp, "edevcn");&lt;br /&gt; ex_dei = cgGetNamedParameter(ex_fp, "dei");&lt;br /&gt; ex_ecrl1 = cgGetNamedParameter(ex_fp, "ecrl1");&lt;br /&gt; ex_ecrl2 = cgGetNamedParameter(ex_fp, "ecrl2");&lt;br /&gt; //ey&lt;br /&gt; ey_e = cgGetNamedParameter(ey_fp, "textureE");&lt;br /&gt; ey_h1 = cgGetNamedParameter(ey_fp, "textureH1");&lt;br /&gt; ey_h2 = cgGetNamedParameter(ey_fp, "textureH2");&lt;br /&gt; ey_h3 = cgGetNamedParameter(ey_fp, "textureH3");&lt;br /&gt; ey_h4 = cgGetNamedParameter(ey_fp, "textureH4");&lt;br /&gt; ey_esctc = cgGetNamedParameter(ey_fp, "esctc");&lt;br /&gt; ey_eincc = cgGetNamedParameter(ey_fp, "eincc");&lt;br /&gt; ey_ei = cgGetNamedParameter(ey_fp, "ei");&lt;br /&gt; ey_edevcn = cgGetNamedParameter(ey_fp, "edevcn");&lt;br /&gt; ey_dei = cgGetNamedParameter(ey_fp, "dei");&lt;br /&gt; ey_ecrl1 = cgGetNamedParameter(ey_fp, "ecrl1");&lt;br /&gt; ey_ecrl2 = cgGetNamedParameter(ey_fp, "ecrl2");&lt;br /&gt; //ez&lt;br /&gt; ez_e = cgGetNamedParameter(ez_fp, "textureE");&lt;br /&gt; ez_h1 = cgGetNamedParameter(ez_fp, "textureH1");&lt;br /&gt; ez_h2 = cgGetNamedParameter(ez_fp, "textureH2");&lt;br /&gt; ez_h3 = cgGetNamedParameter(ez_fp, "textureH3");&lt;br /&gt; ez_h4 = cgGetNamedParameter(ez_fp, "textureH4");&lt;br /&gt; ez_esctc = cgGetNamedParameter(ez_fp, "esctc");&lt;br /&gt; ez_eincc = cgGetNamedParameter(ez_fp, "eincc");&lt;br /&gt; ez_ei = cgGetNamedParameter(ez_fp, "ei");&lt;br /&gt; ez_edevcn = cgGetNamedParameter(ez_fp, "edevcn");&lt;br /&gt; ez_dei = cgGetNamedParameter(ez_fp, "dei");&lt;br /&gt; ez_ecrl1 = cgGetNamedParameter(ez_fp, "ecrl1");&lt;br /&gt; ez_ecrl2 = cgGetNamedParameter(ez_fp, "ecrl2");&lt;br /&gt; //hx&lt;br /&gt; hx_h = cgGetNamedParameter(hx_fp, "textureH");&lt;br /&gt; hx_e1 = cgGetNamedParameter(hx_fp, "textureE1");&lt;br /&gt; hx_e2 = cgGetNamedParameter(hx_fp, "textureE2");&lt;br /&gt; hx_e3 = cgGetNamedParameter(hx_fp, "textureE3");&lt;br /&gt; hx_e4 = cgGetNamedParameter(hx_fp, "textureE4");&lt;br /&gt; hx_dt = cgGetNamedParameter(hx_fp, "dt");&lt;br /&gt; hx_delta1 = cgGetNamedParameter(hx_fp, "delta1");&lt;br /&gt; hx_delta2 = cgGetNamedParameter(hx_fp, "delta2");&lt;br /&gt; //hy&lt;br /&gt; hy_h = cgGetNamedParameter(hy_fp, "textureH");&lt;br /&gt; hy_e1 = cgGetNamedParameter(hy_fp, "textureE1");&lt;br /&gt; hy_e2 = cgGetNamedParameter(hy_fp, "textureE2");&lt;br /&gt; hy_e3 = cgGetNamedParameter(hy_fp, "textureE3");&lt;br /&gt; hy_e4 = cgGetNamedParameter(hy_fp, "textureE4");&lt;br /&gt; hy_dt = cgGetNamedParameter(hy_fp, "dt");&lt;br /&gt; hy_delta1 = cgGetNamedParameter(hy_fp, "delta1");&lt;br /&gt; hy_delta2 = cgGetNamedParameter(hy_fp, "delta2");&lt;br /&gt; //hz&lt;br /&gt; hz_h = cgGetNamedParameter(hz_fp, "textureH");&lt;br /&gt; hz_e1 = cgGetNamedParameter(hz_fp, "textureE1");&lt;br /&gt; hz_e2 = cgGetNamedParameter(hz_fp, "textureE2");&lt;br /&gt; hz_e3 = cgGetNamedParameter(hz_fp, "textureE3");&lt;br /&gt; hz_e4 = cgGetNamedParameter(hz_fp, "textureE4");&lt;br /&gt; hz_dt = cgGetNamedParameter(hz_fp, "dt");&lt;br /&gt; hz_delta1 = cgGetNamedParameter(hz_fp, "delta1");&lt;br /&gt; hz_delta2 = cgGetNamedParameter(hz_fp, "delta2");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Transfers data to texture. &lt;br /&gt; * Check web page for detailed explanation on the difference between ATI and NVIDIA.&lt;br /&gt; */&lt;br /&gt;void transferToTexture (float* data, GLuint texID) {&lt;br /&gt; // version (a): HW-accelerated on NVIDIA &lt;br /&gt; glBindTexture(textureParameters.texTarget, texID);&lt;br /&gt; glTexSubImage2D(textureParameters.texTarget,0,0,0,texSize,texSize,textureParameters.texFormat,GL_FLOAT,data);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Sets up a floating point texture with NEAREST filtering.&lt;br /&gt; * (mipmaps etc. are unsupported for floating point textures)&lt;br /&gt; */&lt;br /&gt;void setupTexture (const GLuint texID) {&lt;br /&gt; // make active and bin&lt;br /&gt; int err;&lt;br /&gt; glBindTexture(textureParameters.texTarget,texID);&lt;br /&gt; // turn off filtering and wrap modes&lt;br /&gt; glTexParameteri(textureParameters.texTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);&lt;br /&gt; glTexParameteri(textureParameters.texTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);&lt;br /&gt; glTexParameteri(textureParameters.texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP);&lt;br /&gt; glTexParameteri(textureParameters.texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP);&lt;br /&gt; // define texture with floating point format&lt;br /&gt; glTexImage2D(textureParameters.texTarget,0,textureParameters.texInternalFormat,texSize,texSize,0,textureParameters.texFormat,GL_FLOAT,0);&lt;br /&gt; // define texture with floating point format&lt;br /&gt; // check if that worked&lt;br /&gt; if(err = glGetError() != GL_NO_ERROR){&lt;br /&gt;  printf("glTexImage2D():\t\t\t [FAIL]\n");&lt;br /&gt;  exit(err);&lt;br /&gt; }&lt;br /&gt;// else if(mode == 0){&lt;br /&gt;  printf("glTexImage2D():\t\t\t [PASS]\n");&lt;br /&gt;// }&lt;br /&gt; printf("Created a %i by %i floating point texture.\n",texSize,texSize);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void createTextures(){&lt;br /&gt; int i;&lt;br /&gt; // create textures &lt;br /&gt; glGenTextures(texSize+1, exTexID);&lt;br /&gt; glGenTextures(texSize+1, eyTexID);&lt;br /&gt; glGenTextures(texSize+1, ezTexID);&lt;br /&gt; glGenTextures(texSize+1, hxTexID);&lt;br /&gt; glGenTextures(texSize+1, hyTexID);&lt;br /&gt; glGenTextures(texSize+1, hzTexID);&lt;br /&gt; glGenTextures(1, &amp;psTexID);&lt;br /&gt; glGenTextures(1, &amp;psEmptyTexID);&lt;br /&gt;&lt;br /&gt; tmpData[(texSize*texSize)/2] = 5.0;&lt;br /&gt; setupTexture(psTexID);&lt;br /&gt; transferToTexture(tmpData, psTexID);&lt;br /&gt; tmpData[(texSize*texSize)/2] = 0.0;&lt;br /&gt; setupTexture(psEmptyTexID);&lt;br /&gt; transferToTexture(tmpData, psEmptyTexID);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; // set up textures&lt;br /&gt; for(i = 0; i &lt;= texSize; i++){&lt;br /&gt;  setupTexture(exTexID[i]);&lt;br /&gt;  transferToTexture(tmpData, exTexID[i]);&lt;br /&gt;  setupTexture(eyTexID[i]);&lt;br /&gt;  transferToTexture(tmpData, eyTexID[i]);&lt;br /&gt;  setupTexture(ezTexID[i]);&lt;br /&gt;  transferToTexture(tmpData, ezTexID[i]);&lt;br /&gt;  setupTexture(hxTexID[i]);&lt;br /&gt;  transferToTexture(tmpData, hxTexID[i]);&lt;br /&gt;  setupTexture(hyTexID[i]);&lt;br /&gt;  transferToTexture(tmpData, hyTexID[i]);&lt;br /&gt;  setupTexture(hzTexID[i]);&lt;br /&gt;  transferToTexture(tmpData, hzTexID[i]);&lt;br /&gt; }&lt;br /&gt; // set texenv mode from modulate (the default) to replace)&lt;br /&gt; glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);&lt;br /&gt; // check if something went completely wrong&lt;br /&gt; checkGLErrors ("createFBOandTextures()");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Creates framebuffer object, binds it to reroute rendering operations &lt;br /&gt; * from the traditional framebuffer to the offscreen buffer&lt;br /&gt; */&lt;br /&gt;void initFBO(){&lt;br /&gt; // create FBO (off-screen framebuffer)&lt;br /&gt; glGenFramebuffersEXT(1, &amp;fb);&lt;br /&gt; // bind offscreen framebuffer (that is, skip the window-specific render target)&lt;br /&gt; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);&lt;br /&gt; // viewport for 1:1 pixel=texture mapping&lt;br /&gt; glMatrixMode(GL_PROJECTION);&lt;br /&gt; glLoadIdentity();&lt;br /&gt; gluOrtho2D(0.0, texSize, 0.0, texSize);&lt;br /&gt; glMatrixMode(GL_MODELVIEW);&lt;br /&gt; glLoadIdentity();&lt;br /&gt; glViewport(0, 0, texSize, texSize);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void initGLEW (void) {&lt;br /&gt; int err = glewInit();&lt;br /&gt; if (GLEW_OK != err) {&lt;br /&gt;  fprintf(stderr,"error: %s\n",(char*)glewGetErrorString(err));&lt;br /&gt;  exit(-1);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void initGLUT(int argc, char **argv){&lt;br /&gt; glutInit(&amp;argc, argv);&lt;br /&gt; glutWindowHandle = glutCreateWindow(GLUT_WINDOW_NAME);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4344132217413803661?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4344132217413803661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/gpu-accelerated-fdtd-using-cg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4344132217413803661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4344132217413803661'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/gpu-accelerated-fdtd-using-cg.html' title='GPU Accelerated FDTD Using Cg'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4347266774254438504</id><published>2009-10-13T14:04:00.000-07:00</published><updated>2009-10-13T14:08:54.939-07:00</updated><title type='text'>How To Use the String Stream implementation of ISequentialStream</title><content type='html'>Someone the other day asked how do they use the ISequentialStream string class I implemented.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://samscode.blogspot.com/2009/08/creating-istream-or-isequentialstream.html"&gt;Here is the original post on the string stream implementation.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is how you would use it.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;HRESULT hr = S_OK;&lt;br /&gt;LPWSTR pszXml = NULL;&lt;br /&gt;ISequentialStream *pStream = NULL;&lt;br /&gt;IXmlReader *pReader = NULL;&lt;br /&gt;&lt;br /&gt;hr = GetXmlString(&amp;amp;pszXml);&lt;br /&gt;&lt;br /&gt;if (S_OK == hr)&lt;br /&gt;{&lt;br /&gt;   hr = CStringStream::Create(pszXml, &amp;amp;pStream);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (S_OK == hr)&lt;br /&gt;{&lt;br /&gt;   hr = CreateXmlReader(__uuidof(IXmlReader), (void**)&amp;amp;pReader, NULL);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (S_OK == hr)&lt;br /&gt;{&lt;br /&gt;   hr = pReader-&gt;SetInput(pStream);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;// rest of your xml parsing here.&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;// cleanup&lt;br /&gt;if (pReader)&lt;br /&gt;{&lt;br /&gt;   pReader-&gt;Release();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (pStream)&lt;br /&gt;{&lt;br /&gt;   pStream-&gt;Release();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (pszXml)&lt;br /&gt;{&lt;br /&gt;   free(pszXml);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4347266774254438504?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4347266774254438504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/how-to-use-string-stream-implementation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4347266774254438504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4347266774254438504'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/how-to-use-string-stream-implementation.html' title='How To Use the String Stream implementation of ISequentialStream'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-799591406934862894</id><published>2009-10-13T12:40:00.000-07:00</published><updated>2009-10-13T12:57:22.857-07:00</updated><title type='text'>Making Your Function Discovery (FD) Provider Run In Proc</title><content type='html'>I was looking through my basic FD provider sample that I wrote a few months ago and realized that I can't directly publish it on the Internet.  I don't want to provide a sample that doesn't do anything real, so I will need to rewrite a new provider sample that publishable and is realistic.  In the mean time, if you want to push ahead and try writing your own provider, it is actually not that hard.  First, you need to do the standard things for making a new DLL: DLLMain, DLLGetClassObject, implement IClassFactory, et cetera.  Then, you need to implement IFunctionDiscoveryProvider.  That is it.  Well, to get it to work, you will also have to make the proper registrations (hint: use the in box providers registry keys as an example).  The second problem will be that your provider will have to implement all of the PnPX stuff to be loaded out of proc because FD will only load known providers inproc by default.  If you want to ship a provider, pnpx should be your end game especially if you are doing network type providers.  While you are learning the basics, there is a trick to get your FD client to load your non pnpx provider inproc.  Note, this is done on the client or provider consumer side.  This is how you would do that.  I will try to provide a complete sample later if time permits.&lt;br /&gt;&lt;br /&gt;        hr = pPnpQuery-&gt;AddQueryConstraint(&lt;br /&gt;            FD_QUERYCONSTRAINT_COMCLSCONTEXT,&lt;br /&gt;            FD_CONSTRAINTVALUE_COMCLSCONTEXT_INPROC_SERVER&lt;br /&gt;            );&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-799591406934862894?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/799591406934862894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/making-your-function-discovery-fd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/799591406934862894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/799591406934862894'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/making-your-function-discovery-fd.html' title='Making Your Function Discovery (FD) Provider Run In Proc'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-6924107790444087798</id><published>2009-10-13T12:28:00.000-07:00</published><updated>2009-10-13T12:39:37.344-07:00</updated><title type='text'>Unit Testing</title><content type='html'>Since we are between product cycles, they want us to be writing tests and not making changes on the product code until initial planning is done.  Testing is like hygiene, not specifically fun, but necessary.  Writing unit tests is not my favorite thing to do, but it is need if you want to have quality in your code.  So, I went about figuring out how to setup good unit tests in our build environment and how to automate them.  I won't go in to those details because they are unique to our environment, but I will provide some slides for a presentation that I gave to my team.&lt;br /&gt;&lt;br /&gt;Unit Testing&lt;br /&gt;What Is a Unit Test?&lt;br /&gt;• Unit: smallest testable part of a program: functions, classes, methods&lt;br /&gt;• Validates correct behavior of the unit&lt;br /&gt;• Ideally independent of the other unit tests&lt;br /&gt;• They should cover most code paths&lt;br /&gt;• Generally a white box testing method that is close to the code implementation&lt;br /&gt;• First line of testing&lt;br /&gt;• Should be written in conjunction with the unit of code&lt;br /&gt;&lt;br /&gt;What Isn’t Unit Testing?&lt;br /&gt;• A catchall for every bug&lt;br /&gt;• Replacement for other testing&lt;br /&gt;• Functional testing: validates code functions to spec (higher level and more black box than unit tests)&lt;br /&gt;• Integration testing: tests how the units are put together&lt;br /&gt;&lt;br /&gt;Why Write Unit Tests?&lt;br /&gt;• Finds bugs early in the development cycle&lt;br /&gt;• Gives confidence that the units you are writing are behaving correctly&lt;br /&gt;• Provides quick feedback if functionality has inadvertently been regressed&lt;br /&gt;• Simplifies refactoring&lt;br /&gt;• Gives confidence when you make late milestone changes&lt;br /&gt;• Documents and defines correct unit behavior&lt;br /&gt;&lt;br /&gt;Dev IC Workflow&lt;br /&gt;• Spec &amp;amp; design&lt;br /&gt;• Product code &amp;amp; unit tests&lt;br /&gt;• Check in&lt;br /&gt;• Automation&lt;br /&gt;&lt;br /&gt;Unit Test Writing Work Flow&lt;br /&gt;Test Driven Development&lt;br /&gt;TDD Cycle&lt;br /&gt;• Write a test&lt;br /&gt;• Run all unit tests – the new test should fail&lt;br /&gt;• Write some code – write enough code to pass the test&lt;br /&gt;• Run all unit tests – the new test should now pass&lt;br /&gt;• Refactor – clean up the code and tests as needed&lt;br /&gt;• Repeat steps 1-5 until all code units are complete&lt;br /&gt;&lt;br /&gt;TDD Benefits&lt;br /&gt;• Promotes better design since you must think about using the API before writing them&lt;br /&gt;• Heavy debugging is rarely needed&lt;br /&gt;• Many of the bugs are found even before it is checked in&lt;br /&gt;• Promotes good unit test coverage&lt;br /&gt;• Discourages code creep&lt;br /&gt;• Unit tests are easier to write before than after&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-6924107790444087798?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/6924107790444087798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/10/unit-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/6924107790444087798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/6924107790444087798'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/10/unit-testing.html' title='Unit Testing'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-4382982341531393968</id><published>2009-09-15T13:56:00.000-07:00</published><updated>2009-09-15T14:07:21.605-07:00</updated><title type='text'>Function Discovery: Callback Objects, Implementing IFunctionDiscoveryNotification</title><content type='html'>If you missed my introductory post on Function Discovery (FD), you might want to go back there and give it a once over.  It will give you a quick primer on what FD is about.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://samscode.blogspot.com/2009/09/function-discovery-intro.html"&gt;Function Discovery Intro&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In my first FD post I provided a sample using the PnP FD provider to enumerate present devices.  The FD PnP provider probably the most used provider and is easier to use than SetupDiGetGlassDevs especially if your program is already using COM.  Unfortunately my first sample didn’t include a callback object which is required to get notifications from the provider.  It gets worse than that; the PnP provider is actually the only provider (except the registry provider) that will provide synchronous results (IFunctionInstanceCollection)when you execute your query.  In other words, every other inbox FD provider is asynchronous, and you won’t get any function instance (FI) results unless you provide a callback object and get them asynchronously.  &lt;br /&gt;&lt;br /&gt;Don’t worry; writing callback objects is easy, and I will show you how with an example.  You start off creating a  query just like we did in the first example, except we will have to change two parts.  First you will need to create your callback object, and then pass it as a parameter to the CreateInstanceCollectionQuery method call.  Finally when you execute the query, you will not get a function instance query back unless it is the PnP or registry provider, and the call will return E_PENDING.  E_PENDING is not an error if you are using an asynchronous provider; it just means that the provider will give you function instances asynchronously to your call back object.  If the provider is async and returns E_PENDING, it should also send FD_EVENTID_SEARCHCOMPLETE to the callback’s OnEvent method.&lt;br /&gt;&lt;br /&gt;Here is a simple sample code for a callback object.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class CNotificationCallback : public IFunctionDiscoveryNotification&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt;    STDMETHODIMP_(ULONG) AddRef();&lt;br /&gt;&lt;br /&gt;    STDMETHODIMP_(ULONG) Release();&lt;br /&gt;&lt;br /&gt;    STDMETHODIMP QueryInterface(&lt;br /&gt;        REFIID riid, &lt;br /&gt;        __deref_out_opt void **ppv);&lt;br /&gt;&lt;br /&gt;    STDMETHODIMP OnUpdate(&lt;br /&gt;        QueryUpdateAction enumQueryUpdateAction, &lt;br /&gt;        FDQUERYCONTEXT fdqcQueryContext, &lt;br /&gt;        __in IFunctionInstance *pIFunctionInstance);&lt;br /&gt;&lt;br /&gt;    STDMETHODIMP OnError(&lt;br /&gt;        HRESULT hr, &lt;br /&gt;        FDQUERYCONTEXT fdqcQueryContext, &lt;br /&gt;        PCWSTR pszProvider);&lt;br /&gt;&lt;br /&gt;    STDMETHODIMP OnEvent(&lt;br /&gt;        DWORD dwEventID, &lt;br /&gt;        FDQUERYCONTEXT fdqcQueryContext, &lt;br /&gt;        PCWSTR pszProvider);&lt;br /&gt;&lt;br /&gt;    CNotificationCallback();&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;    LONG m_cRef;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;CNotificationCallback::CNotificationCallback():&lt;br /&gt;    m_cRef(1)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;STDMETHODIMP_(ULONG) CNotificationCallback::AddRef()&lt;br /&gt;{&lt;br /&gt;    return InterlockedIncrement(&amp;m_cRef);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;STDMETHODIMP_(ULONG) CNotificationCallback::Release()&lt;br /&gt;{&lt;br /&gt;    LONG cRef = InterlockedDecrement(&amp;m_cRef);&lt;br /&gt;    if (0 == cRef)&lt;br /&gt;    {&lt;br /&gt;        delete this;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return cRef;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;STDMETHODIMP CNotificationCallback::QueryInterface(&lt;br /&gt;    REFIID riid, &lt;br /&gt;    __deref_out_opt void **ppv)&lt;br /&gt;{&lt;br /&gt;    HRESULT hr = S_OK;&lt;br /&gt;&lt;br /&gt;    if (ppv)&lt;br /&gt;    {&lt;br /&gt;        *ppv = NULL;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        hr = E_INVALIDARG;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (S_OK == hr)&lt;br /&gt;    {&lt;br /&gt;        if (__uuidof(IUnknown) == riid )&lt;br /&gt;        {&lt;br /&gt;            AddRef();&lt;br /&gt;            *ppv = (IUnknown*) this;&lt;br /&gt;        }&lt;br /&gt;        else if (__uuidof(IFunctionDiscoveryNotification) == riid)&lt;br /&gt;        {&lt;br /&gt;            AddRef();&lt;br /&gt;            *ppv = (IFunctionDiscoveryNotification*) this;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            hr = E_NOINTERFACE;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return hr;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;STDMETHODIMP CNotificationCallback::OnUpdate(&lt;br /&gt;    QueryUpdateAction enumQueryUpdateAction, &lt;br /&gt;    FDQUERYCONTEXT fdqcQueryContext, &lt;br /&gt;    __in IFunctionInstance* pIFunctionInstance)&lt;br /&gt;{&lt;br /&gt;    HRESULT hr = S_OK;&lt;br /&gt;&lt;br /&gt;    switch (enumQueryUpdateAction)&lt;br /&gt;    {&lt;br /&gt;    case QUA_ADD:&lt;br /&gt;        wprintf(L"QUA_ADD\n");&lt;br /&gt;        break;&lt;br /&gt;    case QUA_REMOVE:&lt;br /&gt;        wprintf(L"QUA_REMOVE\n");&lt;br /&gt;        break;&lt;br /&gt;    case QUA_CHANGE:&lt;br /&gt;        wprintf(L"QUA_CHANGE\n");&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return S_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;STDMETHODIMP CNotificationCallback::OnError(&lt;br /&gt;    HRESULT hr, &lt;br /&gt;    FDQUERYCONTEXT fdqcQueryContext, &lt;br /&gt;    PCWSTR pszProvider)&lt;br /&gt;{&lt;br /&gt;    wprintf(L"****** ERROR: 0x%08x\n", hr);&lt;br /&gt;&lt;br /&gt;    return S_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;STDMETHODIMP CNotificationCallback::OnEvent(&lt;br /&gt;    DWORD dwEventID, &lt;br /&gt;    FDQUERYCONTEXT fdqcQueryContext, &lt;br /&gt;    PCWSTR pszProvider)&lt;br /&gt;{&lt;br /&gt;    wprintf(L"Event: %d\n", dwEventID);&lt;br /&gt;&lt;br /&gt;    return S_OK;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is the most basic example of how you might write a callback.  Let’s pretend that we wanted to take an async provider like WSD and make it synchronized.  One way you could do this is by passing in an empty function instance collection, and a handle that the callback object can signal once it receives FD_EVENTID_SEARCHCOMPLETE from the provider.  In the main thread you could just wait on the handle.  Often the callback interface is inherited in a bigger fancier class that does a lot more things than implement IFunctionDiscoveryNotification; the sky is the limit on how you want to structure your code here.  Just make sure you exercise good tread safety.  If you are sharing memory between the main program thread and your callback’s tread, be sure to use a SRW lock.  &lt;br /&gt;&lt;br /&gt;Now armed with callbacks, you can use two of FD’s main features: enumerating, and receiving notifications.  With callbacks you will be able to take advantage of all of the providers on your computer.&lt;br /&gt;&lt;br /&gt;Hopefully next time we can see how simple it is to write a FD provider and register it on your computer.  Once we can write a simple provider, we can move on to writing full blown PnP-X providers.  If you want to skip straight to PnP-X, there is a sample of one in the Windows SDK already, but hopefully I will be able to break it down into more digestible chunks. :)&lt;br /&gt;&lt;br /&gt;If you are interested in using FD and want some extra help, email me and I can get you going on writing your provider or whatever you want to get accomplished.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-4382982341531393968?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/4382982341531393968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/09/function-discovery-callback-objects.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4382982341531393968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/4382982341531393968'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/09/function-discovery-callback-objects.html' title='Function Discovery: Callback Objects, Implementing IFunctionDiscoveryNotification'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-3047219148457848498</id><published>2009-09-08T17:23:00.000-07:00</published><updated>2009-09-08T17:54:37.906-07:00</updated><title type='text'>Function Discovery Intro</title><content type='html'>The other day I wrote a post about using SetupDi to enumerate PnP devices.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://samscode.blogspot.com/2009/08/setupdi-how-to-enumerate-devices-using.html"&gt;SetupDi Post&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But SetupDi is not the only API to enumerate devices; Function Discovery can also enumerate PnP devices along with a host of other capabilities.&lt;br /&gt;&lt;br /&gt;Function Discovery (FD) came to life as part of Windows Vista.  FD’s main goal was to provide a unified API and interfaces for gathering functionality, properties, and notifications from various providers.  PnP just happens to be one of the providers.  Before FD, different API sets were required for discovering functionality of devices; for example you could use SetupDiGetClassDevs to find physically connected devices, but you had to use other APIs for network devices or printers.  Using FD, you can use the same set of interfaces and methods for PnP and any number of devices exposed trough a provider.  Vista shipped with in-box-providers for PnP, PnP-X (WSD &amp;amp; SSDP), Registry, NetBIOS, and the capability for third parties to create their own providers, and Windows 7 there are even more providers.&lt;br /&gt;&lt;br /&gt;If you have the Windows SDK installed (I assume that you would if you are interested in writing this kind of code), you can do some header spelunking.  Check out FunctionDiscoveryCategories.h to get an idea of what providers you can try to use.  Also you can dig into the registry to see what other providers are registered on the system at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Function Discovery\Categories.&lt;br /&gt;&lt;br /&gt;So if you need to enumerate devices and/or get notifications, FD can help assuming there is a provider for it.&lt;br /&gt;&lt;br /&gt;To start out with, I wrote a sample FD code using the PnP provider to enumerate PnP devices just like I did in the SetupDiGetClassDevs example from before.  I wrote this a while back now, so I hope there are no bug in this code.&lt;br /&gt;&lt;br /&gt;I am having it print out a few properties from each function instance.  A good place to go to find what kinds of properties are discoverable through FD is the header files included in the SDK: functiondiscoverykeys.h, and functiondiscoverykeys_devpkey.h.  Not all PKEYs are populated by all providers; for example, PKEY_WSD_MetadataVersion will not be populated by the PnP provider, but will be populated by the WSD provider.  Generally PKEYs populated by the PnP are prefixed with PKEY_Device_, and the properties you can get with SetupDi are available with the PnP FD provider.  &lt;br /&gt;&lt;br /&gt;For a more in depth reference to Function Discovery, refer to the official &lt;a href="http://msdn.microsoft.com/en-us/library/aa363892%28VS.85%29.aspx"&gt;MSDN FD documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/* displays pnp function instances */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;#include &amp;lt;FunctionDiscovery.h&gt;&lt;br /&gt;&lt;br /&gt;HRESULT PrintFIs(IFunctionInstanceCollection* FIs);&lt;br /&gt;&lt;br /&gt;int __cdecl wmain(&lt;br /&gt;    __in int argc, &lt;br /&gt;    __in_ecount(argc) PWSTR&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;    HRESULT hr = S_OK;&lt;br /&gt;    IFunctionDiscovery *pFD = NULL;&lt;br /&gt;    IFunctionInstanceCollectionQuery *pPnpQuery = NULL;&lt;br /&gt;    IFunctionInstanceCollection *pFICollection = NULL;&lt;br /&gt;&lt;br /&gt;    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);&lt;br /&gt;&lt;br /&gt;    // CoCreate FunctionDiscovery&lt;br /&gt;    if (S_OK == hr)&lt;br /&gt;    {&lt;br /&gt;        hr = CoCreateInstance(&lt;br /&gt;                __uuidof(FunctionDiscovery),&lt;br /&gt;                NULL,&lt;br /&gt;                CLSCTX_ALL,&lt;br /&gt;                __uuidof(IFunctionDiscovery),&lt;br /&gt;                (PVOID*)&amp;pFD);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Query the pnp provider&lt;br /&gt;    if (S_OK == hr)&lt;br /&gt;    {&lt;br /&gt;        hr = pFD-&gt;CreateInstanceCollectionQuery(&lt;br /&gt;                FCTN_CATEGORY_PNP, // pnp category (defined in functiondiscoverycategories.h)&lt;br /&gt;                NULL,              // subcategory&lt;br /&gt;                FALSE,             // include subcategories&lt;br /&gt;                NULL,              // notification callback&lt;br /&gt;                NULL,              // context&lt;br /&gt;                &amp;pPnpQuery);       // FI collection query&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /*&lt;br /&gt;    // * optional *&lt;br /&gt;    // add property constraints&lt;br /&gt;    // generally only works with core FD properties, and not provider specific properties&lt;br /&gt;    if (S_OK == hr)&lt;br /&gt;    {&lt;br /&gt;        PROPVARIANT pv;&lt;br /&gt;&lt;br /&gt;        PropVariantClear(&amp;pv);&lt;br /&gt;&lt;br /&gt;        pv.vt = VT_UINT;&lt;br /&gt;        pv.uintVal = 0;&lt;br /&gt;&lt;br /&gt;        hr = pPnpQuery-&gt;AddPropertyConstraint(PKEY_FD_Visibility, &amp;pv, QC_EQUALS);&lt;br /&gt;&lt;br /&gt;        PropVariantClear(&amp;pv);&lt;br /&gt;    }&lt;br /&gt;    */&lt;br /&gt;&lt;br /&gt;    /*&lt;br /&gt;    // * optional *&lt;br /&gt;    // add query constraints&lt;br /&gt;    // refer to functiondiscoveryconstraints.h&lt;br /&gt;    if (S_OK == hr)&lt;br /&gt;    {&lt;br /&gt;        hr = pPnpQuery-&gt;AddQueryConstraint(PNP_CONSTRAINTVALUE_NOTPRESENT, FD_CONSTRAINTVALUE_TRUE);&lt;br /&gt;    }&lt;br /&gt;    */&lt;br /&gt;&lt;br /&gt;    if (S_OK == hr)&lt;br /&gt;    {&lt;br /&gt;        hr = pPnpQuery-&gt;Execute(&amp;pFICollection);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (S_OK == hr)&lt;br /&gt;    {&lt;br /&gt;        hr = PrintFIs(pFICollection);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // clean up&lt;br /&gt;    if (pFD)&lt;br /&gt;    {&lt;br /&gt;        pFD-&gt;Release();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (pPnpQuery)&lt;br /&gt;    {&lt;br /&gt;        pPnpQuery-&gt;Release();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (pFICollection)&lt;br /&gt;    {&lt;br /&gt;        pFICollection-&gt;Release();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    CoUninitialize();&lt;br /&gt;&lt;br /&gt;    if (S_OK != hr)&lt;br /&gt;    {&lt;br /&gt;        wprintf(L"an error occured (hr == 0x%x)\n", hr);&lt;br /&gt;        return 1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;HRESULT PrintFIs(&lt;br /&gt;    IFunctionInstanceCollection* FIs&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;    HRESULT hr = S_OK;&lt;br /&gt;    DWORD cFIs = 0;&lt;br /&gt;    IFunctionInstance *pFI = NULL;&lt;br /&gt;    IFunctionInstanceCollection *pDeviceFunctionCollection = NULL;&lt;br /&gt;&lt;br /&gt;    if (FIs)&lt;br /&gt;    {&lt;br /&gt;        hr = FIs-&gt;GetCount(&amp;cFIs);&lt;br /&gt;&lt;br /&gt;        wprintf(L"*******************************************************\n");&lt;br /&gt;        wprintf(L"* %i Function Instances\n", cFIs);&lt;br /&gt;        wprintf(L"*******************************************************\n\n");&lt;br /&gt;&lt;br /&gt;        // go through each function instance&lt;br /&gt;        for (DWORD i = 0; S_OK == hr &amp;&amp; i &lt; cFIs; i++)&lt;br /&gt;        {&lt;br /&gt;            hr = FIs-&gt;Item(i, &amp;pFI);&lt;br /&gt;&lt;br /&gt;            if (S_OK == hr)&lt;br /&gt;            {&lt;br /&gt;                IPropertyStore *pPropertyStore = NULL;&lt;br /&gt;&lt;br /&gt;                pFI-&gt;OpenPropertyStore(STGM_READ, &amp;pPropertyStore);&lt;br /&gt;&lt;br /&gt;                if (pPropertyStore)&lt;br /&gt;                {&lt;br /&gt;                    PROPVARIANT pv;&lt;br /&gt;&lt;br /&gt;                    PropVariantClear(&amp;pv);&lt;br /&gt;&lt;br /&gt;                    // PKEYs can be found in these headers in the SDK:&lt;br /&gt;                    // functiondiscoverykeys.h functiondiscoverykeys_devpkey.h&lt;br /&gt;                    // Providers do not populate all PKEYs.&lt;br /&gt;                    hr = pPropertyStore-&gt;GetValue(PKEY_Device_FriendlyName, &amp;pv);&lt;br /&gt;&lt;br /&gt;                    if (S_OK == hr)&lt;br /&gt;                    {&lt;br /&gt;                        wprintf(L"Device Friendly Name : \"%s\"\n", (pv.vt == VT_LPWSTR) ? pv.pwszVal : L"");&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    PropVariantClear(&amp;pv);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                    hr = pPropertyStore-&gt;GetValue(PKEY_Device_InstanceId, &amp;pv);&lt;br /&gt;&lt;br /&gt;                    if (S_OK == hr &amp;&amp; VT_LPWSTR == pv.vt)&lt;br /&gt;                    {&lt;br /&gt;                        wprintf(L"\tDevice Instance ID : \"%s\"\n", pv.pwszVal);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    PropVariantClear(&amp;pv);&lt;br /&gt;&lt;br /&gt;                    hr = pPropertyStore-&gt;GetValue(PKEY_Device_Class, &amp;pv);&lt;br /&gt;&lt;br /&gt;                    if (S_OK == hr &amp;&amp; VT_LPWSTR == pv.vt)&lt;br /&gt;                    {&lt;br /&gt;                        wprintf(L"\tClass : %s",pv.pwszVal);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    PropVariantClear(&amp;pv);&lt;br /&gt;&lt;br /&gt;                    hr = pPropertyStore-&gt;GetValue(PKEY_Device_ClassGuid, &amp;pv);&lt;br /&gt;&lt;br /&gt;                    if (S_OK == hr &amp;&amp; VT_CLSID == pv.vt)&lt;br /&gt;                    {&lt;br /&gt;                        wprintf(L"\t(GUID : %x-%x-%x-%x%x-%x%x%x%x%x%x)\n",&lt;br /&gt;                                pv.puuid-&gt;Data1, &lt;br /&gt;                                pv.puuid-&gt;Data2, &lt;br /&gt;                                pv.puuid-&gt;Data3, &lt;br /&gt;                                pv.puuid-&gt;Data4[0],&lt;br /&gt;                                pv.puuid-&gt;Data4[1],&lt;br /&gt;                                pv.puuid-&gt;Data4[2],&lt;br /&gt;                                pv.puuid-&gt;Data4[3],&lt;br /&gt;                                pv.puuid-&gt;Data4[4],&lt;br /&gt;                                pv.puuid-&gt;Data4[5],&lt;br /&gt;                                pv.puuid-&gt;Data4[6],&lt;br /&gt;                                pv.puuid-&gt;Data4[7]&lt;br /&gt;                                );&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    PropVariantClear(&amp;pv);&lt;br /&gt;&lt;br /&gt;                    pPropertyStore-&gt;Release();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (pFI)&lt;br /&gt;            {&lt;br /&gt;                pFI-&gt;Release();&lt;br /&gt;                pFI = NULL;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (pDeviceFunctionCollection)&lt;br /&gt;            {&lt;br /&gt;                pDeviceFunctionCollection-&gt;Release();&lt;br /&gt;                pDeviceFunctionCollection = NULL;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return hr;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-3047219148457848498?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/3047219148457848498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/09/function-discovery-intro.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/3047219148457848498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/3047219148457848498'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/09/function-discovery-intro.html' title='Function Discovery Intro'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-7111770827726077801</id><published>2009-08-12T15:31:00.001-07:00</published><updated>2009-08-12T15:33:14.741-07:00</updated><title type='text'>Creating an IStream or ISequentialStream From a String for XmlLite</title><content type='html'>XmlLite needs an IStream or an ISequentialStream to parse from.  You can get one by opening a file like I showed in the previous post, but in my real code I didn’t have a file, I had a string.  No biggie, you can always implement your own if there isn’t one already.  This CStringStream class implements ISequentialStream using a string as an input.  The class factory method takes in a string, creates a buffer, and gives back an ISequentialStream.  Awesome, just what you need if you want to use XmlLite on XML in a string.  Here is the class implementation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#pragma once&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;// this class creates an ISequentialStream from a string&lt;br /&gt;//&lt;br /&gt;class CStringStream : public ISequentialStream&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    // factory method&lt;br /&gt;    __checkReturn static HRESULT Create(&lt;br /&gt;            __in LPWSTR psBuffer,&lt;br /&gt;            __deref_out ISequentialStream **ppStream) &lt;br /&gt;    {&lt;br /&gt;        HRESULT hr = S_OK;&lt;br /&gt;        void *pNewBuff = NULL;&lt;br /&gt;        size_t buffSize = 0;&lt;br /&gt;&lt;br /&gt;        if (!psBuffer)&lt;br /&gt;        {&lt;br /&gt;            return E_INVALIDARG;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        *ppStream = NULL;&lt;br /&gt;&lt;br /&gt;        buffSize = (wcslen(psBuffer)+1) * sizeof(wchar_t);&lt;br /&gt;        pNewBuff = malloc(buffSize);&lt;br /&gt;&lt;br /&gt;        if (!pNewBuff)&lt;br /&gt;        {&lt;br /&gt;            return E_OUTOFMEMORY;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        hr = StringCbCopy((LPWSTR)pNewBuff, buffSize, psBuffer);&lt;br /&gt;&lt;br /&gt;        if (S_OK == hr)&lt;br /&gt;        {&lt;br /&gt;            *ppStream = new CStringStream(&lt;br /&gt;                    buffSize,&lt;br /&gt;                    pNewBuff);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (!*ppStream)&lt;br /&gt;        {&lt;br /&gt;            hr = E_FAIL;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return hr;&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    // ISequentialStream&lt;br /&gt;    __checkReturn HRESULT STDMETHODCALLTYPE Read(&lt;br /&gt;        __out_bcount_part(cb, *pcbRead) void *pv,&lt;br /&gt;        /* [in] */ ULONG cb,&lt;br /&gt;        __out_opt  ULONG *pcbRead)&lt;br /&gt;    {&lt;br /&gt;        HRESULT hr = S_OK;&lt;br /&gt;&lt;br /&gt;        for (*pcbRead = 0; *pcbRead &lt; cb; ++*pcbRead, ++m_buffSeekIndex)&lt;br /&gt;        {&lt;br /&gt;            // we are seeking past the end of the buffer&lt;br /&gt;            if (m_buffSeekIndex == m_buffSize)&lt;br /&gt;            {&lt;br /&gt;                hr = S_FALSE;&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            ((BYTE*)pv)[*pcbRead] = ((BYTE*)m_pBuffer)[m_buffSeekIndex];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return hr;&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    HRESULT STDMETHODCALLTYPE Write(&lt;br /&gt;        __in_bcount(cb)  const void *pv,&lt;br /&gt;        /* [in] */ ULONG cb,&lt;br /&gt;        __out_opt  ULONG *pcbWritten)&lt;br /&gt;    {&lt;br /&gt;        return E_NOTIMPL;&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    // IUnknown&lt;br /&gt; STDMETHODIMP_(ULONG) AddRef()&lt;br /&gt; {&lt;br /&gt;  return InterlockedIncrement(&amp;m_cRef);&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; STDMETHODIMP_(ULONG) Release()&lt;br /&gt; {&lt;br /&gt;  LONG cRef = InterlockedDecrement(&amp;m_cRef);&lt;br /&gt;&lt;br /&gt;  if (0 == cRef)&lt;br /&gt;  {&lt;br /&gt;   delete this;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return cRef;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; STDMETHODIMP QueryInterface(REFIID riid, __deref_out_opt void **ppv)&lt;br /&gt; {&lt;br /&gt;  HRESULT hr = S_OK;&lt;br /&gt;&lt;br /&gt;  if (ppv)&lt;br /&gt;  {&lt;br /&gt;   *ppv = NULL;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   hr = E_INVALIDARG;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (S_OK == hr)&lt;br /&gt;  {&lt;br /&gt;   if ((__uuidof(IUnknown) == riid) || (riid == __uuidof(ISequentialStream)))&lt;br /&gt;   {&lt;br /&gt;    AddRef();&lt;br /&gt;    *ppv = (ISequentialStream*)this;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    hr = E_NOINTERFACE;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return hr;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; LONG m_cRef;&lt;br /&gt;    void *m_pBuffer;&lt;br /&gt;    size_t m_buffSize;&lt;br /&gt;    size_t m_buffSeekIndex;&lt;br /&gt;&lt;br /&gt;    // constructor/deconstructor&lt;br /&gt; CStringStream(&lt;br /&gt;            __in size_t buffSize,&lt;br /&gt;            __in void *pBuff)&lt;br /&gt;        :&lt;br /&gt;            m_cRef(1), &lt;br /&gt;            m_pBuffer(pBuff), &lt;br /&gt;            m_buffSize(buffSize),&lt;br /&gt;            m_buffSeekIndex(0)&lt;br /&gt;    {&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    ~CStringStream()&lt;br /&gt;    {&lt;br /&gt;        free(m_pBuffer);&lt;br /&gt;    };&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-7111770827726077801?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/7111770827726077801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/08/creating-istream-or-isequentialstream.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7111770827726077801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7111770827726077801'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/08/creating-istream-or-isequentialstream.html' title='Creating an IStream or ISequentialStream From a String for XmlLite'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-5452326810980604712</id><published>2009-08-12T15:02:00.000-07:00</published><updated>2009-08-12T15:10:43.462-07:00</updated><title type='text'>Howto Use XmlLite</title><content type='html'>I was recently breaking off high-level heavy-weight dependencies on a code I was cleaning up, and I ran into the 500 lb. gorilla that is MSXML6.  I found some code that was using it to parse some basic XML strings.  MSXML is a full featured XML parser that can do fancy things like schema validation, but it is kind of heavy weight and has high-level dependencies.  The downsides of MSXML might be a necessary evil if you need its fancy features, but in many cases we don’t.  In my code, I definitely did not.  I wanted to gut XML out altogether, but was vetoed.  My thoughts turned to MSXML’s handsome and more athletic cousin, XmlLite.  XmlLite has very few dependencies and is self-contained in its own library files. Although XmlLite is COM like, it doesn’t even actually have a dependency on COM, so I am liking this guy already.  It does need an IStream, or an ISequentialStream, so you will have to create one from some file, or implement the interface yourself.  I can provide a sample implementation of that later.&lt;br /&gt;&lt;br&gt;&lt;br /&gt;To the code…&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Here is a simple quick and dirty code I wrote mainly following the code samples on MSDN.  This program takes a filename as a parameter, opens it, and parses the XML printing out the elements.  The code I actually wrote looks cleaner, but this will get you going.  &lt;br /&gt;&lt;br&gt;&lt;br /&gt;MSDN Refrences&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms763742%28VS.85%29.aspx"&gt;MSXML6&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms752872%28VS.85%29.aspx"&gt;XmlLite&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt; * xml_lite.cpp&lt;br /&gt; *&lt;br /&gt; * Description : simple code to show using XML Lite&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;objbase.h&gt;&lt;br /&gt;#include &amp;lt;XmlLite.h&gt;&lt;br /&gt;#include &amp;lt;shlwapi.h&gt;&lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;HRESULT WriteAttributes(IXmlReader* pReader)&lt;br /&gt;{&lt;br /&gt;    const WCHAR* pwszPrefix;&lt;br /&gt;    const WCHAR* pwszLocalName;&lt;br /&gt;    const WCHAR* pwszValue;&lt;br /&gt;    HRESULT hr = pReader-&gt;MoveToFirstAttribute();&lt;br /&gt;&lt;br /&gt;    if (S_FALSE == hr)&lt;br /&gt;        return hr;&lt;br /&gt;    if (S_OK != hr)&lt;br /&gt;    {&lt;br /&gt;        wprintf(L"Error moving to first attribute, error is %08.8lx", hr);&lt;br /&gt;        return -1;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        while (TRUE)&lt;br /&gt;        {&lt;br /&gt;            if (!pReader-&gt;IsDefault())&lt;br /&gt;            {&lt;br /&gt;                UINT cwchPrefix;&lt;br /&gt;                if (FAILED(hr = pReader-&gt;GetPrefix(&amp;pwszPrefix, &amp;cwchPrefix)))&lt;br /&gt;                {&lt;br /&gt;                    wprintf(L"Error getting prefix, error is %08.8lx", hr);&lt;br /&gt;                    return -1;&lt;br /&gt;                }&lt;br /&gt;                if (FAILED(hr = pReader-&gt;GetLocalName(&amp;pwszLocalName, NULL)))&lt;br /&gt;                {&lt;br /&gt;                    wprintf(L"Error getting local name, error is %08.8lx", hr);&lt;br /&gt;                    return -1;&lt;br /&gt;                }&lt;br /&gt;                if (FAILED(hr = pReader-&gt;GetValue(&amp;pwszValue, NULL)))&lt;br /&gt;                {&lt;br /&gt;                    wprintf(L"Error getting value, error is %08.8lx", hr);&lt;br /&gt;                    return -1;&lt;br /&gt;                }&lt;br /&gt;                if (cwchPrefix &gt; 0)&lt;br /&gt;                    wprintf(L"Attr: %s:%s=\"%s\" \n", pwszPrefix, pwszLocalName, pwszValue);&lt;br /&gt;                else&lt;br /&gt;                    wprintf(L"Attr: %s=\"%s\" \n", pwszLocalName, pwszValue);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (S_OK != pReader-&gt;MoveToNextAttribute())&lt;br /&gt;                break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return hr;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int __cdecl wmain(&lt;br /&gt;        __in int argc, &lt;br /&gt;        __in_ecount(argc) LPCTSTR argv[])&lt;br /&gt;{&lt;br /&gt;    HRESULT hr = S_OK;&lt;br /&gt;    IStream *pStream = NULL;&lt;br /&gt;    IXmlReader *pReader = NULL;&lt;br /&gt;    UINT cAttribute = 0;&lt;br /&gt;&lt;br /&gt;    if (FAILED(hr = SHCreateStreamOnFile(argv[1], STGM_READ, &amp;pStream)))&lt;br /&gt;    {&lt;br /&gt;        wprintf(L"Error creating file reader, error is %08.8lx", hr);&lt;br /&gt;        return hr;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (FAILED(hr = CreateXmlReader(__uuidof(IXmlReader), (void**) &amp;pReader, NULL)))&lt;br /&gt;    {&lt;br /&gt;        wprintf(L"error creating xml reader, error is %08.8lx", hr);&lt;br /&gt;        return hr;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (FAILED(hr = pReader-&gt;SetProperty(XmlReaderProperty_DtdProcessing, DtdProcessing_Prohibit)))&lt;br /&gt;    {&lt;br /&gt;        wprintf(L"Error setting XmlReaderProperty_DtdProcessing, error is %08.8lx", hr);&lt;br /&gt;        return -1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (FAILED(hr = pReader-&gt;SetInput(pStream)))&lt;br /&gt;    {&lt;br /&gt;        wprintf(L"Error setting input for reader, error is %08.8lx", hr);&lt;br /&gt;        return -1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    XmlNodeType nodeType;&lt;br /&gt;&lt;br /&gt;    while (S_OK == (hr = pReader-&gt;Read(&amp;nodeType)))&lt;br /&gt;    {&lt;br /&gt;        LPCWSTR pwszPrefix = NULL;&lt;br /&gt;        UINT cwchPrefix = 0;&lt;br /&gt;        LPCWSTR pwszLocalName = NULL;&lt;br /&gt;        LPCWSTR pwszValue = NULL;&lt;br /&gt;&lt;br /&gt;     switch (nodeType)&lt;br /&gt;  {&lt;br /&gt;  case XmlNodeType_XmlDeclaration:&lt;br /&gt;   wprintf(L"XmlDeclaration\n");&lt;br /&gt;   if (FAILED(hr = WriteAttributes(pReader)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error writing attributes, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   break;&lt;br /&gt;  case XmlNodeType_Element:&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetPrefix(&amp;pwszPrefix, &amp;cwchPrefix)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting prefix, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetLocalName(&amp;pwszLocalName, NULL)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting local name, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   if (cwchPrefix &gt; 0)&lt;br /&gt;    wprintf(L"Element: %s:%s\n", pwszPrefix, pwszLocalName);&lt;br /&gt;   else&lt;br /&gt;    wprintf(L"Element: %s\n", pwszLocalName);&lt;br /&gt;&lt;br /&gt;   if (FAILED(hr = WriteAttributes(pReader)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error writing attributes, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (pReader-&gt;IsEmptyElement() )&lt;br /&gt;    wprintf(L" (empty)");&lt;br /&gt;   break;&lt;br /&gt;  case XmlNodeType_EndElement:&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetPrefix(&amp;pwszPrefix, &amp;cwchPrefix)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting prefix, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetLocalName(&amp;pwszLocalName, NULL)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting local name, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   if (cwchPrefix &gt; 0)&lt;br /&gt;    wprintf(L"End Element: %s:%s\n", pwszPrefix, pwszLocalName);&lt;br /&gt;   else&lt;br /&gt;    wprintf(L"End Element: %s\n", pwszLocalName);&lt;br /&gt;   break;&lt;br /&gt;        /*&lt;br /&gt;  case XmlNodeType_Text:&lt;br /&gt;  case XmlNodeType_Whitespace:&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetValue(&amp;pwszValue, NULL)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting value, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   wprintf(L"Text: &gt;%s&lt;\n", pwszValue);&lt;br /&gt;   break;&lt;br /&gt;        */&lt;br /&gt;  case XmlNodeType_CDATA:&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetValue(&amp;pwszValue, NULL)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting value, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   wprintf(L"CDATA: %s\n", pwszValue);&lt;br /&gt;   break;&lt;br /&gt;  case XmlNodeType_ProcessingInstruction:&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetLocalName(&amp;pwszLocalName, NULL)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting name, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetValue(&amp;pwszValue, NULL)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting value, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   wprintf(L"Processing Instruction name:%S value:%S\n", pwszLocalName, pwszValue);&lt;br /&gt;   break;&lt;br /&gt;  case XmlNodeType_Comment:&lt;br /&gt;   if (FAILED(hr = pReader-&gt;GetValue(&amp;pwszValue, NULL)))&lt;br /&gt;   {&lt;br /&gt;    wprintf(L"Error getting value, error is %08.8lx", hr);&lt;br /&gt;    return -1;&lt;br /&gt;   }&lt;br /&gt;   wprintf(L"Comment: %s\n", pwszValue);&lt;br /&gt;   break;&lt;br /&gt;  case XmlNodeType_DocumentType:&lt;br /&gt;   wprintf(L"DOCTYPE is not printed\n");&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;        /*&lt;br /&gt;        hr = pReader-&gt;GetAttributeCount(&amp;cAttribute);&lt;br /&gt;&lt;br /&gt;        if (S_OK == hr)&lt;br /&gt;        {&lt;br /&gt;            wprintf(L"num attrubutes %i\n", cAttribute);&lt;br /&gt;        }&lt;br /&gt;        */&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return hr;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-5452326810980604712?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/5452326810980604712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/08/howto-use-xmllite.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/5452326810980604712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/5452326810980604712'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/08/howto-use-xmllite.html' title='Howto Use XmlLite'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-1922772731593479507</id><published>2009-08-10T17:29:00.000-07:00</published><updated>2009-10-12T14:51:36.381-07:00</updated><title type='text'>SetupDi: How To Enumerate Devices Using SetupDiGetClassDevs</title><content type='html'>I am back to work from my month off for paternity leave with a fresh new post.  This time I going to write a about a topic that is directly related to my job, devices.  In particular, we will look at how to use SetupDi to enumerate present devices and print out a few properties.  There are a lot of other APIs available in Windows to do device enumeration.  Perhaps I will cover them in later posts.  As you will see in this post, SetupDi’s interfaces aren’t the most conducive to sexy code, but for better or worse, SetupAPI is the main way to work with devices in Windows.  If you have any opinion on what a good device API should look like in Windows, please leave a comment and let me know.   &lt;br /&gt;&lt;br&gt;&lt;br /&gt;Windows Vista on there is another API that is maybe easier to use for this kind of task, Function Discovery.  If you are interested, check it out at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://samscode.blogspot.com/2009/09/function-discovery-intro.html"&gt;Function Discovery PnP Enumeration Example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To the code…&lt;br /&gt;&lt;br&gt;&lt;br /&gt;This code is pretty basic.  We create an HDEVINFO set of all present dev nodes, and step through each dev node printing out a few properties.   I haven’t really looked at this sample code recently, so let me know if you see any problems.  &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt;windows.h&gt;&lt;br /&gt;#include &amp;lt;setupapi.h&gt;&lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;void print_property&lt;br /&gt;(&lt;br /&gt;    __in HDEVINFO        hDevInfo,&lt;br /&gt;    __in SP_DEVINFO_DATA DeviceInfoData,&lt;br /&gt;    __in PCWSTR          Label,&lt;br /&gt;    __in DWORD           Property&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;    DWORD  DataT;&lt;br /&gt;    LPTSTR buffer     = NULL;&lt;br /&gt;    DWORD  buffersize = 0;&lt;br /&gt;    &lt;br /&gt;    //&lt;br /&gt;    // Call function with null to begin with, &lt;br /&gt;    // then use the returned buffer size (doubled)&lt;br /&gt;    // to Alloc the buffer. Keep calling until&lt;br /&gt;    // success or an unknown failure.&lt;br /&gt;    //&lt;br /&gt;    //  Double the returned buffersize to correct&lt;br /&gt;    //  for underlying legacy CM functions that &lt;br /&gt;    //  return an incorrect buffersize value on &lt;br /&gt;    //  DBCS/MBCS systems.&lt;br /&gt;    // &lt;br /&gt;    while (!SetupDiGetDeviceRegistryProperty(&lt;br /&gt;                hDevInfo,&lt;br /&gt;                &amp;DeviceInfoData,&lt;br /&gt;                Property,&lt;br /&gt;                &amp;DataT,&lt;br /&gt;                (PBYTE)buffer,&lt;br /&gt;                buffersize,&lt;br /&gt;                &amp;buffersize))&lt;br /&gt;    {&lt;br /&gt;        if (ERROR_INSUFFICIENT_BUFFER == GetLastError())&lt;br /&gt;        {&lt;br /&gt;            // Change the buffer size.&lt;br /&gt;            if (buffer)&lt;br /&gt;            {&lt;br /&gt;                LocalFree(buffer);&lt;br /&gt;            }&lt;br /&gt;            // Double the size to avoid problems on &lt;br /&gt;            // W2k MBCS systems per KB 888609. &lt;br /&gt;            buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    wprintf(L"%s %s\n",Label, buffer);&lt;br /&gt;    &lt;br /&gt;    if (buffer)&lt;br /&gt;    {&lt;br /&gt;        LocalFree(buffer);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//int main(int argc, char *argv[], char *envp[])&lt;br /&gt;int setupdi_version()&lt;br /&gt;{&lt;br /&gt;    HDEVINFO hDevInfo;&lt;br /&gt;    SP_DEVINFO_DATA DeviceInfoData;&lt;br /&gt;    DWORD i;&lt;br /&gt;&lt;br /&gt;    // Create a HDEVINFO with all present devices.&lt;br /&gt;    hDevInfo = SetupDiGetClassDevs(&lt;br /&gt;                    NULL,&lt;br /&gt;                    0, // Enumerator&lt;br /&gt;                    0,&lt;br /&gt;                    DIGCF_PRESENT | DIGCF_ALLCLASSES);&lt;br /&gt;    &lt;br /&gt;    if (INVALID_HANDLE_VALUE == hDevInfo)&lt;br /&gt;    {&lt;br /&gt;        // Insert error handling here.&lt;br /&gt;        return 1;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // Enumerate through all devices in Set.&lt;br /&gt;&lt;br /&gt;    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);&lt;br /&gt;&lt;br /&gt;    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &amp;DeviceInfoData); i++)&lt;br /&gt;    {&lt;br /&gt;        LPTSTR buffer     = NULL;&lt;br /&gt;        DWORD  buffersize = 0;&lt;br /&gt;&lt;br /&gt;        print_property(hDevInfo, DeviceInfoData, L"Friendly name :", SPDRP_FRIENDLYNAME);&lt;br /&gt;&lt;br /&gt;        while (!SetupDiGetDeviceInstanceId(&lt;br /&gt;                    hDevInfo, &lt;br /&gt;                    &amp;DeviceInfoData, &lt;br /&gt;                    buffer, &lt;br /&gt;                    buffersize, &lt;br /&gt;                    &amp;buffersize))&lt;br /&gt;        {&lt;br /&gt;            if (buffer)&lt;br /&gt;            {&lt;br /&gt;               LocalFree(buffer);&lt;br /&gt;            }&lt;br /&gt;                &lt;br /&gt;            if (ERROR_INSUFFICIENT_BUFFER == GetLastError())&lt;br /&gt;            {&lt;br /&gt;                // Change the buffer size.&lt;br /&gt;                // Double the size to avoid problems on&lt;br /&gt;                // W2k MBCS systems per KB 888609.&lt;br /&gt;                buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                wprintf(L"error: could not get device instance id (0x%x)\n", GetLastError());&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (buffer)&lt;br /&gt;        {&lt;br /&gt;            wprintf(L"\tDeviceInstanceId : %s\n", buffer);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        print_property(hDevInfo, DeviceInfoData, L"\tClass :", SPDRP_CLASS);&lt;br /&gt;        print_property(hDevInfo, DeviceInfoData, L"\tClass GUID :", SPDRP_CLASSGUID);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    if (NO_ERROR != GetLastError() &amp;&amp; ERROR_NO_MORE_ITEMS != GetLastError())&lt;br /&gt;    {&lt;br /&gt;        // Insert error handling here.&lt;br /&gt;        return 1;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    //  Cleanup&lt;br /&gt;    SetupDiDestroyDeviceInfoList(hDevInfo);&lt;br /&gt;    &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-1922772731593479507?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/1922772731593479507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/08/setupdi-how-to-enumerate-devices-using.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/1922772731593479507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/1922772731593479507'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/08/setupdi-how-to-enumerate-devices-using.html' title='SetupDi: How To Enumerate Devices Using SetupDiGetClassDevs'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-7326693830958170229</id><published>2009-07-10T15:07:00.000-07:00</published><updated>2009-07-10T16:12:33.188-07:00</updated><title type='text'>Removing ATL from Your Code</title><content type='html'>Removing ATL from Your Code&lt;br /&gt;COM is all over the place if you are doing win32 programming especially in higher level components like the shell.  Should we be using COM as a Windows extension model in general is debatable, but we can leave that discussion for a later time.  We want to talk about ATL.  &lt;br /&gt;&lt;br /&gt;The point of ATL is that it is supposed to help you write COM code more quickly by taking care of the tedious parts of COM programming like implementing IUnknown, managing ref counts, and freeing up memory; however, without going into too much gory detail, using ATL adds many high level dependencies not introduced by simple COM programming.  If you are writing a higher level COM object that is already depending on things that use ATL or other high level dependencies, then maybe it doesn’t really matter if you are using ATL.  Then it is really just a matter of preference.  If you want to limit your high level dependencies and lower the level of you COM object, then you should avoid taking a dependency on ATL.  Generally this is what you want to do if you want to write a low level system component that others will depend on and write extensions.  I fall into this latter category for a component I want to clean up.&lt;br /&gt;&lt;br /&gt;Unfortunately you may have some legacy COM code that took a dependency on ATL.  If someone wanted depend on your component for use for something low level, then ATL could be a deal breaker.   That is if COM already isn’t, but there are ways to make COM lean and mean without even using OLE.  Take UMDF for example.   This scenario is precisely the situation I am in.  After coming back from vacation, I will be spending the next while removing ATL from some COM components.  I will write on the things you need to do as I go through and figure out the processes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-7326693830958170229?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/7326693830958170229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/07/removing-atl-from-your-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7326693830958170229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/7326693830958170229'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/07/removing-atl-from-your-code.html' title='Removing ATL from Your Code'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-3717824141913622910</id><published>2009-07-09T15:48:00.000-07:00</published><updated>2009-07-09T15:57:20.306-07:00</updated><title type='text'>Supressing PreFAST Warnings</title><content type='html'>PreFAST is a great static analysis tool that can find lots of bugs for you; however, sometimes it can act like an over protective mother.  In my last posts I NULL terminated the strings just to make PreFAST happy, but it felt more like a hack.  I don't like leaving hacks in my real code.  If there is a PreFAST warning that you feel like is unjustified and you would like you code to PreFAST warning free, you can use a handy #pragma trick to tell PreFAST that you know what you are doing and its okay.  Keep in mind you don't want to do this very often, because generally PreFAST warnings should be fixed.&lt;br /&gt;&lt;br /&gt;In my case, I was mallocing a buffer for a string that was to be read from the registry.  PreFAST was warning me that I should NULL terminate the string.  In this case RegEnumValue should do that correctly or give me an error.  Since this warning is safe to ignore and I don't want to put in a hack just to get rid of the warning I added this #pragma at the line where the warning was:&lt;br /&gt;&lt;br /&gt;#pragma prefast(suppress: 26036, "We expect that RegEnumValue will properly NULL terminate ppszKeyValue.")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-3717824141913622910?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/3717824141913622910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/07/supressing-prefast-warnings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/3717824141913622910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/3717824141913622910'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/07/supressing-prefast-warnings.html' title='Supressing PreFAST Warnings'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-8650174150583190871</id><published>2009-07-08T18:35:00.000-07:00</published><updated>2009-07-08T18:37:54.662-07:00</updated><title type='text'>Reading Registry Values Using RegEnumValue</title><content type='html'>This time I am pretending that I don’t know or care what the name of the value is.  You can do that by using &lt;a href="http://msdn.microsoft.com/en-us/library/ms724865%28VS.85%29.aspx"&gt;RegEnumValue&lt;/a&gt;.  I wrote a function with this prototype:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;__checkReturn HRESULT ReadKeyValue(&lt;br /&gt;        __in LPCWSTR pszSubKey,&lt;br /&gt;        __in DWORD dwIndex,&lt;br /&gt;        __deref_out LPWSTR *ppszKeyValue);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Basically you can read regkey values by its index.  If you wanted to print out all of the values you could do it like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DWORD keyIndex = 0;&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;{&lt;br /&gt;    hr = HRESULT_FROM_WIN32(ReadKeyValue(psCategory, psSubcategory, keyIndex++, &amp;psKeyValue));&lt;br /&gt;    wprintf(L"%s 0x%x\n", psKeyValue, hr);&lt;br /&gt;    if (hr == HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS)) wprintf(L"this means there are no more key values\n");&lt;br /&gt;} while (S_OK == hr);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So here is the complete function.  If you knew that you were going to read a lot of values, you might want to open the regkey handle beforehand, do all of your reads, and close it when you are done.  Other than that this code should look similar to the previous posting.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;__checkReturn HRESULT ReadKeyValue(&lt;br /&gt;        __in LPCWSTR pszSubKey,&lt;br /&gt;        __in DWORD dwIndex,&lt;br /&gt;        __deref_out LPWSTR *ppszKeyValue)&lt;br /&gt;{&lt;br /&gt;    HRESULT hr = S_OK;&lt;br /&gt;    LPWSTR pszSubKey = NULL;&lt;br /&gt;    HKEY hKey = NULL;&lt;br /&gt;    LPWSTR pszValueName = NULL;&lt;br /&gt;    DWORD lpcchValueName = 2048; // a reasonable initial buffer size&lt;br /&gt;    DWORD cbDataSize = 4096;&lt;br /&gt;    DWORD type = 0;&lt;br /&gt;&lt;br /&gt;    hr = HRESULT_FROM_WIN32(&lt;br /&gt;            RegOpenKeyEx(&lt;br /&gt;                HKEY_LOCAL_MACHINE,&lt;br /&gt;                pszSubKey,&lt;br /&gt;                0,&lt;br /&gt;                KEY_QUERY_VALUE,&lt;br /&gt;                &amp;hKey));&lt;br /&gt;&lt;br /&gt;    if (S_OK == hr)&lt;br /&gt;    {&lt;br /&gt;        *ppszKeyValue = (LPWSTR)malloc(cbDataSize);&lt;br /&gt;        pszValueName = (LPWSTR)malloc(lpcchValueName * sizeof(wchar_t));&lt;br /&gt;&lt;br /&gt;        if (!*ppszKeyValue || !pszValueName)&lt;br /&gt;        {&lt;br /&gt;            hr = E_OUTOFMEMORY;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            **ppszKeyValue = L'\0';&lt;br /&gt;            *pszValueName = L'\0';&lt;br /&gt;        } &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    while (S_OK == hr &amp;&amp; S_OK != (hr = HRESULT_FROM_WIN32(&lt;br /&gt;            RegEnumValue(&lt;br /&gt;                hKey,&lt;br /&gt;                dwIndex,&lt;br /&gt;                pszValueName,&lt;br /&gt;                &amp;lpcchValueName ,&lt;br /&gt;                NULL,&lt;br /&gt;                &amp;type,&lt;br /&gt;                (LPBYTE)*ppszKeyValue,&lt;br /&gt;                &amp;cbDataSize))))&lt;br /&gt;    {&lt;br /&gt;        if (*ppszKeyValue)&lt;br /&gt;        {&lt;br /&gt;            free(*ppszKeyValue);&lt;br /&gt;            *ppszKeyValue = NULL;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (pszValueName)&lt;br /&gt;        {&lt;br /&gt;            free(pszValueName);&lt;br /&gt;            pszValueName = NULL;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (HRESULT_FROM_WIN32(ERROR_MORE_DATA) == hr)&lt;br /&gt;        {&lt;br /&gt;            hr = S_OK;&lt;br /&gt;&lt;br /&gt;            *ppszKeyValue = (LPWSTR)malloc(cbDataSize);&lt;br /&gt;            pszValueName = (LPWSTR)malloc(lpcchValueName * sizeof(wchar_t));&lt;br /&gt;&lt;br /&gt;            if (!*ppszKeyValue || !pszValueName)&lt;br /&gt;            {&lt;br /&gt;                hr = E_OUTOFMEMORY;&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                **ppszKeyValue = L'\0'; // PreFAST is still whining about this&lt;br /&gt;                *pszValueName = L'\0';&lt;br /&gt;            } &lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // cleanup&lt;br /&gt;    (void)RegCloseKey(hKey);&lt;br /&gt;&lt;br /&gt;    if (pszValueName)&lt;br /&gt;    {&lt;br /&gt;        free(pszValueName);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (S_OK != hr &amp;&amp; *ppszKeyValue)&lt;br /&gt;    {&lt;br /&gt;        free(*ppszKeyValue);&lt;br /&gt;        *ppszKeyValue = NULL;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return hr;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-8650174150583190871?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/8650174150583190871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/07/reading-registry-values-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/8650174150583190871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/8650174150583190871'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/07/reading-registry-values-using.html' title='Reading Registry Values Using RegEnumValue'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-2370480652646100975</id><published>2009-07-08T11:14:00.000-07:00</published><updated>2009-07-08T11:28:24.002-07:00</updated><title type='text'>Posting Source Code in Blogger</title><content type='html'>It looks like blogger does not have a good built-in way to post code which is lame since this blog is supposed to be about code.  For my last post I used a &amp;lt;pre&amp;gt; tag so the code didn't get foobared.  The &amp;lt;pre&amp;gt; tag tells your browser to use a fixed width font and preserve the spacing.  I supposed that is the easiest fix, and I will go with it for now.&lt;br /&gt;&lt;br /&gt;Googling I found this (&lt;a href="http://code.google.com/p/syntaxhighlighter/wiki/Overview"&gt;santaxhighlighter&lt;/a&gt;) other solution that looks more robust.  I will do all  of the santax highlighting and what not.  It looks like it could be nice, but more overhead and annoyance.&lt;br /&gt;&lt;br /&gt;I guess I could also use something like Word 2007 to publish to Blogger along with all of its bloated html.&lt;br /&gt;&lt;br /&gt;It would be great if Blogger just provided a code mode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-2370480652646100975?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/2370480652646100975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/07/posting-source-code-in-blogger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2370480652646100975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2370480652646100975'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/07/posting-source-code-in-blogger.html' title='Posting Source Code in Blogger'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-6603586253492858529</id><published>2009-07-08T10:24:00.000-07:00</published><updated>2009-07-08T17:37:14.344-07:00</updated><title type='text'>Reading Values From the Registry Using RegGetValue</title><content type='html'>I am working on rewriting this section of code that needs to read key values from the registry.&lt;br /&gt;&lt;br /&gt;First of all, if you already know what the key value is, you can get directly with &lt;a href="http://msdn.microsoft.com/en-us/library/ms724868%28VS.85%29.aspx"&gt;RegGetValue&lt;/a&gt;.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;// you should always use SAL annotations and the free static analysis tool PreFAST&lt;br /&gt;__checkReturn HRESULT ReadKeyValue(&lt;br /&gt;       __in LPCWSTR pszSubKey,&lt;br /&gt;       __deref_out LPWSTR *ppszKeyValue)&lt;br /&gt;{&lt;br /&gt;   HRESULT hr = S_OK;&lt;br /&gt;   DWORD cbDataSize = 4096;&lt;br /&gt;&lt;br /&gt;   *ppszKeyValue = NULL;&lt;br /&gt;&lt;br /&gt;   // This preallocates a reasonable size buffer for the value I want to read&lt;br /&gt;   // so that 99% of the time we only have to do one trip to the registry&lt;br /&gt;   if (!(*ppszKeyValue = (LPWSTR)malloc(cbDataSize)))&lt;br /&gt;   {&lt;br /&gt;       hr = E_OUTOFMEMORY;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;       **ppszKeyValue = L'\0'; // this makes PreFAST happy&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   while (S_OK == hr &amp;amp;&amp;amp; S_OK != (hr = HRESULT_FROM_WIN32(&lt;br /&gt;           RegGetValue(&lt;br /&gt;               HKEY_LOCAL_MACHINE,&lt;br /&gt;               pszSubKey,&lt;br /&gt;               szRegValue,&lt;br /&gt;               RRF_RT_REG_SZ,&lt;br /&gt;               NULL,                                                                                                 &lt;br /&gt;               *ppszKeyValue,&lt;br /&gt;               &amp;amp;cbDataSize))))&lt;br /&gt;   {&lt;br /&gt;       // if our preallocated buffer is not big enough, we will make it the&lt;br /&gt;       // exact size here and try the registry again&lt;br /&gt;       if (*ppszKeyValue)&lt;br /&gt;       {&lt;br /&gt;           free(*ppszKeyValue);&lt;br /&gt;           *ppszKeyValue = NULL;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       if (HRESULT_FROM_WIN32(ERROR_MORE_DATA) == hr)&lt;br /&gt;       {&lt;br /&gt;           hr = S_OK;&lt;br /&gt;&lt;br /&gt;           if(!(*ppszKeyValue = (LPWSTR)malloc(cbDataSize)))&lt;br /&gt;           {&lt;br /&gt;               hr = E_OUTOFMEMORY;&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;       else&lt;br /&gt;       {&lt;br /&gt;           // this means we hit an unexpected failure&lt;br /&gt;           break;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // you should always clean up you memory on error states so you don't leak&lt;br /&gt;   if (S_OK != hr &amp;amp;&amp;amp; *ppszKeyValue)&lt;br /&gt;   {&lt;br /&gt;       free(*ppszKeyValue);&lt;br /&gt;       *ppszKeyValue = NULL;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return hr;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-6603586253492858529?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/6603586253492858529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/07/reading-values-from-registry-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/6603586253492858529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/6603586253492858529'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/07/reading-values-from-registry-using.html' title='Reading Values From the Registry Using RegGetValue'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1650318142382098495.post-2541525028416813321</id><published>2009-07-08T10:17:00.000-07:00</published><updated>2009-07-08T10:22:35.389-07:00</updated><title type='text'>Welcome to Sam's Code</title><content type='html'>I am starting this blog to journal my day to day coding.  As I find out how to do new things, I will post them here.  I have been doing a lot of device related systems programming on Windows.  I will probably post those kind of things first.  I also have tons of old stuff for low-level Linux/Unix and GPU programming that may or may not make it on here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1650318142382098495-2541525028416813321?l=samscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://samscode.blogspot.com/feeds/2541525028416813321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://samscode.blogspot.com/2009/07/welcome-to-sams-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2541525028416813321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1650318142382098495/posts/default/2541525028416813321'/><link rel='alternate' type='text/html' href='http://samscode.blogspot.com/2009/07/welcome-to-sams-code.html' title='Welcome to Sam&apos;s Code'/><author><name>sam</name><uri>http://www.blogger.com/profile/02833051520277478446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_MwcEI7nyShg/SpNt89nlQkI/AAAAAAAAAbI/6RzbGOAkm0k/S220/179389236342af410b557d6.gif'/></author><thr:total>0</thr:total></entry></feed>
