<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Paddling Upstream</title><subtitle type="html" /><id>http://blogs.msdn.com/cdiggins/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cdiggins/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/cdiggins/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2006-04-27T16:31:00Z</updated><entry><title>My MSIL Wishlist</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cdiggins/archive/2007/02/08/my-msil-wishlist.aspx" /><id>http://blogs.msdn.com/cdiggins/archive/2007/02/08/my-msil-wishlist.aspx</id><published>2007-02-08T20:52:00Z</published><updated>2007-02-08T20:52:00Z</updated><content type="html">&lt;H3&gt;My MSIL Wishlist &lt;/H3&gt;
&lt;P&gt;The Microsoft Intermediate Language (MSIL), or as it is officially called now the Common Intermediate Language (the CIL, not to be confused with CLI which stands for Common Language Infrastructure) is the byte-code specification for the .NET framework. The official specification is the &lt;A href="http://www.ecma-international.org/publications/standards/Ecma-335.htm" mce_href="http://www.ecma-international.org/publications/standards/Ecma-335.htm"&gt;Standard-ECMA 335 (Common Language Infrastructure)&lt;/A&gt;. MSIL is essentailly a very simple stack-based assembly language which is compiled to assembly language&amp;nbsp;by the .NET framework as&amp;nbsp;needed. This process is known as JIT (for Just In Time)&amp;nbsp;compilation.&lt;/P&gt;
&lt;P&gt;MSIL is quite easy and fun to generate at run-time from C# (or any .NET enabled language for that matter) using the &lt;A href="http://msdn2.microsoft.com/en-us/library/system.reflection.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/system.reflection.aspx"&gt;Reflection API&lt;/A&gt;. There are also numerous articles on &lt;A href="http://www.codeproject.com/info/search.asp?searchkw=msil" mce_href="http://www.codeproject.com/info/search.asp?searchkw=msil"&gt;generating MSIL at CodeProject.com&lt;/A&gt;&amp;nbsp;which I recommend reading if you want to learn more.&lt;/P&gt;
&lt;P&gt;My interest in the MSIL is due to the fact that I am developing an optimizing compiler for my programming language, &lt;A href="http://www.cat-language.com/" mce_href="http://www.cat-language.com"&gt;Cat&lt;/A&gt;. Cat is a statically typed functional stack-based language that resembles a mix between Forth and ML. &lt;/P&gt;
&lt;H3&gt;Multiple Return Values&lt;/H3&gt;This is a feature possible in several .NET languages, such as &lt;A href="http://www.codeproject.com/dotnet/dforthnet.asp" mce_href="http://www.codeproject.com/dotnet/dforthnet.asp"&gt;Forth.NET&lt;/A&gt; and &lt;A href="http://www.codeplex.com/IronPython" mce_href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/A&gt;. In a stack-based language like Cat you can use a function which returns multiple values as follows: &lt;PRE&gt;  define f { 1 2 }
  define g { f + }&lt;/PRE&gt;
&lt;P&gt;The initial expectation is that the MSIL code would look like: &lt;/P&gt;&lt;PRE&gt;  f:
    ldc_i4_1
    ldc_i4_2
    ret
  g:
    call f
    add_i4&lt;/PRE&gt;
&lt;P&gt;However this is not possible in MSIL since the &lt;TT&gt;ret&lt;/TT&gt; opcode will only return one value from the stack. Instead, the best solution I could come up with was to wrap both values, and then unwrap them afterwards. Without going into the gruesome details, you need to generate the following psuedo-code: &lt;/P&gt;&lt;PRE&gt;  class Tmp {
    public Tmp(int32 arg0, int32 arg1)
    {
      field0 = arg0;
      field1 = arg1;
    }
    public int32 field0;
    public int32 field1;
  }

  f:
    ldc_i4_1
    ldc_i4_2
    newobj tmp
    ret
  g:
    call f
    Tmp tmp
    stloc tmp
    ldloc tmp
    ldfld field0
    ldloc tmp
    ldfld field1
    add
    &lt;/PRE&gt;
&lt;P&gt;This demonstrates another problem: &lt;TT&gt;ldfld&lt;/TT&gt; pops the object from the evaluation stack, so I have to declare a temporary variable, and copy from it. &lt;/P&gt;
&lt;H3&gt;The Ldfld Instruction&lt;/H3&gt;
&lt;P&gt;The &lt;TT&gt;ldfld&lt;/TT&gt; instruction pops an object from the evaluation stack, and pushes a named field. The first minor quibble I had with &lt;TT&gt;ldfld&lt;/TT&gt; was the fact that I had to name all of my fields, rather than leave them unnamed. Records or classes with unnamed fields, or tuples as they are usually called, are commonplace in many languages.&lt;/P&gt;
&lt;P&gt;The bigger problem I had was that &lt;TT&gt;ldfld&lt;/TT&gt; doesn't leave the object on the top of the evaluation stack. If the object is temporary as in my previous example, I don't want to keep it around. There are likely good reasons for this design decision in the MSIL, it probably makes sense the way it is for most languages most of the time. However an alternative instruction which does what I describe would help me generated byte-code. &lt;/P&gt;
&lt;H3&gt;No Swap Instruction&lt;/H3&gt;
&lt;P&gt;The MSIL has no &lt;TT&gt;swap&lt;/TT&gt; instruction. It may be that such an instruction would have significantly complicated the byte-code verifier and hurt the JIT compilation performance. I am only guessing though, I don't really know enough about the internals of the .NET framework to speculate. I am not the first person to bemoan this fact however, Valer Bocan who implemented Forth .NET also posted a &lt;A href="http://www.codeproject.com/dotnet/msilenhancement.asp" mce_href="http://www.codeproject.com/dotnet/msilenhancement.asp"&gt;thoughtful article at CodeProject.com&lt;/A&gt; about this and other possible enhancements to the MSIL. In all fairness, stack-based languages are not the MSIL designers primary concern. Well at least not until Cat takes over the world ;-)&lt;/P&gt;
&lt;P&gt;Not only is &lt;TT&gt;swap&lt;/TT&gt; an important and fundamental operation in many stack based and assembly languages, I could have used it to reduce the need for declaring a temporary variable. One solution would have looked like this: &lt;PRE&gt;  ...
  g:
    call f
    dup
    ldfld field0
    swap
    ldfld field1
    add&lt;/PRE&gt;
&lt;P&gt;Notice the fewer instructions and lack of a temporary variable declaration. This is only "a good thing" from my point of view.&lt;/P&gt;
&lt;P&gt;In general though it is a real joy for me to have access to such an easy to use byte-code generation framework for free. The things you can do with MSIL and the reflection framework are limitless. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1628741" width="1" height="1"&gt;</content><author><name>cdiggins</name><uri>http://blogs.msdn.com/members/cdiggins.aspx</uri></author><category term="cat" scheme="http://blogs.msdn.com/cdiggins/archive/tags/cat/default.aspx" /><category term="compiling" scheme="http://blogs.msdn.com/cdiggins/archive/tags/compiling/default.aspx" /><category term="cli" scheme="http://blogs.msdn.com/cdiggins/archive/tags/cli/default.aspx" /><category term="msil" scheme="http://blogs.msdn.com/cdiggins/archive/tags/msil/default.aspx" /><category term="jit" scheme="http://blogs.msdn.com/cdiggins/archive/tags/jit/default.aspx" /><category term="cil" scheme="http://blogs.msdn.com/cdiggins/archive/tags/cil/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/cdiggins/archive/tags/.NET/default.aspx" /></entry><entry><title>The Cat Programming Language</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cdiggins/archive/2007/01/26/the-cat-programming-language.aspx" /><id>http://blogs.msdn.com/cdiggins/archive/2007/01/26/the-cat-programming-language.aspx</id><published>2007-01-27T04:26:00Z</published><updated>2007-01-27T04:26:00Z</updated><content type="html">&lt;DIV class=postbody&gt;
&lt;P&gt;When I am not at work, writing multimedia SDK samples and documentation, I am at home working on my side project: the &lt;A href="http://www.cat-language.com/"&gt;Cat programming language&lt;/A&gt;. I have just recently released a nearly stable version (0.9.9) of the interpreter written in C# at &lt;A href="http://www.cat-language.com/download.html"&gt;http://www.cat-language.com/download.html&lt;/A&gt;. I am hoping that people will find it useful or interesting, and share their feedback with me.&lt;/P&gt;
&lt;P&gt;Cat is a bit of an odd-duck in that it is both a functional programming language (like Scheme, Haskell, and ML) and it is also a stack-based language (like Forth, and Postscript). This combination isn't unique (other examples include Joy and Factor), however it also has an optional type system.&amp;nbsp;The current interpreter doesn't do type-checking but there is a formal description available at &lt;A href="http://www.cat-language.com/semantics.html"&gt;http://www.cat-language.com/semantics.html&lt;/A&gt;. I plan on implementing the type checker in version 2.0.&lt;/P&gt;
&lt;P&gt;I've released Cat into the public domain, so you can use it for any purpose commercial or otherwise without restriction (and of course warrantee). I should make clear too that this has nothing to do with my employer, Microsoft, and is simply something that I do on my own.&lt;/P&gt;
&lt;P&gt;Please feel free to share with&amp;nbsp;me your thoughts, suggestions&amp;nbsp;or questions!&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1539904" width="1" height="1"&gt;</content><author><name>cdiggins</name><uri>http://blogs.msdn.com/members/cdiggins.aspx</uri></author><category term="cat" scheme="http://blogs.msdn.com/cdiggins/archive/tags/cat/default.aspx" /><category term="programming languages" scheme="http://blogs.msdn.com/cdiggins/archive/tags/programming+languages/default.aspx" /><category term="scheme" scheme="http://blogs.msdn.com/cdiggins/archive/tags/scheme/default.aspx" /><category term="functional programming" scheme="http://blogs.msdn.com/cdiggins/archive/tags/functional+programming/default.aspx" /><category term="stack" scheme="http://blogs.msdn.com/cdiggins/archive/tags/stack/default.aspx" /><category term="interpreter" scheme="http://blogs.msdn.com/cdiggins/archive/tags/interpreter/default.aspx" /><category term="forth" scheme="http://blogs.msdn.com/cdiggins/archive/tags/forth/default.aspx" /><category term="ML" scheme="http://blogs.msdn.com/cdiggins/archive/tags/ML/default.aspx" /><category term="haskell" scheme="http://blogs.msdn.com/cdiggins/archive/tags/haskell/default.aspx" /></entry><entry><title>Formally Understanding Concurrency</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cdiggins/archive/2006/12/11/formally-understanding-concurrency.aspx" /><id>http://blogs.msdn.com/cdiggins/archive/2006/12/11/formally-understanding-concurrency.aspx</id><published>2006-12-11T22:13:00Z</published><updated>2006-12-11T22:13:00Z</updated><content type="html">&lt;P&gt;A colleague of mine is interested in the formal basis of concurrent programming, so I decided to gather several resources and post them here. I should start by saying much that much of the research in concurrent programming is based on the theory of &lt;A class="" href="http://www.plre.org/search.php?q=pi+calculus" mce_href="http://www.plre.org/search.php?q=pi+calculus"&gt;pi-calculus&lt;/A&gt;.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="" href="http://research.microsoft.com/~thoare/StructuredConcurrent%20programming_files/frame.htm" mce_href="http://research.microsoft.com/~thoare/StructuredConcurrent%20programming_files/frame.htm"&gt;Structured Concurrent Programming&lt;/A&gt; - Slides in PDF format from a lecture by Tony Hoare.&lt;/LI&gt;
&lt;LI&gt;&lt;A class="" href="http://scala.epfl.ch/docu/files/PiLib.pdf" mce_href="http://scala.epfl.ch/docu/files/PiLib.pdf"&gt;PiLib: A Hosted Language for Pi-Calculus Style Concurrency&lt;/A&gt;&amp;nbsp;- An article about the implementation of the pi-calculus as library using the Scala programming language.&lt;/LI&gt;
&lt;LI&gt;&lt;A class="" href="http://citeseer.ist.psu.edu/19489.html" mce_href="http://citeseer.ist.psu.edu/19489.html"&gt;The Polyadic pi-Calculus: a Tutorial (1991)&amp;nbsp; Robin Milner&lt;/A&gt; - An article which provides an introduction and extension to the pi-calculus. &lt;/LI&gt;
&lt;LI&gt;&lt;A class="" href="http://citeseer.ist.psu.edu/agha98foundation.html" mce_href="http://citeseer.ist.psu.edu/agha98foundation.html"&gt;A Foundation for Actor Computation (1998) Agha et al&lt;/A&gt; - An article about the actor model of concurrent computation.&lt;/LI&gt;
&lt;LI&gt;&lt;A class="" href="http://acmqueue.com/modules.php?name=Content&amp;amp;pa=showpage&amp;amp;pid=444" mce_href="http://acmqueue.com/modules.php?name=Content&amp;amp;pa=showpage&amp;amp;pid=444"&gt;Multicore programming with Transactional Memory&lt;/A&gt;&amp;nbsp;- An article introducing the topic of transactional memory for dealing with concurrency.&lt;/LI&gt;
&lt;LI&gt;&lt;A class="" href="http://lambda-the-ultimate.org/node/1081" mce_href="http://lambda-the-ultimate.org/node/1081"&gt;Discussion of the Singularity project at Microsoft&lt;/A&gt; - A summary, discussion, and link to the Singularity project at Microsoft&amp;nbsp;to design a safe concurrent operating system.&amp;nbsp;&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Hopefully this provides a few useful and interesting entry points into the study of concurrency in computer science.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1261075" width="1" height="1"&gt;</content><author><name>cdiggins</name><uri>http://blogs.msdn.com/members/cdiggins.aspx</uri></author><category term="multithread" scheme="http://blogs.msdn.com/cdiggins/archive/tags/multithread/default.aspx" /><category term="programming" scheme="http://blogs.msdn.com/cdiggins/archive/tags/programming/default.aspx" /><category term="concurrent programming" scheme="http://blogs.msdn.com/cdiggins/archive/tags/concurrent+programming/default.aspx" /><category term="concurrency" scheme="http://blogs.msdn.com/cdiggins/archive/tags/concurrency/default.aspx" /><category term="multi-threaded programming" scheme="http://blogs.msdn.com/cdiggins/archive/tags/multi-threaded+programming/default.aspx" /><category term="pi-calculus" scheme="http://blogs.msdn.com/cdiggins/archive/tags/pi-calculus/default.aspx" /></entry><entry><title>Taming Variable Sized Structures in C++</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cdiggins/archive/2006/09/08/746842.aspx" /><id>http://blogs.msdn.com/cdiggins/archive/2006/09/08/746842.aspx</id><published>2006-09-08T23:44:00Z</published><updated>2006-09-08T23:44:00Z</updated><content type="html">&lt;P&gt;I am currently working on the documentation of the Windows Media Format SDK, and I was confronted with some API's which accept variable sized structs in the DRM Client Extended API. Writing clean memory allocation code for variable structs can be a painful endeavour and I am a lazy lazy man. For my own purposes I developed the a data structure which simplifies usage of data structures with variable sized fields when the size is a constant known at compile-time. &lt;/P&gt;
&lt;p&gt;
The following code demonstrates how you can write a simple template wrapper around an arbitrary variable sized struct (where the last field of the struct is variable sized). 
&lt;/p&gt;

&lt;pre&gt;
// Pre-declaration
typedef unsigned int DWORD;
typedef unsigned char BYTE;

// This is an actual struct from the WMF SDK
struct WMDRM_IMPORT_CONTENT_KEY
{
    DWORD dwVersion;
    DWORD cbStructSize;
    DWORD dwIVKeyType;
    DWORD cbIVKey;
    DWORD dwContentKeyType;
    DWORD cbContentKey;
    BYTE rgbKeyData[ 1 ];
};

// This is a somewhat generic template wrapper around a variable sized struct.
template&amp;lt;typename Struct, int FieldSize_N&gt; 
struct VarStruct 
{   
    Struct* operator-&gt;() { return &amp;(data_union.as_struct); }    
    static const int field_size = FieldSize_N;
    static const int struct_size = sizeof(Struct) + FieldSize_N - 1;

private:
    
    union
    {
        Struct as_struct;
        BYTE as_array[struct_size];
    } 
    data_union;
};

// Here is some mundane usage. 
int main()
{
    VarStruct&amp;lt;WMDRM_IMPORT_CONTENT_KEY, 42&gt; vs;
    for (int i=0; i &amp;lt; 42; ++i)
    {
        vs-&gt;rgbKeyData[i] = i;
    }
}
&lt;/pre&gt;

&lt;p&gt;
  I hope this code is self-explanatory, and can come in useful. Feel free to fire any questions my way.  
&lt;/p&gt;

&lt;blockquote&gt;&lt;i&gt;
The contents of this post are licensed under the &lt;a href="http://creativecommons.org/licenses/by-nc-nd/2.0/"&gt;Creative Commons Attribution-NonCommercial-NoDerivs license&lt;/a&gt;. The opinions in this post are my own and are not neccessarily the views of my employer, Microsoft.
&lt;/i&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=746842" width="1" height="1"&gt;</content><author><name>cdiggins</name><uri>http://blogs.msdn.com/members/cdiggins.aspx</uri></author></entry><entry><title>HD DVD Documentation Online</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cdiggins/archive/2006/08/29/730721.aspx" /><id>http://blogs.msdn.com/cdiggins/archive/2006/08/29/730721.aspx</id><published>2006-08-30T01:36:00Z</published><updated>2006-08-30T01:36:00Z</updated><content type="html">&lt;P&gt;In my role as a documentation writer at Microsoft I recently completed and posted a new release of documentation for developing interactive HD DVD content, also known as iHD.&amp;nbsp;You can find the documentation at: &lt;A href="http://msdn.microsoft.com/library/en-us/HDDVDATK/htm/hddvdprogrammingguide.asp"&gt;http://msdn.microsoft.com/library/en-us/HDDVDATK/htm/hddvdprogrammingguide.asp&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;An interesting and informal resource for authoring iHD content can be found on MSDN&amp;nbsp;at &lt;A href="http://blogs.msdn.com/ptorr/"&gt;Peter Torr's blog&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=730721" width="1" height="1"&gt;</content><author><name>cdiggins</name><uri>http://blogs.msdn.com/members/cdiggins.aspx</uri></author></entry><entry><title>Parsing Windows Media Services 9 Log Files </title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cdiggins/archive/2006/04/27/585126.aspx" /><id>http://blogs.msdn.com/cdiggins/archive/2006/04/27/585126.aspx</id><published>2006-04-28T02:31:00Z</published><updated>2006-04-28T02:31:00Z</updated><content type="html">&lt;P&gt;This posting is provided "AS IS" with no warranties, and confers no rights. &lt;/P&gt;
&lt;H1&gt;Parsing Windows Media Services 9 Log Files&lt;/H1&gt;
&lt;P&gt;Windows Media Services (WMS) logging is a very broad and complex subject, but it is covered in depth by &lt;A href="http://www.microsoft.com/windows/windowsmedia/howto/articles/LoggingModel.aspx"&gt;this white paper&lt;/A&gt; about the Logging Model for Windows Media Service 9 Series from Microsoft.&amp;nbsp;What&amp;nbsp;can be tricky about WMS logs is that they&amp;nbsp;contain multiple kinds of log entries, some&amp;nbsp;of which represent cache hits, cache misses, server data, etc. This means that naively&amp;nbsp;counting hits will give false results, so I recommend strongly reading the white paper before embarking on any kind of expedition for parsing&amp;nbsp;WMS logs.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I am not an expert in parsing log&amp;nbsp;files, or in Windows Media Server logs, but Microsoft does provide a useful free power-tool called &lt;A href="http://www.microsoft.com/technet/scriptcenter/tools/logparser/default.mspx"&gt;LogParser&lt;/A&gt;, which can be useful for slicing and dicing your Media Server logs. LogParser is the swiss army knife of logging tools, and has entire sites dedicated to it by its fans ( &lt;A href="http://www.logparser.com/"&gt;http://www.logparser.com&lt;/A&gt; - the unofficial logparser site ). &lt;/P&gt;
&lt;P&gt;I have provided the following links to help you gather information on WMS logging, and Log Parser so that you can be better equipped to parse your log files.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/technet/scriptcenter/tools/logparser/default.mspx"&gt;Official Microsoft Logparser Site&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&amp;amp;displaylang=en"&gt;Directly download Log Parser from the Microsoft Download Center&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.microsoft.com/technet/community/columns/profwin/pw0505.mspx"&gt;How Logparser 2.2 Works&lt;/A&gt; - A better explanation of how to use the tool by the author Gabriele Giuseppini. 
&lt;LI&gt;&lt;A href="http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/wmsrvsdk/htm/creatingloganaltools.asp"&gt;Creating Log Analysis Tools for Windows Media Services 9 
&lt;LI&gt;&lt;A href="http://www.microsoft.com/technet/community/columns/scripts/sg0105.mspx"&gt;Tales from the Script January 2005&lt;/A&gt; a TechNet article on LogParser 
&lt;LI&gt;&lt;A href="http://www.microsoft.com/technet/technetmag/issues/2006/03/InsideMSCOM/default.aspx"&gt;Analyzing Denial of Service Attacks using LogParser 2.2&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.microsoft.com/windows/windowsmedia/forpros/server/server.aspx"&gt;Windows Media Server Home Page&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/wmsrvsdk/htm/implementlogplugin.asp"&gt;Log Types&lt;/A&gt; - Detailed information about the fields in the log 
&lt;LI&gt;&lt;A href="http://www.microsoft.com/windows/windowsmedia/forpros/server/faq.aspx"&gt;Windows Media Services 9 Series FAQ&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.logparser.com/"&gt;Unofficial Logparser Site&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.w3schools.com/sql/default.asp"&gt;SQL Tutorial&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwmt/html/creatingawindowsmediaservicesloggingplugin.asp"&gt;Creating a Windows Media Services Plugin&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.microsoft.com/windows/windowsmedia/howto/articles/LoggingModel.aspx"&gt;Logging Model for Winwdows Media Service 9 Series&lt;/A&gt;. 
&lt;LI&gt;&lt;A href="http://support.microsoft.com/?kbid=812635&amp;amp;product=wms"&gt;Supplemental Logging Information about WMS&lt;/A&gt; - This isn't particularly relevant, but it does show some WMS hacking using JScript. 
&lt;LI&gt;&lt;A href="http://www.syngress.com/catalog/?pid=3110"&gt;Microsoft Log Parser Toolkit&lt;/A&gt; - Buy the book by Gabriele Giuseppini and Mark Burnett&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I hope you find these links useful!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=585126" width="1" height="1"&gt;</content><author><name>cdiggins</name><uri>http://blogs.msdn.com/members/cdiggins.aspx</uri></author></entry></feed>