<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Pranav ... Blogging</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/pranavwagh/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/pranavwagh/feed.xml</link>
    <description>This blog is all about Office Automation, VSTO, InfoPath and other programming stuff. Remember..
&amp;quot;Real Stuff is Out Of The Box...!!&amp;quot;</description>
    <lastBuildDate>Wed, 17 Apr 2019 04:00:50 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Programmatically adding a style assumes number format as “General”</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/programmatically-adding-a-style-assumes-number-format-as-general</link>
      <pubDate>Tue, 31 Jul 2012 16:49:36 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2012/07/31/programmatically-adding-a-style-assumes-number-format-as-general/</guid>
      <description><![CDATA[&#160;  Hello All,  Few days back, I’ve seen an interesting scenario; If you add a “Style”...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>Hello All,</p>  <p>Few days back, I’ve seen an interesting scenario; If you add a “Style” programmatically, without specifying the number format as anything, it is assumed to be “General”. </p>  <p>Something like below is fine ..</p>  <pre class="csharpcode"><span class="kwrd">Imports</span> Excel = Microsoft.Office.Interop.Excel
<span class="kwrd">Public</span> <span class="kwrd">Class</span> Form1

    <span class="kwrd">Private</span> <span class="kwrd">Sub</span> Button1_Click(<span class="kwrd">ByVal</span> sender <span class="kwrd">As</span> System.<span class="kwrd">Object</span>, <span class="kwrd">ByVal</span> e <span class="kwrd">As</span> System.EventArgs) <span class="kwrd">Handles</span> Button1.Click
        <span class="kwrd">Dim</span> oXL <span class="kwrd">As</span> Excel.Application
        <span class="kwrd">Dim</span> oWB <span class="kwrd">As</span> Excel.Workbook
       

        <span class="kwrd">Dim</span> str <span class="kwrd">As</span> <span class="kwrd">String</span>

        str = <span class="str">&quot;SomeStyle&quot;</span>
        <span class="kwrd">Try</span>

            oXL = CreateObject(<span class="str">&quot;Excel.Application&quot;</span>)
            oXL.Visible = <span class="kwrd">True</span>

            <span class="rem">' Get a new workbook.</span>
            oWB = oXL.Workbooks.Add

            oXL.ActiveWorkbook.Styles.Add(str) <span class="rem">' Add a new style to the workbook</span>

            <span class="rem">'Define the style formatings</span>

            oXL.ActiveWorkbook.Styles(str).NumberFormat = <span class="str">&quot;#,##0.0&quot;</span> 
            <span class="kwrd">With</span> oXL.ActiveWorkbook.Styles(str).Font
                .Name = <span class="str">&quot;Times New Roman&quot;</span>
                .Size = 15
                .Bold = <span class="kwrd">True</span>
                .Italic = <span class="kwrd">True</span>   
                .Strikethrough = <span class="kwrd">False</span>   
            <span class="kwrd">End</span> <span class="kwrd">With</span>

            <span class="kwrd">With</span> oXL.ActiveWorkbook.Styles(str)
                .HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft
                .VerticalAlignment = Excel.XlVAlign.xlVAlignTop
                .WrapText = <span class="kwrd">False</span>
                .Orientation = 0
                .AddIndent = <span class="kwrd">False</span>
                .ShrinkToFit = <span class="kwrd">False</span>
                .IncludeBorder = <span class="kwrd">False</span>
            <span class="kwrd">End</span> <span class="kwrd">With</span>

        <span class="kwrd">Catch</span> ex <span class="kwrd">As</span> Exception
            MessageBox.Show(ex.Message.ToString())
        <span class="kwrd">End</span> <span class="kwrd">Try</span></pre>


<p>But if I comment out the line “.NumberFormat=”#,##0.0”, then the number format for “SomeStyle” is assumed to be “General”, which is .. well .. kind of fine in most cases. </p>

<p>Now, imagine a scenario, where you have a lot of different number formatting in different cells, (e.g. 9.7489900 is displayed as 9.74), and then if you apply a style, which has a “General” format, it would reset the number format back .. which means, now you have 9.7489900! I’m sure you won’t like it .. if you specifically omitted NumberFormating.</p>

<p>The only workaround I see is .. use something like below:</p>

<pre class="csharpcode">   <span class="kwrd">Public</span> <span class="kwrd">Sub</span> ApplyStyle(str <span class="kwrd">As</span> <span class="kwrd">String</span>)

        <span class="kwrd">Select</span> <span class="kwrd">Case</span> str
            <span class="kwrd">Case</span> <span class="str">&quot;Style1&quot;</span>
                <span class="kwrd">With</span> oXL.Selection.Font
                    .Name = <span class="str">&quot;Times New Roman&quot;</span>
                    .Color = Color.Blue
                    .Strikethrough = <span class="kwrd">False</span>
                <span class="kwrd">End</span> <span class="kwrd">With</span>

                <span class="kwrd">With</span> oXL.Selection
                    .HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft
                    .VerticalAlignment = Excel.XlVAlign.xlVAlignTop

                <span class="kwrd">End</span> <span class="kwrd">With</span>

            <span class="kwrd">Case</span> <span class="str">&quot;Style2&quot;</span>

                <span class="kwrd">With</span> oXL.Selection.Font
                    .Name = <span class="str">&quot;Times New Roman&quot;</span>
                    .Color = Color.Red
                    .Strikethrough = <span class="kwrd">False</span>
                <span class="kwrd">End</span> <span class="kwrd">With</span>

                <span class="kwrd">With</span> oXL.Selection

                    .HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft
                    .VerticalAlignment = Excel.XlVAlign.xlVAlignTop
                    .NumberFormat = <span class="str">&quot;General&quot;</span>

                    

                <span class="kwrd">End</span> <span class="kwrd">With</span>
        <span class="kwrd">End</span> <span class="kwrd">Select</span>

    <span class="kwrd">End</span> Sub</pre>


<p>In this scenario .. you don’t really apply a style to the Workbook, you just have the code which decides as to, what is to be done @ runtime.</p>

<p>Okay! Bye …</p>]]></content:encoded>
    </item>
    <item>
      <title>Dear readers - My Windows Phone 7 App is Live!</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/dear-readers-my-windows-phone-7-app-is-live</link>
      <pubDate>Tue, 03 Apr 2012 05:24:29 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2012/04/03/dear-readers-my-windows-phone-7-app-is-live/</guid>
      <description><![CDATA[&nbsp;
Hello All -
I hope all of you've been doing fine! fantastic! supperb! well .. I am here to...]]></description>
      <content:encoded><![CDATA[<p>&nbsp;</p>
<p>Hello All -</p>
<p>I hope all of you've been doing fine! fantastic! supperb! well .. I am here to give you one more reason to feel more fantastic! supperb! and more empowered!!</p>
<p>My Windows Phone 7 App is unveiled <a href="http://windowsphone.com/s?appid=7b8f683a-2dcf-47bb-8c9f-d3921250bcd0">http://windowsphone.com/s?appid=7b8f683a-2dcf-47bb-8c9f-d3921250bcd0</a>. It's called "Click Map".</p>
<p><span class="styleC">ClickMap is an answer of all of your questions like .. "Where did I park my car?", "Where is my "x" friend right now? Which place is he talking about? never heard of it ..", "This pic is fantastic .. where did I click it?", "One of my friend has a fantastic pic of a beach, but he doesn't remember which one .. how can we find it?"</span></p>
<p><span class="styleC">Please download it, use it .. give feedbacks! so that you get more goodness, and more love in the next version&nbsp;in the next version ..which is comming really really soon </span></p>
<p><span class="styleC"></span>&nbsp;</p>
<p><span class="styleC">Bye!</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Excel RTD Caching–Memory usage</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/excel-rtd-cachingmemory-usage</link>
      <pubDate>Fri, 30 Sep 2011 13:24:26 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2011/09/30/excel-rtd-cachingmemory-usage/</guid>
      <description><![CDATA[&#160;  Microsoft Office Excel provides a worksheet function, RealTimeData (RTD). This function...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>Microsoft Office Excel provides a worksheet function, RealTimeData (RTD). This function enables you to call a Component Object Model (COM) Automation server&#160; provides you with a way to view and update data in real time. This real-time data (RTD) feature is great for working with constantly-changing data such as stock quotes, currency exchange rates, inventory levels, price quotes, weather information, sports scores, and so on.</p>  <p>To achieve high performance in such time critical scenarios, Excel has chosen to cache RTD topics related data structures at the application level (viz. they will be cached till the application lifetime). Though this offers the performance which is needed for real time scenarios, but as you can imagine, this does have an impact on the Excel memory usage in some scenarios, for example </p>  <p>1)&#160; When you are using Excel RTD with dynamic “topics”</p>  <p>2) You may encounter same thing, if you happen to open multiple workbooks with large number unique RTD topics</p>  <p>In both of these scenarios, if you happen to consume total addressable heap memory for that particular architecture, you may get error like “Out of virtual memory” or “There is not enough memory to complete the operation” etc. or even a crash.</p>  <p>If you are running into any of the above scenario, the way to move forward is to close excel instance when there is a significant memory pressure. </p>  <p>More about RTD Servers:</p>  <p><a href="http://msdn.microsoft.com/en-us/library/aa140059(v=office.10).aspx">Building a Real-Time Data Server in Excel 2002</a>     <br /><a href="http://support.microsoft.com/kb/289150">How to set up and use the RTD function in Excel</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Manipulating Office document contents – On Steroids!</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/manipulating-office-document-contents-on-steroids</link>
      <pubDate>Mon, 20 Jun 2011 00:29:00 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2011/06/20/manipulating-office-document-contents-on-steroids/</guid>
      <description><![CDATA[Yes, after a long time&nbsp; .. sorry, whatever .. let&rsquo;s not spend time on reasons. Not going...]]></description>
      <content:encoded><![CDATA[<p>Yes, after a long time&nbsp; .. sorry, whatever .. let&rsquo;s not spend time on reasons. Not going to help anyone &hellip; <img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/52/80/metablogapi/6014.wlEmoticon-smile_2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-52-80-metablogapi/6014.wlEmoticon_2D00_smile_5F00_2.png" /></p>
<p>&nbsp;</p>
<p>Here is the new story: How many time did you try manipulating document contents (for example adding something .. removing something etc), and the perf wasn&rsquo;t something that you really expected. I&rsquo;ve been there, part of the reason is: generally when things work great, I don&rsquo;t get to see them <img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/52/80/metablogapi/6014.wlEmoticon-smile_2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-52-80-metablogapi/6014.wlEmoticon_2D00_smile_5F00_2.png" /></p>
<p>While working on an issue, I came across a way to manipulate Office documents with a great performance &ndash; OpenXML: Yes, I know what are you thinking, because I thought the same thing &ndash; &ldquo;How on earth can you use OpenXML to manipulate a loaded document!! you can&rsquo;t even open it with OpenXML SDK!!&rdquo;.&nbsp; The answer lies in one of my previous post <a href="http://blogs.msdn.com/b/pranavwagh/archive/2008/05/08/word-2007-save-as-word-xml-document-and-back-without-automation-1.aspx">where I talked about FlatOPC</a>, (not explicitly though). I am using the same thing for document manipulation. The core idea is -</p>
<ol>
<li>Get &ldquo;System.IO.Packaging.Package&rdquo;&nbsp; stream for the document</li>
<li>Open it using OpenXML SDK (Yes! you can open memory stream using OpenXML SDK)</li>
<li>Convert it to FlatOPC</li>
<li>Manipulate whatever you want ..</li>
<li>Use InsertXML to insert it back to the document</li>
</ol>
<p>Now, this is the idea &ndash; how to use it, is left to your imagination. Though I have already built a reusable library that you can use for achieving the same results without bothering what&rsquo;s going on under the hoods, but it&rsquo;s still in need of a good plugin system. But, you&rsquo;ll get it for sure</p>
<p>Below is one example of what are the things that you can achieve using this: In this example I am removing all the &ldquo;Editors&rdquo; from the document (because having a lot of editors might mean, a lot of network calls)</p>
<div class="csharpcode">
<pre><span class="lnum"> 1: </span>      <span class="kwrd">private</span> <span class="kwrd">void</span> button1_Click(<span class="kwrd">object</span> sender, RibbonControlEventArgs e)</pre>
<pre><span class="lnum"> 2: </span>        {</pre>
<pre><span class="lnum"> 3: </span>            wdApp.ScreenUpdating = <span class="kwrd">false</span>;</pre>
<pre><span class="lnum"> 4: </span>            wdApp.ActiveDocument.Content.Select();</pre>
<pre><span class="lnum"> 5: </span>            <span class="kwrd">string</span> openxml = <span class="kwrd">string</span>.Empty;</pre>
<pre><span class="lnum"> 6: </span>&nbsp;</pre>
<pre><span class="lnum"> 7: </span>            <span class="rem">//Get stream for the range. This is the System.IO.Packaging.Package stream</span></pre>
<pre><span class="lnum"> 8: </span>            Stream packageStream = OpcHelper.GetPackageStreamFromRange(wdApp.Selection.Range);</pre>
<pre><span class="lnum"> 9: </span>&nbsp;</pre>
<pre><span class="lnum"> 10: </span>            <span class="rem">//Stream packageStream = this.Paragraphs[1].Range.GetPackageStreamFromRange();</span></pre>
<pre><span class="lnum"> 11: </span>            <span class="rem">//Use Open Xml SDK to process it.</span></pre>
<pre><span class="lnum"> 12: </span>            <span class="kwrd">using</span> (WordprocessingDocument wordDoc = WordprocessingDocument.Open(packageStream, <span class="kwrd">true</span>))</pre>
<pre><span class="lnum"> 13: </span>            {</pre>
<pre><span class="lnum"> 14: </span>                <span class="rem">//Convert to flat opc using this in-memory package</span></pre>
<pre><span class="lnum"> 15: </span>                XDocument xDoc = OpcHelper.OpcToFlatOpc(wordDoc.Package);</pre>
<pre><span class="lnum"> 16: </span>&nbsp;</pre>
<pre><span class="lnum"> 17: </span>                XmlNamespaceManager xnm = <span class="kwrd">new</span> XmlNamespaceManager(xDoc.CreateReader().NameTable);</pre>
<pre><span class="lnum"> 18: </span>                xnm.AddNamespace(<span class="str">"w"</span>, <span class="str">"http://schemas.openxmlformats.org/wordprocessingml/2006/main"</span>);</pre>
<pre><span class="lnum"> 19: </span>&nbsp;</pre>
<pre><span class="lnum"> 20: </span>                xDoc.XPathSelectElements(<span class="str">"//w:permStart"</span>, xnm).ToList().ForEach(a =&gt; a.Remove());</pre>
<pre><span class="lnum"> 21: </span>                xDoc.XPathSelectElements(<span class="str">"//w:permEnd"</span>, xnm).ToList().ForEach(a =&gt; a.Remove());</pre>
<pre><span class="lnum"> 22: </span>&nbsp;</pre>
<pre><span class="lnum"> 23: </span>                openxml = xDoc.ToString();</pre>
<pre><span class="lnum"> 24: </span>            }</pre>
<pre><span class="lnum"> 25: </span>&nbsp;</pre>
<pre><span class="lnum"> 26: </span>            </pre>
<pre><span class="lnum"> 27: </span>&nbsp;</pre>
<pre><span class="lnum"> 28: </span>            <span class="rem">//Insert this flat opc Xml</span></pre>
<pre><span class="lnum"> 29: </span>            wdApp.ActiveDocument.Select();</pre>
<pre><span class="lnum"> 30: </span>&nbsp;</pre>
<pre><span class="lnum"> 31: </span>            <span class="kwrd">try</span></pre>
<pre><span class="lnum"> 32: </span>            {</pre>
<pre><span class="lnum"> 33: </span>                <span class="kwrd">object</span> nullstring = <span class="str">""</span>;</pre>
<pre><span class="lnum"> 34: </span>                wdApp.ActiveDocument.Unprotect(<span class="kwrd">ref</span> nullstring);</pre>
<pre><span class="lnum"> 35: </span>            }</pre>
<pre><span class="lnum"> 36: </span>            <span class="kwrd">catch</span> (Exception)</pre>
<pre><span class="lnum"> 37: </span>            {</pre>
<pre><span class="lnum"> 38: </span>                <span class="kwrd">throw</span>;</pre>
<pre><span class="lnum"> 39: </span>            }</pre>
<pre><span class="lnum"> 40: </span>&nbsp;</pre>
<pre><span class="lnum"> 41: </span>&nbsp;</pre>
<pre><span class="lnum"> 42: </span>            wdApp.Selection.Range.InsertXML(openxml, <span class="kwrd">ref</span> missing);</pre>
<pre><span class="lnum"> 43: </span>            wdApp.ScreenUpdating = <span class="kwrd">true</span>;</pre>
<pre><span class="lnum"> 44: </span>        }</pre>
</div>
<p>Now, I am sure you are looking for explanation for some of the things here .. which I would do surely: but in the next post. This one is for you to figure out what&rsquo;s happening <img style="border-style: none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/52/80/metablogapi/6014.wlEmoticon-smile_2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-52-80-metablogapi/6014.wlEmoticon_2D00_smile_5F00_2.png" /> . But, don&rsquo;t worry, I am not going to throw you in the dark &ndash; Below is OpcHelper that is being used:</p>
<p>&nbsp;</p>
<div class="csharpcode">
<pre><span class="lnum"> 1: </span><span class="kwrd">using</span> System;</pre>
<pre><span class="lnum"> 2: </span><span class="kwrd">using</span> System.IO;</pre>
<pre><span class="lnum"> 3: </span><span class="kwrd">using</span> System.IO.Packaging;</pre>
<pre><span class="lnum"> 4: </span><span class="kwrd">using</span> System.Linq;</pre>
<pre><span class="lnum"> 5: </span><span class="kwrd">using</span> System.Text;</pre>
<pre><span class="lnum"> 6: </span><span class="kwrd">using</span> System.Xml;</pre>
<pre><span class="lnum"> 7: </span><span class="kwrd">using</span> System.Xml.Linq;</pre>
<pre><span class="lnum"> 8: </span><span class="kwrd">using</span> Microsoft.Office.Interop.Word;</pre>
<pre><span class="lnum"> 9: </span>&nbsp;</pre>
<pre><span class="lnum"> 10: </span>&nbsp;</pre>
<pre><span class="lnum"> 11: </span><span class="kwrd">namespace</span> WordAddIn2</pre>
<pre><span class="lnum"> 12: </span>{</pre>
<pre><span class="lnum"> 13: </span>    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">class</span> OpcHelper</pre>
<pre><span class="lnum"> 14: </span>    {</pre>
<pre><span class="lnum"> 15: </span>    <span class="rem">/// &lt;summary&gt;</span></pre>
<pre><span class="lnum"> 16: </span>    <span class="rem">/// Returns the part contents in xml</span></pre>
<pre><span class="lnum"> 17: </span>    <span class="rem">/// &lt;/summary&gt;</span></pre>
<pre><span class="lnum"> 18: </span>    <span class="rem">/// &lt;param name="part"&gt;System.IO.Packaging.Packagepart&lt;/param&gt;</span></pre>
<pre><span class="lnum"> 19: </span>    <span class="rem">/// &lt;returns&gt;&lt;/returns&gt;</span></pre>
<pre><span class="lnum"> 20: </span>    <span class="kwrd">static</span> XElement GetContentsAsXml(PackagePart part)</pre>
<pre><span class="lnum"> 21: </span>    {</pre>
<pre><span class="lnum"> 22: </span>        XNamespace pkg = </pre>
<pre><span class="lnum"> 23: </span>           <span class="str">"http://schemas.microsoft.com/office/2006/xmlPackage"</span>;</pre>
<pre><span class="lnum"> 24: </span>        <span class="kwrd">if</span> (part.ContentType.EndsWith(<span class="str">"xml"</span>))</pre>
<pre><span class="lnum"> 25: </span>        {</pre>
<pre><span class="lnum"> 26: </span>            <span class="kwrd">using</span> (Stream partstream = part.GetStream())</pre>
<pre><span class="lnum"> 27: </span>            <span class="kwrd">using</span> (StreamReader streamReader = <span class="kwrd">new</span> StreamReader(partstream))</pre>
<pre><span class="lnum"> 28: </span>            {</pre>
<pre><span class="lnum"> 29: </span>                <span class="kwrd">string</span> streamString = streamReader.ReadToEnd();</pre>
<pre><span class="lnum"> 30: </span>                XElement newXElement = </pre>
<pre><span class="lnum"> 31: </span>                    <span class="kwrd">new</span> XElement(pkg + <span class="str">"part"</span>, <span class="kwrd">new</span> XAttribute(pkg + <span class="str">"name"</span>, part.Uri), </pre>
<pre><span class="lnum"> 32: </span>                        <span class="kwrd">new</span> XAttribute(pkg + <span class="str">"contentType"</span>, part.ContentType), </pre>
<pre><span class="lnum"> 33: </span>                        <span class="kwrd">new</span> XElement(pkg + <span class="str">"xmlData"</span>, XElement.Parse(streamString)));</pre>
<pre><span class="lnum"> 34: </span>                <span class="kwrd">return</span> newXElement;</pre>
<pre><span class="lnum"> 35: </span>            }</pre>
<pre><span class="lnum"> 36: </span>         }</pre>
<pre><span class="lnum"> 37: </span>        <span class="kwrd">else</span></pre>
<pre><span class="lnum"> 38: </span>        {</pre>
<pre><span class="lnum"> 39: </span>            <span class="kwrd">using</span> (Stream str = part.GetStream())</pre>
<pre><span class="lnum"> 40: </span>            <span class="kwrd">using</span> (BinaryReader binaryReader = <span class="kwrd">new</span> BinaryReader(str))</pre>
<pre><span class="lnum"> 41: </span>            {</pre>
<pre><span class="lnum"> 42: </span>                <span class="kwrd">int</span> len = (<span class="kwrd">int</span>)binaryReader.BaseStream.Length;</pre>
<pre><span class="lnum"> 43: </span>                <span class="kwrd">byte</span>[] byteArray = binaryReader.ReadBytes(len);</pre>
<pre><span class="lnum"> 44: </span>                <span class="rem">// the following expression creates the base64String, then chunks</span></pre>
<pre><span class="lnum"> 45: </span>                <span class="rem">// it to lines of 76 characters long</span></pre>
<pre><span class="lnum"> 46: </span>                <span class="kwrd">string</span> base64String = (System.Convert.ToBase64String(byteArray))</pre>
<pre><span class="lnum"> 47: </span>                    .Select</pre>
<pre><span class="lnum"> 48: </span>                    (</pre>
<pre><span class="lnum"> 49: </span>                        (c, i) =&gt; <span class="kwrd">new</span></pre>
<pre><span class="lnum"> 50: </span>                        {</pre>
<pre><span class="lnum"> 51: </span>                            Character = c,</pre>
<pre><span class="lnum"> 52: </span>                            Chunk = i / 76</pre>
<pre><span class="lnum"> 53: </span>                        }</pre>
<pre><span class="lnum"> 54: </span>                    )</pre>
<pre><span class="lnum"> 55: </span>                    .GroupBy(c =&gt; c.Chunk)</pre>
<pre><span class="lnum"> 56: </span>                    .Aggregate(</pre>
<pre><span class="lnum"> 57: </span>                        <span class="kwrd">new</span> StringBuilder(),</pre>
<pre><span class="lnum"> 58: </span>                        (s, i) =&gt;</pre>
<pre><span class="lnum"> 59: </span>                            s.Append(</pre>
<pre><span class="lnum"> 60: </span>                                i.Aggregate(</pre>
<pre><span class="lnum"> 61: </span>                                    <span class="kwrd">new</span> StringBuilder(),</pre>
<pre><span class="lnum"> 62: </span>                                    (seed, it) =&gt; seed.Append(it.Character),</pre>
<pre><span class="lnum"> 63: </span>                                    sb =&gt; sb.ToString()</pre>
<pre><span class="lnum"> 64: </span>                                )</pre>
<pre><span class="lnum"> 65: </span>                            )</pre>
<pre><span class="lnum"> 66: </span>                            .Append(Environment.NewLine),</pre>
<pre><span class="lnum"> 67: </span>                        s =&gt; s.ToString()</pre>
<pre><span class="lnum"> 68: </span>                    );</pre>
<pre><span class="lnum"> 69: </span>&nbsp;</pre>
<pre><span class="lnum"> 70: </span>                <span class="kwrd">return</span> <span class="kwrd">new</span> XElement(pkg + <span class="str">"part"</span>,</pre>
<pre><span class="lnum"> 71: </span>                    <span class="kwrd">new</span> XAttribute(pkg + <span class="str">"name"</span>, part.Uri),</pre>
<pre><span class="lnum"> 72: </span>                    <span class="kwrd">new</span> XAttribute(pkg + <span class="str">"contentType"</span>, part.ContentType),</pre>
<pre><span class="lnum"> 73: </span>                    <span class="kwrd">new</span> XAttribute(pkg + <span class="str">"compression"</span>, <span class="str">"store"</span>),</pre>
<pre><span class="lnum"> 74: </span>                    <span class="kwrd">new</span> XElement(pkg + <span class="str">"binaryData"</span>, base64String)</pre>
<pre><span class="lnum"> 75: </span>                );</pre>
<pre><span class="lnum"> 76: </span>            }</pre>
<pre><span class="lnum"> 77: </span>        }</pre>
<pre><span class="lnum"> 78: </span>    }</pre>
<pre><span class="lnum"> 79: </span>    <span class="rem">/// &lt;summary&gt;</span></pre>
<pre><span class="lnum"> 80: </span>    <span class="rem">/// Returns an XDocument</span></pre>
<pre><span class="lnum"> 81: </span>    <span class="rem">/// &lt;/summary&gt;</span></pre>
<pre><span class="lnum"> 82: </span>    <span class="rem">/// &lt;param name="package"&gt;System.IO.Packaging.Package&lt;/param&gt;</span></pre>
<pre><span class="lnum"> 83: </span>    <span class="rem">/// &lt;returns&gt;&lt;/returns&gt;</span></pre>
<pre><span class="lnum"> 84: </span>    <span class="kwrd">public</span> <span class="kwrd">static</span> XDocument OpcToFlatOpc(Package package)</pre>
<pre><span class="lnum"> 85: </span>    {</pre>
<pre><span class="lnum"> 86: </span>        XNamespace </pre>
<pre><span class="lnum"> 87: </span>            pkg = <span class="str">"http://schemas.microsoft.com/office/2006/xmlPackage"</span>;</pre>
<pre><span class="lnum"> 88: </span>        XDeclaration </pre>
<pre><span class="lnum"> 89: </span>            declaration = <span class="kwrd">new</span> XDeclaration(<span class="str">"1.0"</span>, <span class="str">"UTF-8"</span>, <span class="str">"yes"</span>);</pre>
<pre><span class="lnum"> 90: </span>        XDocument doc = <span class="kwrd">new</span> XDocument(</pre>
<pre><span class="lnum"> 91: </span>            declaration,</pre>
<pre><span class="lnum"> 92: </span>            <span class="kwrd">new</span> XProcessingInstruction(<span class="str">"mso-application"</span>, <span class="str">"progid=\"Word.Document\""</span>),</pre>
<pre><span class="lnum"> 93: </span>            <span class="kwrd">new</span> XElement(pkg + <span class="str">"package"</span>,</pre>
<pre><span class="lnum"> 94: </span>                <span class="kwrd">new</span> XAttribute(XNamespace.Xmlns + <span class="str">"pkg"</span>, pkg.ToString()),</pre>
<pre><span class="lnum"> 95: </span>                package.GetParts().Select(part =&gt; GetContentsAsXml(part))</pre>
<pre><span class="lnum"> 96: </span>            )</pre>
<pre><span class="lnum"> 97: </span>        );</pre>
<pre><span class="lnum"> 98: </span>        <span class="kwrd">return</span> doc;</pre>
<pre><span class="lnum"> 99: </span>    }</pre>
<pre><span class="lnum"> 100: </span>    <span class="rem">/// &lt;summary&gt;</span></pre>
<pre><span class="lnum"> 101: </span>    <span class="rem">/// Returns a System.IO.Packaging.Package stream for the given range.</span></pre>
<pre><span class="lnum"> 102: </span>    <span class="rem">/// &lt;/summary&gt;</span></pre>
<pre><span class="lnum"> 103: </span>    <span class="rem">/// &lt;param name="range"&gt;Range in word document&lt;/param&gt;</span></pre>
<pre><span class="lnum"> 104: </span>    <span class="rem">/// &lt;returns&gt;&lt;/returns&gt;</span></pre>
<pre><span class="lnum"> 105: </span>    <span class="kwrd">public</span> <span class="kwrd">static</span> Stream GetPackageStreamFromRange(Range range)</pre>
<pre><span class="lnum"> 106: </span>    {</pre>
<pre><span class="lnum"> 107: </span>        XDocument doc = XDocument.Parse(range.WordOpenXML);</pre>
<pre><span class="lnum"> 108: </span>        XNamespace pkg =</pre>
<pre><span class="lnum"> 109: </span>           <span class="str">"http://schemas.microsoft.com/office/2006/xmlPackage"</span>;</pre>
<pre><span class="lnum"> 110: </span>        XNamespace rel =</pre>
<pre><span class="lnum"> 111: </span>            <span class="str">"http://schemas.openxmlformats.org/package/2006/relationships"</span>;</pre>
<pre><span class="lnum"> 112: </span>        Package InmemoryPackage = <span class="kwrd">null</span>;</pre>
<pre><span class="lnum"> 113: </span>        MemoryStream memStream = <span class="kwrd">new</span> MemoryStream();</pre>
<pre><span class="lnum"> 114: </span>        <span class="kwrd">using</span> (InmemoryPackage = Package.Open(memStream, FileMode.Create))</pre>
<pre><span class="lnum"> 115: </span>        {</pre>
<pre><span class="lnum"> 116: </span>            <span class="rem">// add all parts (but not relationships)</span></pre>
<pre><span class="lnum"> 117: </span>            <span class="kwrd">foreach</span> (var xmlPart <span class="kwrd">in</span> doc.Root</pre>
<pre><span class="lnum"> 118: </span>                .Elements()</pre>
<pre><span class="lnum"> 119: </span>                .Where(p =&gt;</pre>
<pre><span class="lnum"> 120: </span>                    (<span class="kwrd">string</span>)p.Attribute(pkg + <span class="str">"contentType"</span>) !=</pre>
<pre><span class="lnum"> 121: </span>                    <span class="str">"application/vnd.openxmlformats-package.relationships+xml"</span>))</pre>
<pre><span class="lnum"> 122: </span>            {</pre>
<pre><span class="lnum"> 123: </span>                <span class="kwrd">string</span> name = (<span class="kwrd">string</span>)xmlPart.Attribute(pkg + <span class="str">"name"</span>);</pre>
<pre><span class="lnum"> 124: </span>                <span class="kwrd">string</span> contentType = (<span class="kwrd">string</span>)xmlPart.Attribute(pkg + <span class="str">"contentType"</span>);</pre>
<pre><span class="lnum"> 125: </span>                <span class="kwrd">if</span> (contentType.EndsWith(<span class="str">"xml"</span>))</pre>
<pre><span class="lnum"> 126: </span>                {</pre>
<pre><span class="lnum"> 127: </span>                    Uri u = <span class="kwrd">new</span> Uri(name, UriKind.Relative);</pre>
<pre><span class="lnum"> 128: </span>                    PackagePart part = InmemoryPackage.CreatePart(u, contentType,</pre>
<pre><span class="lnum"> 129: </span>                        CompressionOption.SuperFast);</pre>
<pre><span class="lnum"> 130: </span>                    <span class="kwrd">using</span> (Stream str = part.GetStream(FileMode.Create))</pre>
<pre><span class="lnum"> 131: </span>                    <span class="kwrd">using</span> (XmlWriter xmlWriter = XmlWriter.Create(str))</pre>
<pre><span class="lnum"> 132: </span>                        xmlPart.Element(pkg + <span class="str">"xmlData"</span>)</pre>
<pre><span class="lnum"> 133: </span>                            .Elements()</pre>
<pre><span class="lnum"> 134: </span>                            .First()</pre>
<pre><span class="lnum"> 135: </span>                            .WriteTo(xmlWriter);</pre>
<pre><span class="lnum"> 136: </span>                }</pre>
<pre><span class="lnum"> 137: </span>                <span class="kwrd">else</span></pre>
<pre><span class="lnum"> 138: </span>                {</pre>
<pre><span class="lnum"> 139: </span>                    Uri u = <span class="kwrd">new</span> Uri(name, UriKind.Relative);</pre>
<pre><span class="lnum"> 140: </span>                    PackagePart part = InmemoryPackage.CreatePart(u, contentType,</pre>
<pre><span class="lnum"> 141: </span>                        CompressionOption.SuperFast);</pre>
<pre><span class="lnum"> 142: </span>                    <span class="kwrd">using</span> (Stream str = part.GetStream(FileMode.Create))</pre>
<pre><span class="lnum"> 143: </span>                    <span class="kwrd">using</span> (BinaryWriter binaryWriter = <span class="kwrd">new</span> BinaryWriter(str))</pre>
<pre><span class="lnum"> 144: </span>                    {</pre>
<pre><span class="lnum"> 145: </span>                        <span class="kwrd">string</span> base64StringInChunks =</pre>
<pre><span class="lnum"> 146: </span>                       (<span class="kwrd">string</span>)xmlPart.Element(pkg + <span class="str">"binaryData"</span>);</pre>
<pre><span class="lnum"> 147: </span>                        <span class="kwrd">char</span>[] base64CharArray = base64StringInChunks</pre>
<pre><span class="lnum"> 148: </span>                            .Where(c =&gt; c != <span class="str">'\r'</span> &amp;&amp; c != <span class="str">'\n'</span>).ToArray();</pre>
<pre><span class="lnum"> 149: </span>                        <span class="kwrd">byte</span>[] byteArray =</pre>
<pre><span class="lnum"> 150: </span>                            System.Convert.FromBase64CharArray(base64CharArray,</pre>
<pre><span class="lnum"> 151: </span>                            0, base64CharArray.Length);</pre>
<pre><span class="lnum"> 152: </span>                        binaryWriter.Write(byteArray);</pre>
<pre><span class="lnum"> 153: </span>                    }</pre>
<pre><span class="lnum"> 154: </span>                }</pre>
<pre><span class="lnum"> 155: </span>            }</pre>
<pre><span class="lnum"> 156: </span>            <span class="kwrd">foreach</span> (var xmlPart <span class="kwrd">in</span> doc.Root.Elements())</pre>
<pre><span class="lnum"> 157: </span>            {</pre>
<pre><span class="lnum"> 158: </span>                <span class="kwrd">string</span> name = (<span class="kwrd">string</span>)xmlPart.Attribute(pkg + <span class="str">"name"</span>);</pre>
<pre><span class="lnum"> 159: </span>                <span class="kwrd">string</span> contentType = (<span class="kwrd">string</span>)xmlPart.Attribute(pkg + <span class="str">"contentType"</span>);</pre>
<pre><span class="lnum"> 160: </span>                <span class="kwrd">if</span> (contentType ==</pre>
<pre><span class="lnum"> 161: </span>                    <span class="str">"application/vnd.openxmlformats-package.relationships+xml"</span>)</pre>
<pre><span class="lnum"> 162: </span>                {</pre>
<pre><span class="lnum"> 163: </span>                    <span class="rem">// add the package level relationships</span></pre>
<pre><span class="lnum"> 164: </span>                    <span class="kwrd">if</span> (name == <span class="str">"/_rels/.rels"</span>)</pre>
<pre><span class="lnum"> 165: </span>                    {</pre>
<pre><span class="lnum"> 166: </span>                        <span class="kwrd">foreach</span> (XElement xmlRel <span class="kwrd">in</span></pre>
<pre><span class="lnum"> 167: </span>                            xmlPart.Descendants(rel + <span class="str">"Relationship"</span>))</pre>
<pre><span class="lnum"> 168: </span>                        {</pre>
<pre><span class="lnum"> 169: </span>                            <span class="kwrd">string</span> id = (<span class="kwrd">string</span>)xmlRel.Attribute(<span class="str">"Id"</span>);</pre>
<pre><span class="lnum"> 170: </span>                            <span class="kwrd">string</span> type = (<span class="kwrd">string</span>)xmlRel.Attribute(<span class="str">"Type"</span>);</pre>
<pre><span class="lnum"> 171: </span>                            <span class="kwrd">string</span> target = (<span class="kwrd">string</span>)xmlRel.Attribute(<span class="str">"Target"</span>);</pre>
<pre><span class="lnum"> 172: </span>                            <span class="kwrd">string</span> targetMode =</pre>
<pre><span class="lnum"> 173: </span>                                (<span class="kwrd">string</span>)xmlRel.Attribute(<span class="str">"TargetMode"</span>);</pre>
<pre><span class="lnum"> 174: </span>                            <span class="kwrd">if</span> (targetMode == <span class="str">"External"</span>)</pre>
<pre><span class="lnum"> 175: </span>                                InmemoryPackage.CreateRelationship(</pre>
<pre><span class="lnum"> 176: </span>                                    <span class="kwrd">new</span> Uri(target, UriKind.Absolute),</pre>
<pre><span class="lnum"> 177: </span>                                    TargetMode.External, type, id);</pre>
<pre><span class="lnum"> 178: </span>                            <span class="kwrd">else</span></pre>
<pre><span class="lnum"> 179: </span>                                InmemoryPackage.CreateRelationship(</pre>
<pre><span class="lnum"> 180: </span>                                    <span class="kwrd">new</span> Uri(target, UriKind.Relative),</pre>
<pre><span class="lnum"> 181: </span>                                    TargetMode.Internal, type, id);</pre>
<pre><span class="lnum"> 182: </span>                        }</pre>
<pre><span class="lnum"> 183: </span>                    }</pre>
<pre><span class="lnum"> 184: </span>                    <span class="kwrd">else</span></pre>
<pre><span class="lnum"> 185: </span>                    <span class="rem">// add part level relationships</span></pre>
<pre><span class="lnum"> 186: </span>                    {</pre>
<pre><span class="lnum"> 187: </span>                        <span class="kwrd">string</span> directory = name.Substring(0, name.IndexOf(<span class="str">"/_rels"</span>));</pre>
<pre><span class="lnum"> 188: </span>                        <span class="kwrd">string</span> relsFilename = name.Substring(name.LastIndexOf(<span class="str">'/'</span>));</pre>
<pre><span class="lnum"> 189: </span>                        <span class="kwrd">string</span> filename =</pre>
<pre><span class="lnum"> 190: </span>                            relsFilename.Substring(0, relsFilename.IndexOf(<span class="str">".rels"</span>));</pre>
<pre><span class="lnum"> 191: </span>                        PackagePart fromPart = InmemoryPackage.GetPart(</pre>
<pre><span class="lnum"> 192: </span>                            <span class="kwrd">new</span> Uri(directory + filename, UriKind.Relative));</pre>
<pre><span class="lnum"> 193: </span>                        <span class="kwrd">foreach</span> (XElement xmlRel <span class="kwrd">in</span></pre>
<pre><span class="lnum"> 194: </span>                            xmlPart.Descendants(rel + <span class="str">"Relationship"</span>))</pre>
<pre><span class="lnum"> 195: </span>                        {</pre>
<pre><span class="lnum"> 196: </span>                            <span class="kwrd">string</span> id = (<span class="kwrd">string</span>)xmlRel.Attribute(<span class="str">"Id"</span>);</pre>
<pre><span class="lnum"> 197: </span>                            <span class="kwrd">string</span> type = (<span class="kwrd">string</span>)xmlRel.Attribute(<span class="str">"Type"</span>);</pre>
<pre><span class="lnum"> 198: </span>                            <span class="kwrd">string</span> target = (<span class="kwrd">string</span>)xmlRel.Attribute(<span class="str">"Target"</span>);</pre>
<pre><span class="lnum"> 199: </span>                            <span class="kwrd">string</span> targetMode =</pre>
<pre><span class="lnum"> 200: </span>                                (<span class="kwrd">string</span>)xmlRel.Attribute(<span class="str">"TargetMode"</span>);</pre>
<pre><span class="lnum"> 201: </span>                            <span class="kwrd">if</span> (targetMode == <span class="str">"External"</span>)</pre>
<pre><span class="lnum"> 202: </span>                                fromPart.CreateRelationship(</pre>
<pre><span class="lnum"> 203: </span>                                    <span class="kwrd">new</span> Uri(target, UriKind.Absolute),</pre>
<pre><span class="lnum"> 204: </span>                                    TargetMode.External, type, id);</pre>
<pre><span class="lnum"> 205: </span>                            <span class="kwrd">else</span></pre>
<pre><span class="lnum"> 206: </span>                                fromPart.CreateRelationship(</pre>
<pre><span class="lnum"> 207: </span>                                    <span class="kwrd">new</span> Uri(target, UriKind.Relative),</pre>
<pre><span class="lnum"> 208: </span>                                    TargetMode.Internal, type, id);</pre>
<pre><span class="lnum"> 209: </span>                        }</pre>
<pre><span class="lnum"> 210: </span>                    }</pre>
<pre><span class="lnum"> 211: </span>                }</pre>
<pre><span class="lnum"> 212: </span>            }</pre>
<pre><span class="lnum"> 213: </span>            InmemoryPackage.Flush();</pre>
<pre><span class="lnum"> 214: </span>        }</pre>
<pre><span class="lnum"> 215: </span>        <span class="kwrd">return</span> memStream;</pre>
<pre><span class="lnum"> 216: </span>    }</pre>
<pre><span class="lnum"> 217: </span>}</pre>
<pre><span class="lnum"> 218: </span>}</pre>
</div>
<p>Stay tuned for the next set of entries where I&rsquo;d attempt to explains some of the things that we&rsquo;ve used here &ndash; and we&rsquo;d have a full fledged library (which supports addins &ndash; and you&rsquo;ll be able to do the contribution)</p>]]></content:encoded>
    </item>
    <item>
      <title>How to find all the strings in the thread stack?</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/how-to-find-all-the-strings-in-the-thread-stack</link>
      <pubDate>Wed, 07 Apr 2010 08:23:32 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2010/04/07/how-to-find-all-the-strings-in-the-thread-stack/</guid>
      <description><![CDATA[To find the all the strings in the thread stack, you’ll need to know about a few things before we...]]></description>
      <content:encoded><![CDATA[<p>To find the all the strings in the thread stack, you’ll need to know about a few things before we jump into code, in windbg there is something called as pseudo registers, and they are very handy to use, one of them is “$csp”, This is the current call stack pointer. This pointer is the register that is most representative of call stack depth; then there is something known as $teb, this points to thread environment block and poi(@$teb+4) always points to the stack base. You can also confirm it using !teb</p>  <p>Here is the output:</p>  <p><font size="2" face="Courier New">0:002&gt; ?poi(@$teb+4)      <br /><strong><font color="#ff0000">Evaluate expression: 40566784 = 026b0000</font></strong>       <br />0:002&gt; !teb       <br />TEB at 7ffda000       <br />&#160;&#160;&#160; ExceptionList:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 026affdc       <br />&#160; </font><font size="2"><font face="Courier New"><strong><font color="#ff0000">&#160; StackBase:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 026b0000            <br /></font></strong>&#160;&#160;&#160; StackLimit:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 026af000         <br />&#160;&#160;&#160; SubSystemTib:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 00000000         <br />&#160;&#160;&#160; FiberData:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 00001e00         <br />&#160;&#160;&#160; ArbitraryUserPointer: 00000000         <br />&#160;&#160;&#160; Self:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 7ffda000         <br />&#160;&#160;&#160; EnvironmentPointer:&#160;&#160; 00000000         <br />&#160;&#160;&#160; ClientId:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 00000c70 . 00000c90         <br />&#160;&#160;&#160; RpcHandle:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 00000000         <br />&#160;&#160;&#160; Tls Storage:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0023db88         <br />&#160;&#160;&#160; PEB Address:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 7ffd4000         <br />&#160;&#160;&#160; LastErrorValue:&#160;&#160;&#160;&#160;&#160;&#160; 1008         <br />&#160;&#160;&#160; LastStatusValue:&#160;&#160;&#160;&#160;&#160; c000007c         <br />&#160;&#160;&#160; Count Owned Locks:&#160;&#160;&#160; 0         <br />&#160;&#160;&#160; HardErrorMode:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0</font></font></p>  <p><font size="2" face="Courier New"></font></p>  <p><font size="2" face="Courier New">Now, there are a few more things to know, which would be pretty clearer after seeing the code.</font></p>  <p><font size="2" face="Courier New">1) You can set the value of an inbuilt alias using “r &lt;alias_name&gt; =” notation (e.g. r@$t0 = 2, sets the value of inuilt alias $t0 to 2)     <br />2) “s” is a command to search strings, use –su or –sa to look for unicode or ascii strings respectively. @$t0 and @$t1 tells the command to search in the range starting from the value of @$t0 and ending at @$t1</font></p>  <p>Using the above concepts, you can easily construct the command below easily.</p>  <p>r @$t0=@$csp;r @$t1=poi(@$teb+4);s- sa @$t0 @$t1    <br />r @$t0=@$csp;r @$t1=poi(@$teb+4);s- su @$t0 @$t1</p>  <p>&#160;</p>  <p>Bye, got to get back to my work ..</p>]]></content:encoded>
    </item>
    <item>
      <title>Blog maintenance going on …</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/blog-maintenance-going-on</link>
      <pubDate>Thu, 28 Jan 2010 09:06:00 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2010/01/28/blog-maintenance-going-on/</guid>
      <description><![CDATA[Changing a few things here and there, working on the bar below the blog, and adding a comment...]]></description>
      <content:encoded><![CDATA[Changing a few things here and there, working on the bar below the blog, and adding a comment moderation system, thinking about disqus, and as usual as it's not my hosted blog I'll need to fight a lot with scripts etc.]]></content:encoded>
    </item>
    <item>
      <title>Replacement of !runaway</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/replacement-of-runaway</link>
      <pubDate>Fri, 25 Dec 2009 06:28:00 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2009/12/25/replacement-of-runaway/</guid>
      <description><![CDATA[!runway is a beautiful command which tells you the time taken by specific threads, very useful in...]]></description>
      <content:encoded><![CDATA[<p>!runway is a beautiful command which tells you the time taken by specific threads, very useful in hang scenarios, this is the sample output of the command:</p>  <p></p>  <p><font size="2" face="Courier New">0:004&gt; !runaway     <br /> User Mode Time      <br />&#160; Thread&#160;&#160;&#160;&#160;&#160;&#160; Time      <br />&#160;&#160; 0:11b8&#160;&#160;&#160;&#160;&#160; 0 days 0:00:05.656      <br />&#160;&#160; 6:5f8&#160;&#160;&#160;&#160;&#160;&#160; 0 days 0:00:00.265      <br />&#160;&#160; 9:9a8&#160;&#160;&#160;&#160;&#160;&#160; 0 days 0:00:00.156      <br />&#160;&#160; 4:1200&#160;&#160;&#160;&#160;&#160; 0 days 0:00:00.109      <br />&#160; 12:1418&#160;&#160;&#160;&#160;&#160; 0 days 0:00:00.015      <br />&#160; 11:1018&#160;&#160;&#160;&#160;&#160; 0 days 0:00:00.000      <br />&#160; 10:1028&#160;&#160;&#160;&#160;&#160; 0 days 0:00:00.000      <br />&#160; .</font></p>  <p><font size="2" face="Courier New">&#160; .     <br /></font></p>  <p>But, what if you do not have this command? and no, I am not trying to reinvent the wheal, actually, this command was broken in one of the internal builds of windbg, so I had to use an alternative. Here is the alternative, with the sample output (nowadays, I prefer to use this command rather than !runaway)</p>  <p><font size="2" face="Courier"><font face="Courier New">0:004&gt; ~*e .block{~.;.ttime}       <br />.&#160; 0&#160; Id: df4.11b8 Suspend: 1 Teb: 7ffdf000 Unfrozen        <br />&#160;&#160;&#160;&#160;&#160; Start: EXCEL!Ordinal40+0x2f74 (30002f74)         <br />&#160;&#160;&#160;&#160;&#160; Priority: 0&#160; Priority class: 32&#160; Affinity: 3        <br />Created: Wed Dec&#160; 9 20:18:13.610 2009 (UTC + 5:30)        <br />Kernel:&#160; 0 days 0:00:04.484        <br />User:&#160;&#160;&#160; 0 days 0:00:05.656        <br />.&#160; 1&#160; Id: df4.14a4 Suspend: 1 Teb: 7ffdd000 Unfrozen        <br />&#160;&#160;&#160;&#160;&#160; Start: csma_ldr!WlnDisconnect+0x28c7 (611052cb)         <br />&#160;&#160;&#160;&#160;&#160; Priority: 0&#160; Priority class: 32&#160; Affinity: 3        <br />Created: Wed Dec&#160; 9 20:18:13.641 2009 (UTC + 5:30)        <br />Kernel:&#160; 0 days 0:00:00.000        <br />User:&#160;&#160;&#160; 0 days 0:00:00.000        <br />.&#160; 2&#160; Id: df4.1700 Suspend: 1 Teb: 7ffde000 Unfrozen        <br />&#160;&#160;&#160;&#160;&#160; Start: EXCEL!Ordinal40+0x13681 (30013681)         <br />&#160;&#160;&#160;&#160;&#160; Priority: 0&#160; Priority class: 32&#160; Affinity: 3        <br />Created: Wed Dec&#160; 9 20:18:13.750 2009 (UTC + 5:30)        <br />Kernel:&#160; 0 days 0:00:00.000        <br />User:&#160;&#160;&#160; 0 days 0:00:00.000        <br />.&#160; 3&#160; Id: df4.5d8 Suspend: 1 Teb: 7ffdc000 Unfrozen        <br />&#160;&#160;&#160;&#160;&#160; Start: EXCEL!Ordinal40+0x13681 (30013681)         <br />&#160;&#160;&#160;&#160;&#160; Priority: 0&#160; Priority class: 32&#160; Affinity: 3        <br />Created: Wed Dec&#160; 9 20:18:13.750 2009 (UTC + 5:30)        <br />Kernel:&#160; 0 days 0:00:00.000        <br />User:&#160;&#160;&#160; 0 days 0:00:00.000        <br />.&#160; 4&#160; Id: df4.1200 Suspend: 1 Teb: 7ffdb000 Unfrozen        <br />&#160;&#160;&#160;&#160;&#160; Start: &lt;Unloaded_DLL&gt;+0xe927f (001284c7)         <br />&#160;&#160;&#160;&#160;&#160; Priority: 0&#160; Priority class: 32&#160; Affinity: 3        <br />Created: Wed Dec&#160; 9 20:18:13.844 2009 (UTC + 5:30)        <br />Kernel:&#160; 0 days 0:00:00.484        <br />User:&#160;&#160;&#160; 0 days 0:00:00.109</font></font></p>  <p><font size="2" face="Courier New">.</font></p>  <p><font size="2" face="Courier New">.</font></p>  <p><font size="2" face="Courier New"></font></p>  <p>Btw, there is a rather funny story regarding this command, I’ll tell you about it latter …</p>]]></content:encoded>
    </item>
    <item>
      <title>News: It’s the time to change my “about” page, I am a Support Escalation Engineer now</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/news-its-the-time-to-change-my-about-page-i-am-a-support-escalation-engineer-now</link>
      <pubDate>Thu, 24 Dec 2009 09:48:07 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2009/12/24/news-its-the-time-to-change-my-about-page-i-am-a-support-escalation-engineer-now/</guid>
      <description><![CDATA[Hello Friends,  Today, let me try to give you a few tips about my favourite part of job, dump...]]></description>
      <content:encoded><![CDATA[<p>Hello Friends,</p>  <p>Today, let me try to give you a few tips about my favourite part of job, dump analysis. All of us know that a problem is the mother of all inventions (or reinventions). So, what’s the problem with me? My problem is, I am lazy, very very lazy, not in everything, but in anything redundant which makes me try to automate anything and everything possible, here are a few attempts.</p>  <p><strong>Problem:</strong> Lot of dumps to analyze for the exact same problem, (say, 10 -12) and I’ve got to open all of them, find out if the dump is worth examining or not, very painstaking and believe me, the pain is directly proportional to the number of dumps.&#160;&#160; </p>  <p><strong>Solution: Write a nifty piece of code, that does the work for you ..</strong></p>  <p><strong>Code: </strong></p>  <div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">   <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">     <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">REM: <span style="color: #006080">&quot;This batch file (*.bat) is intended to do an auto analysis of multiple dumps. REM: It will just do enough analysis to get you started. &quot;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">REM: <span style="color: #006080">&quot;The problem I am trying to solve here is, how to find a needle from a haystack.&quot;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">REM: <span style="color: #006080">&quot;This is just a first pass of the haystack :)&quot;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&#160;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">REM: <span style="color: #006080">&quot;This batch file needs two parameters.&quot;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">REM: <span style="color: #006080">&quot;First parameter: The directory, in which either you have the dumps, or you have subdirectories with the dumps.&quot;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">REM: <span style="color: #006080">&quot;Second parameter: A log file name, in which you want to dump the analysis&quot;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&#160;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">FOR</span> /R %1 %%x <span style="color: #0000ff">IN</span> (*.dmp) <span style="color: #0000ff">DO</span> C:\debuggers\cdb.exe -c <span style="color: #006080">&quot;.echo -------------------------------------------------------------;.echo --------------------| Start Analysis   |--------------------;.echo --------------------| Start kvnL |--------------------;kvnL;.echo --------------------| End kvnL |--------------------;.echo --------------------| Start .ecxr |--------------------;.ecxr;.echo --------------------| End .ecxr |--------------------;.echo --------------------| Start !locks |--------------------;!locks;.echo --------------------| End !locks |--------------------;.echo --------------------| Start !cs -l |--------------------;!cs -l;.echo --------------------| End !cs -l |--------------------;.echo --------------------| Start !analyze -v |--------------------;!analyze -v;.echo --------------------| End !analyze -v   |--------------------;.echo --------------------| End Analysis      |--------------------;.echo -------------------------------------------------------------;qd&quot;</span> -loga %2 -y <span style="color: #006080">&quot;srv*C:\pubsym*http://msdl.microsoft.com/downloads/symbols&quot;</span> -z %%x</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">&#160;</pre>
<!--CRLF--></div>
</div>

<p></p>
<strong></strong>

<p>&#160;</p>

<p>Isn’t it a good one, it uses just the common commands, !analyze, .ecxr, !locks, !cs –l and the output file tells you which dump(s) to analyze.</p>

<p>Next Script, in my next post … </p>]]></content:encoded>
    </item>
    <item>
      <title>Project Natal: A move from “Video Gaming” to “Video Sporting”!</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/project-natal-a-move-from-video-gaming-to-video-sporting</link>
      <pubDate>Wed, 10 Jun 2009 11:29:01 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2009/06/10/project-natal-a-move-from-video-gaming-to-video-sporting/</guid>
      <description><![CDATA[Yes .. that’s how I look @ it .. check it out if you don’t believe (or if you do ..) and spread the...]]></description>
      <content:encoded><![CDATA[<p>Yes .. that’s how I look @ it .. check it out if you don’t believe (or if you do ..) and spread the love!</p>  <p><a href="http://www.xbox.com/en-US/live/projectnatal/" target="_blank">Xbox: &quot;Project Natal&quot; Home</a></p>  <p>and here is what my fellow bloggers are saying about it …</p>  <p><a href="http://blogs.msdn.com/xboxvoices/archive/2009/06/03/hands-and-body-on-with-project-natal.aspx">Hands – and Body – on with Project Natal</a>    <br /><a href="https://blogs.msdn.com/msozacademic/archive/2009/06/02/xbox-announces-project-natal-revolutionary-gaming-experience.aspx">XBOX Announces Project Natal- Revolutionary Gaming Experience</a>    <br /><a href="http://blogs.msdn.com/stevecla01/archive/2009/06/04/microsoft-s-project-natal-in-action.aspx">Microsoft’s Project Natal in Action</a></p><div class="wlWriterHeaderFooter" style="text-align:left; margin:0px; padding:4px 0px 4px 0px;"><a href="http://digg.com/submit?url=http%3a%2f%2fblogs.msdn.com%2fpranavwagh%2farchive%2f2009%2f06%2f10%2fproject-natal-a-move-from-video-gaming-to-video-sporting.aspx&amp;title=Project+Natal%3a+A+move+from+%e2%80%9cVideo+Gaming%e2%80%9d+to+%e2%80%9cVideo+Sporting%e2%80%9d!"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /></a></div>]]></content:encoded>
    </item>
    <item>
      <title>So, do you really know the difference? Try blindsearch!</title>
      <link>https://docs.microsoft.com/archive/blogs/pranavwagh/so-do-you-really-know-the-difference-try-blindsearch</link>
      <pubDate>Tue, 09 Jun 2009 16:57:12 GMT</pubDate>
      <dc:creator><![CDATA[Pranav Wagh]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/pranavwagh/2009/06/09/so-do-you-really-know-the-difference-try-blindsearch/</guid>
      <description><![CDATA[I haven’t seen the algorithm to generate three anonymous columns, but if it’s using random numbers,...]]></description>
      <content:encoded><![CDATA[<p>I haven’t seen the algorithm to generate three anonymous columns, but if it’s using random numbers, I’d not call it blind search, I’d call it <a href="http://en.wikipedia.org/wiki/Double-blind#Double-blind_trials" target="_blank">double blind</a>&#160; search engine perception, experience and search experiment or DBSEPESE; Hey! I coined an acronym .. :)</p>  <p>Here is the link .. have fun, <a title="http://blindsearch.fejus.com/" href="http://blindsearch.fejus.com/">http://blindsearch.fejus.com/</a>&#160; for more information on this experiment <a title="Blind Search- The Search Taste Test" href="http://delicategeniusblog.com/?p=830">Blind Search- The Search Taste Test</a></p><div class="wlWriterHeaderFooter" style="text-align:left; margin:0px; padding:4px 0px 4px 0px;"><a href="http://digg.com/submit?url=http%3a%2f%2fblogs.msdn.com%2fpranavwagh%2farchive%2f2009%2f06%2f10%2fso-do-you-really-know-the-difference-try-blindsearch.aspx&amp;title=So%2c+do+you+really+know+the+difference%3f+Try+blindsearch!"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /></a></div>]]></content:encoded>
    </item>
  </channel>
</rss>