<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>A customer asked of me...</title><link>http://blogs.msdn.com/b/dixi/</link><description /><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>.NET Event Tracing for Windows</title><link>http://blogs.msdn.com/b/dixi/archive/2009/04/23/net-event-tracing-for-windows.aspx</link><pubDate>Thu, 23 Apr 2009 21:17:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9565217</guid><dc:creator>dixi</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/dixi/rsscomments.aspx?WeblogPostID=9565217</wfw:commentRss><comments>http://blogs.msdn.com/b/dixi/archive/2009/04/23/net-event-tracing-for-windows.aspx#comments</comments><description>&lt;P&gt;I didn’t find a good step-by-step guide on how to create a .NET Event Tracing for Windows (ETW) provider with a manifest. And there are some caveats I would like to share with the community so here I go.&lt;/P&gt;
&lt;P&gt;The very first thing I recommend is to familiarize with &lt;A href="http://msdn.microsoft.com/en-us/library/bb968803.aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb968803.aspx"&gt;ETW&lt;/A&gt; concepts like the manifest, session, provider, events, channels, etc. And the second thing is to install the latest version of the Microsoft Windows SDK (v6.1 as I am writing this) because several utilities ease working with ETW. Those tools are the Manifest Generator (ecmangen.exe), the Windows Message Compiler (mc.exe) and the Resource Compiler (rc.exe).&lt;/P&gt;
&lt;P&gt;Now you need to create the XML 1.0 document known as the ETW manifest. Although you can use any text editor, I suggest to use the Manifest Generator utility (ecmangen.exe). And here it comes the first caveat: although the documentation states that the SDK Include directory must be part of the INCLUDE environment variable, I am probably doing something wrong because no manifest file could be opened or created successfully; the Manifest Generator fails with the following error: "Center window failed to initialize. Error: 0x80070006. The handle is invalid.". What I did was to point the Manifest Generator "Start in" shortcut property to "C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\" (the Microsoft Windows SDK default path installation) and it started to work.&lt;/P&gt;
&lt;P&gt;With the Manifest Generator utility and according to your needs for providing ETW information, create your manifest file. To demo the next steps I supply a sample manifest file (Simple.Manifest.xml) that you can&amp;nbsp;&lt;A href="http://dixi.members.winisp.net/blog/msdn/etw/Simple.Manifest.xml" mce_href="http://dixi.members.winisp.net/blog/msdn/etw/Simple.Manifest.xml"&gt;see here&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The Simple manifest file defines the SimpleEtwProvider with ID {d9b453b9-6230-486c-8dec-c7c5a2230d04}. The .NET initialization should look like this:&lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;using Etw = System.Diagnostics.Eventing;
//
// Code omitted intentionally...
//
Guid etwProviderId = new Guid("{d9b453b9-6230-486c-8dec-c7c5a2230d04}");
Etw.EventProvider provider = new Etw.EventProvider(etwProviderId);&lt;/PRE&gt;
&lt;P&gt;Also, the Simple manifest file declares a SimpleEvent (ID and version), a SimpleOperationalChannel, a SimpleTask, a SimpleOpcode, and a SimpleKeyword. These must be used to create a ETW event descriptor as following:&lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;Etw.EventDescriptor descriptor;

unchecked
{
  descriptor = new Etw.EventDescriptor
  (
    0x3e9,                    // Event ID
    0x1,                      // Event Version
    0x10,                     // Operation Channel ID
    0x2,                      // Level
    0xa,                      // Opcode
    0x1,                      // Task
    (long) 0x8000000000000001 // Keywords
  );
}&lt;/PRE&gt;
&lt;P&gt;The constituent parts of the event to be published are determined by the SimpleTemplate element in the manifest file: a StringData and an IntegerData. Data types and order must be observed when the event is published as shown below: &lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;// We know that the event has two parts: a string and an integer
// Be careful to provide the right types in the right order...
object[] payload = { "An event with manifest...", 98 };
provider.WriteEvent(ref descriptor, payload);&lt;/PRE&gt;
&lt;P&gt;A recommended practice is to check if the provider is enabled (at least one session like Performance Monitor) and listening to what you publish. This can be accomplished as following:&lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;if(provider.IsEnabled())
{
  // We know that the event has two parts: a string and an integer
  // Be careful to provide the right types in the right order
  object[] payload = { "An event with manifest...",  98 };
  provider.WriteEvent(ref descriptor, payload);
}&lt;/PRE&gt;
&lt;P&gt;That's it for the development part. Now let's go for the compilation part. First, for the manifest file you need to use the Windows Message Compiler (mc.exe) like this:&lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;MC Simple.Manifest.xml&lt;/PRE&gt;
&lt;P&gt;And I found another caveat here. It happens that both utilities, Manifest Generator and Windows Message Compiler, depend on the winmeta.xml to be located through the INCLUDE environment variable. But even when everything seems to be in place, MC fails with error: ".\winmeta.xml(0) : error Failed trying to parse file.&amp;nbsp; result=0x800c0005: At Line=0, Column=0, The system cannot locate the resource specified.". I even tried the MC –W command-line switch but that didn't work either. I'm probably doing something wrong but to make it work, I had to copy winmeta.xml to the same location of Simple.Manifest.xml.&lt;/P&gt;
&lt;P&gt;A successful MC compilation generates four files: MSG00001.bin, Simple.Manifest.h, Simple.Manifest.rc, and SimpleTEMP.BIN. The only interesting and useful, at least from the .NET developer perspective, is Simple.Manifest.rc. This is to be compiled with the Resource Compiler (rc.exe) to generate the corresponding Simple.Manifest.res as shown below:&lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;RC Simple.Manifest.rc&lt;/PRE&gt;
&lt;P&gt;The last part is to embed the Simple.Manifest.res file into the ETW provider binary image. Let's assume that the .NET code shown above is a console application EtwProvider.cs, the compilation would look like the following:&lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;CSC /win32res:Simple.Manifest.res EtwProvider.cs&lt;/PRE&gt;
&lt;P&gt;From inside the Visual Studio 2008 IDE, the .res file can be specified through the Resource File field in the Project Properties Application tab.&lt;/P&gt;
&lt;P&gt;That's it for the compilation part. Now let's go for the deployment part. The full path from where the application will be executed in the target machine must be supplied in the messageFileName and resourceFileName attributes of the &amp;lt;provider&amp;gt; element in the manifest file (Simple.Manifest.xml). If, for example, the EtwProvider.exe is installed and executed from "C:\Program Files\" the manifest file should be modified to look like the following (some attributes and declarations were omitted intentionally for clarity sake):&lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;&amp;lt;?xml version="1.0" encoding="UTF-16"?&amp;gt;
&amp;lt;instrumentationManifest&amp;gt;
  &amp;lt;instrumentation&amp;gt;
    &amp;lt;events&amp;gt;
      &amp;lt;provider messageFileName="C:\Program Files\EtwProvider.exe"
                resourceFileName="C:\Program Files\EtwProvider.exe"&amp;gt;&lt;/PRE&gt;
&lt;P&gt;The modified manifest file must be registered in the target machine through the Windows Event Command-line utility (wevtutil.exe) as shown below:&lt;/P&gt;&lt;PRE style="TEXT-ALIGN: left; BACKGROUND-COLOR: #cccccc; FONT-FAMILY: 'Courier New'"&gt;WEVTUTIL im Simple.Manifest.xml&lt;/PRE&gt;
&lt;P&gt;Now we're ready to start publishing ETW events. In my next article I will show how to create an Event Trace Session through Performance Monitor.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9565217" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/dixi/archive/tags/ETW/">ETW</category></item><item><title>Application Recovery and Restart</title><link>http://blogs.msdn.com/b/dixi/archive/2008/11/19/vista-application-recovery-and-restart-apis.aspx</link><pubDate>Wed, 19 Nov 2008 21:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9125672</guid><dc:creator>dixi</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/dixi/rsscomments.aspx?WeblogPostID=9125672</wfw:commentRss><comments>http://blogs.msdn.com/b/dixi/archive/2008/11/19/vista-application-recovery-and-restart-apis.aspx#comments</comments><description>&lt;p&gt;I just faced an interesting scenario. It happens that a .NET 3.0 WinForms-based application running on Windows Vista stops responding. Of course, the common sense would say &amp;quot;Find out the root cause and fix it&amp;quot;. It turns out that in this case, it is not that easy. The application depends heavily on threading and asynchronous calls and needs to interact with several devices (which leads directly to establish hypothesis on device drivers) and external systems by using products from several vendors. The underlying root cause might be in any or a combination of those elements. As I am writing this, the problem had not been identified.&lt;/p&gt;  &lt;p&gt;But that's the technical aspect of the scenario. The real problem is with the end-user experience. The application is used to enter a lot of information but, as I stated above, the application stops responding. This leaves no option to the end-user but to kill the application (she was trained to do that) losing all of the information entered up to that moment. The impact on end-user productivity caused by reentering the information is the real problem.&lt;/p&gt;  &lt;p&gt;While working on finding the technical root cause, a customer asked of me if there is something he could do in order to minimize the impact on end-user productivity. Incidentally, Windows Vista (and Windows Server 2008) provides a new set of APIs collectively known as Application Recovery and Restart and the Windows Error Reporting Service (WER). In a nutshell, an application registers itself as a recoverable application which means that in case it stops responding (or receives an unhandled exception) the OS will give it a chance to do some processing prior to being terminated. Usually this processing involves saving a copy of its internal state. The second part, Application Restart, allows the user to launch another instance of the application, restore its state, and get to the point it was when the undesirable condition appeared.&lt;/p&gt;  &lt;p&gt;I am not entitled to show the real application and what I did in it. But to demo the Application Recovery and Restart concepts I created the following form:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/MainForm_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="MainForm" border="0" alt="MainForm" src="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/MainForm_thumb_2.png" width="464" height="178" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The TextBox Text property is all the state I am interested in. The button's task is easy: a while(true); loop caughts the UI thread making the window a Not Responding one as shown in the next figure:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/NotResponding_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="NotResponding" border="0" alt="NotResponding" src="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/NotResponding_thumb.png" width="464" height="178" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;At this moment, everything the end-user is able to do is to click on the Close button, restart the application, and cry for the information gone. So the first thing I do is to declare the Application Recovery and Restart Windows APIs to be invoked from within the C# demo application:&lt;/p&gt;  &lt;pre style="text-align: left; background-color: #cccccc; font-family: &amp;#39;Courier New&amp;#39;"&gt;namespace Win32
{
  public static class ApplicationRecoveryRestart
  {
    public delegate Int32 ApplicationRecoveryCallbackDelegate(RecoveryInformation information);

    [DllImport(&amp;quot;kernel32.dll&amp;quot;)]
    public static extern Int32 RegisterApplicationRecoveryCallback
    (
      ApplicationRecoveryCallbackDelegate recoveryCallback,
      RecoveryInformation information,
      UInt32 pingInterval,
      UInt32 flags
    );

    [DllImport(&amp;quot;kernel32.dll&amp;quot;)]
    public static extern Int32 RegisterApplicationRestart
    (
      [MarshalAs(UnmanagedType.LPWStr)]
      String commandLineArgs,
      UInt32 flags
    );

    [DllImport(&amp;quot;kernel32.dll&amp;quot;)]
    public static extern void ApplicationRecoveryFinished(Boolean success);

    [DllImport(&amp;quot;kernel32.dll&amp;quot;)]
    public static extern Int32 ApplicationRecoveryInProgress(out Boolean canceled);

    [DllImport(&amp;quot;kernel32.dll&amp;quot;)]
    public static extern Int32 UnregisterApplicationRecoveryCallback();

    [DllImport(&amp;quot;kernel32.dll&amp;quot;)]
    public static extern Int32 UnregisterApplicationRestart();
  }

  public class RecoveryInformation
  {
    public string Parameter;
  }
}&lt;/pre&gt;

&lt;p&gt;I am only using a subset of the Application Recovery and Restart Windows APIs but you can go to the MSDN and see the rest. To register the application for recovery, the Main() method is a good place to start:&lt;/p&gt;

&lt;pre style="text-align: left; background-color: #cccccc; font-family: &amp;#39;Courier New&amp;#39;"&gt;[STAThread]
static void Main(string[] args)
{
  string restartFile = Guid.NewGuid().ToString(&amp;quot;N&amp;quot;) + &amp;quot;.dat&amp;quot;;
  RegisterApplicationRecovery(restartFile);

  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(mainForm = new MainForm());
}

private static void RegisterApplicationRecovery(string restartFile)
{
  RecoveryInformation information = new RecoveryInformation();
  information.Parameter = restartFile;

  ApplicationRecoveryRestart.ApplicationRecoveryCallbackDelegate callback;
  callback = new ApplicationRecoveryRestart.ApplicationRecoveryCallbackDelegate(ApplicationRecoveryCallback);
  Int32 result = ApplicationRecoveryRestart.RegisterApplicationRecoveryCallback
  (
    callback,    // Function to be called to store application state when the recovery starts
    information, // It could be anything useful for a restart. In this case is the file holding the state stored during the recovery
    3000,        // Recovery ping interval. It also has to do with ApplicationRecoveryInProgress. See MSDN documentation.
    0            // Reserved for future use
  );
}

public static Int32 ApplicationRecoveryCallback(RecoveryInformation information)
{
  bool canceled = false;

  // Let Windows knows recovery is starting and check if the user has cancelled the recovery...
  ApplicationRecoveryRestart.ApplicationRecoveryInProgress(out canceled);
  if(canceled)
  {
    Trace.WriteLine(&amp;quot;User canceled application recovery...&amp;quot;);

    // Let Windows knows recovery is complete...
    ApplicationRecoveryRestart.ApplicationRecoveryFinished(false);
  }
  else
  {
    Trace.WriteLine(&amp;quot;Application is trying to save data and state information before the application terminates...&amp;quot;);
    using(StreamWriter writer = new StreamWriter(information.Parameter))
    {
      writer.Write(&amp;quot;{0}&amp;quot;, theTextBox.Text); // The TextBox Text property is all the state to be saved...
    }

    // Let Windows knows recovery is complete...
    ApplicationRecoveryRestart.ApplicationRecoveryFinished(true);
  }

  return 0;
}&lt;/pre&gt;

&lt;p&gt;During startup, the application lets Windows knows that in case of becoming a &amp;quot;Not Responding&amp;quot; one, its ApplicationRecoveryCallback function is to be called. Any useful state will be saved inside this function. Before running a quick test of the code and concepts covered so far, it is important to have a couple of caveats in mind:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;If the application is started inside the Visual Studio hosting process, it won't work because it is the latter the one to be recovered and restarted. Test the application through the Debug-&amp;gt;Start without debugging menu item or press &amp;lt;CTRL&amp;gt;+&amp;lt;F5&amp;gt;.&lt;f5&gt; &lt;/li&gt;

  &lt;li&gt;Only applications running for at least sixty seconds are considered by the Application Recovery and Restart and the Windows Error Reporting Service. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the application has entered into the &amp;quot;Not Responding&amp;quot; state, the end-user, unable to do anything else, tries to close it. In response, Microsoft Windows shows the following message box:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/CloseWait_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="CloseWait" border="0" alt="CloseWait" src="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/CloseWait_thumb.png" width="366" height="219" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p mce_keep="true"&gt;When the application is doing a lengthy operation, usually selecting &amp;quot;Wait for the program to respond&amp;quot; could be enough; once the lengthy operation is done, the control returns to the application and the user will be able to continue. In this case, while(true); won't relinquish control ever so the only thing the user is able to do is to click on &amp;quot;Close the program&amp;quot;. This is where the ApplicationRecoveryCallback function is called by the Windows Error Reporting Service and the application state is saved. However, no provisions were made to restart the application. This could be accomplished through the following code:&lt;/p&gt;

&lt;pre style="text-align: left; background-color: #cccccc; font-family: &amp;#39;Courier New&amp;#39;"&gt;[STAThread]
static void Main(string[] args)
{
  string restartFile = Guid.NewGuid().ToString(&amp;quot;N&amp;quot;) + &amp;quot;.dat&amp;quot;;
  RegisterApplicationRecovery(restartFile);
  RegisterApplicationRestart(restartFile);

  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(mainForm = new MainForm());
}

private static void RegisterApplicationRestart(string restartFile)
{
  string commandLineArgs = restartFile;
  ApplicationRecoveryRestart.RegisterApplicationRestart(commandLineArgs, 0);
}&lt;/pre&gt;

&lt;p mce_keep="true"&gt;Notice that the restartFile created during the ApplicationRecovery episode will be used as the commandLine argument for recovery. Therefore the application must determine during startup, if it is being started or restarted. The following is the modified Main function:&lt;/p&gt;

&lt;pre style="text-align: left; background-color: #cccccc; font-family: &amp;#39;Courier New&amp;#39;"&gt;[STAThread]
static void Main(string[] args)
{
  // If the a command-line argument is supplied then the application is being restarted and
  // the supplied argument is the name of the file containing the state to be restored...
  string restartFile;
  if(args.Length &amp;gt; 0)
  {
    restartFile = args[0];
    using(StreamReader reader = new StreamReader(restartFile))
    {
      theTextBox.Text = reader.ReadToEnd();
    }
  }
  else
  {
    restartFile = Guid.NewGuid().ToString(&amp;quot;N&amp;quot;) + &amp;quot;.dat&amp;quot;;
    if(File.Exists(restartFile))
    {
      File.Delete(restartFile);
    }
  }

  RegisterApplicationRecovery(restartFile);
  RegisterApplicationRestart(restartFile);

  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(mainForm = new MainForm());
}&lt;/pre&gt;

&lt;p mce_keep="true"&gt;Under these new circumstances, every time the application hangs and its Close button is clicked the following message box will be shown:&lt;/p&gt;

&lt;p mce_keep="true"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/RestartCloseWait_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="RestartCloseWait" border="0" alt="RestartCloseWait" src="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/RestartCloseWait_thumb.png" width="366" height="260" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p mce_keep="true"&gt;Now there is the &amp;quot;Restart the program&amp;quot; option which explains it by itself. If the user select such option, the application hanging instance is terminated and a new instance is launched as the following message box is shown:&lt;/p&gt;

&lt;p mce_keep="true"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/IsRestarting_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IsRestarting" border="0" alt="IsRestarting" src="http://blogs.msdn.com/blogfiles/dixi/WindowsLiveWriter/ApplicationRecoveryandRestart_D0C3/IsRestarting_thumb.png" width="366" height="163" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p mce_keep="true"&gt;If everything works well, the application is restarted and its state is restored. That's it.&lt;/p&gt;

&lt;p mce_keep="true"&gt;One final note. I have noticed that after a number of times the application is started, hung, and restarted, a point is reached where the recovery/restart functionality stops working. The RegisterApplicationRecoveryCallback returns E_FAIL and I have found that the reason is that the Windows Error Reporting Services runs out of some internal resource that keeps track of every application registered for recovery/restart. Like a good citizen, the application should unregister from the Windows Error Reporting Service through the UnregisterApplicationRecoveryCallback and UnregisterApplicationRestart API but at the time of this writing and after several tests, I have not been successful to find the correct place to unregister which leaves me no option but to restart the Windows Error Reporting Service to make everything works again (yes, I know it is not very end-user friendly).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9125672" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/dixi/archive/tags/Application+Recovery+and+Restart/">Application Recovery and Restart</category></item></channel></rss>