<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Coding</title>
        <link>http://geekswithblogs.net/dirksblog/category/2806.aspx</link>
        <description>Coding</description>
        <language>de-DE</language>
        <copyright>Dirk Eisenberg</copyright>
        <managingEditor>dirk.eisenberg@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Virtual Shadow Copy Services - Create Shadow Copy</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2008/04/21/121470.aspx</link>
            <description>&lt;font color="#010001" size="2"&gt;
&lt;p&gt;Einige Abende haben mich nun die icht mehr ganz so neuen Virtual Shadow Copy Services beschäftigt. Für alle die genauso wie ich eine Shadow Copy einer Partition anlegen wolle um mit ihrer Platte irgendetwas in einem stabilien Zustand zu bewerkstelligen sollte dieser Code hilfreich sein. Das Ziel des hier abgebildeten Codes soll es sein eine Virtual Shadow Copy einer Partition zu erzeugen und mit Hilfe von Win32-Apis auf diese zuzugreifen. Der Code beinhaltet natürlich viel zu wenig Error-Handling und achtet auch nicht auf die korrekte Freigabe von Resourcen. Nun aber los:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;CoInitializeEx( NULL, 0 );&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Zuerst muss COM initialisiert wert, dazu muss man wohl nichts mehr sagen.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;IVssBackupComponents&lt;/font&gt;&lt;font size="2"&gt;* &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;NULL&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; ( &lt;/font&gt;&lt;font color="#010001" size="2"&gt;FAILED&lt;/font&gt;&lt;font size="2"&gt;( &lt;/font&gt;&lt;font color="#010001" size="2"&gt;CreateVssBackupComponents&lt;/font&gt;&lt;font size="2"&gt;( &amp;amp;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt; ) ) )&lt;br /&gt;
&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;  return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; 1;&lt;br /&gt;
&lt;/font&gt;&lt;em&gt;Um überhaupt mit dem VSS-Api arbeiten zu können wird ein Pointer auf ads BackupComponents-Interface benötigt. Dieses Objekte stellt dann Methoden zur Verfügung um VSS zur Arbeit zu überreden. Wichtig bei allen folgenden Methoden-Aufrufen ist die Reihenfolge. Hier legt Microsoft genaue Abläufe fest die umbedingt eingehalten werden müssen. Wer sich nicht daran hält wird mit Error-Codes bestraft (ich habs probiert).&lt;/em&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;InitializeForBackup&lt;/font&gt;&lt;font size="2"&gt;( &lt;/font&gt;&lt;font color="#010001" size="2"&gt;NULL&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; );&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Nachdem wir Zugriff auf das BackupComponents-Objekt erhalten haben, ist die erste Amtshandlung dem System zu sagen wir wollen ein Backup machen. Hierzu muss die Methode InitializeForBackup aufgerufen werden. Erst hierdurch können die nachfolgenden Methoden aufgerufen werden.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;SetContext&lt;/font&gt;&lt;font size="2"&gt;( &lt;/font&gt;&lt;font color="#010001" size="2"&gt;VSS_CTX_BACKUP&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; );&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Dem System ist im dritten Schritt zu sagen welche Art von Backup und damit welche Art von Snapshot erzeugt werden soll. Hier gibt es verschiedene Möglichkeit, grundsätzlich sind aber zwei zu Unterscheide. Eine Variante bezieht die sogenannten Writer mit ein und die andere eben nicht. Writer stellen Userland-Applikation dar die auf bestimmte Aktionen des VSS-Systems reagieren und vor einem Backup bestimmte Aktionen zu beenden. Datenbanken würden alle wichtigen Informationen noch auf die Platte schreiben damit die Datenbank auch in einem brauchbaren Zustand ist. Hat man Softare die keinen VSS-Support bietet, muss wohl der Weg über Stop-Service und Start-Service eben dieser gegangen werden. Erst danach ist es ratsam eine Shadow-Copy zu erzeugen. Wie man Writer schreibt werde ich einem anderen Eintrag versuchen darzustellen.&lt;/em&gt;&lt;/font&gt;&lt;font color="#008000" size="2"&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;IVssAsync&lt;/font&gt;&lt;font size="2"&gt;* &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pWriteMetaData&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;NULL&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;GatherWriterMetadata&lt;/font&gt;&lt;font size="2"&gt;( &amp;amp;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pWriteMetaData&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt; );&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pWriteMetaData&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;Wait&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;();&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pWriteMetaData&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;Release&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;();&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Da wir Writer-Aktionen in unser Backup einbeziehen, müssen auch die Meta-Daten über diese abgefragt werden. Hierdurch erlangt das System genau Informationen welche Writer wie und wann benachrichtigt werden müssen. Diese Aktion kann durchaus etwas länger dauer. Aus diesem Grund wird hierfür eine Pointer für assynchrone Operationen zurückgegeben mit dessen Hilf das Ende abgewartet werden kann. &lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;VSS_ID&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#010001" size="2"&gt;snapshotSetId&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;StartSnapshotSet&lt;/font&gt;&lt;font size="2"&gt;( &amp;amp;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;snapshotSetId&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; );&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;VSS sieht die Sicherung des geamten Storage-Systems zu einem Zeitpunkt vor, daher reden wir nicht von einem Snapshot eines spezifischen Volumes sondern eine SnapShot-Set der eine Liste von einzubeziehenden Volumes verwaltet. Dadurch ist es Möglich z.B. die Partition für mdf und ldf in einem Snapshot-Set zu fixieren und später einfach zu sichern.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;VSS_ID&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#010001" size="2"&gt;SnapShotId&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;AddToSnapshotSet&lt;/font&gt;&lt;font size="2"&gt;( &lt;/font&gt;&lt;font color="#010001" size="2"&gt;L&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;"F:\\"&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#010001" size="2"&gt;GUID_NULL&lt;/font&gt;&lt;font size="2"&gt;, &amp;amp;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;SnapShotId&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; );&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Haben wir den Container, das SnapShot-Set angelegt, müssen jetzt noch die einzelnen Targets hinzugefügt werden. Die einfachste Methode ist es via Laufwerksbuchstaben eine ganze Partition hinzuzufügren. Dieser Vorgang kann mehrfach für andere Volumes wiederholt werden.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;SetBackupState&lt;/font&gt;&lt;font size="2"&gt;( &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;false&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;false&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#010001" size="2"&gt;VSS_BT_FULL&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; );&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Da auch inkrementielle Backups vorgesehen sind, ist noch die Art und Weise des Backups zu definieren. In diesem Beispiel wollen wir ein Full-Backup aller Dateien machen. Es gibt auch die Möglichkeit Dateien einzuschränken.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;IVssAsync&lt;/font&gt;&lt;font size="2"&gt;* &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pPrepare&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;NULL&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;PrepareForBackup&lt;/font&gt;&lt;font size="2"&gt;( &amp;amp;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pPrepare&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt; );&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pPrepare&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;Wait&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;();&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pPrepare&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;Release&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;();&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Jetzt nähern wir uns dem Punkt der Wahrheit, dem VSS-System wird mitgeteilt das sich alle Writer und Provider auf das Backup vorbereiten müssen. Kurz darauf folgt dann die eigentlich Erzeugung des Snapshots.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;IVssAsync&lt;/font&gt;&lt;font size="2"&gt;* &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pDoShadowCopy&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;NULL&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;DoSnapshotSet&lt;/font&gt;&lt;font size="2"&gt;( &amp;amp;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pDoShadowCopy&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt; );&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pDoShadowCopy&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;Wait&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;();&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;pDoShadowCopy&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;Release&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;();&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Mit der Methode DoSnapshotSet wird dann für jede Komponente des Sets ein SnapShot erzeugt. Hierbei sorgt das Betriebssystem für die Konsistenz der Daten.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;VSS_SNAPSHOT_PROP&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#010001" size="2"&gt;props&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#010001" size="2"&gt;hr&lt;/font&gt;&lt;font size="2"&gt; = &lt;/font&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;GetSnapshotProperties&lt;/font&gt;&lt;font size="2"&gt;( &lt;/font&gt;&lt;font color="#010001" size="2"&gt;SnapShotId&lt;/font&gt;&lt;font size="2"&gt;, &amp;amp;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;props&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; );&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Nun fehlt nur noch die Information für den Zugriff via Win32-Api. Hierfür stellt die abgerufene Struktur eine Device-Pfad zur Verfügung auf den vie CreateFile und anderen IO-Operation zugegriffen werden kann.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#010001" size="2"&gt;pBackupComponents&lt;/font&gt;&lt;font size="2"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#010001" size="2"&gt;Release&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;();&lt;/font&gt;&lt;br /&gt;
&lt;em&gt;Nur noch das Interface release und fertig.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hinweis: In diesem Beispiel wurde ein temporärer Snapshot angelegt, d.h. wenn dieser nicht mehr benötigt wird, verschwindet dieser. Auch ein Restart des VSS-Service lässt den Snapshot verschiedenen. Will man persistente Snapshots, müssen die Flags entsprechend umkonfiguriert werden.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Mit dem Tool dosdev lassen sich so erzeugte Snapshots auch mounten und einem Laufwerksbuchstaben zuordnen. Mehr Informationen hierzu gibt es auf folgenden Seiten: &lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;em&gt;Aldi Olteans Blog &lt;a href="http://blogs.msdn.com/adioltean/archive/2006/09/18/761515.aspx"&gt;(1)&lt;/a&gt; &lt;a href="http://blogs.msdn.com/adioltean/archive/2005/10/04/477164.aspx"&gt;(2)&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;li&gt;&lt;em&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=cebf3c7c-7ca5-408f-88b7-f9c79b7306c0&amp;amp;DisplayLang=en"&gt;Downlod von dosdev&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Ich werde in den nächsten Artikeln versuchen Schritt für Schritt andere Funktionen auf C++-Ebene zu beschreiben. Hierbei werden Themen wie das Schreiben von VSS-Writern und VDS-Hardware-Providern adressiert. &lt;/em&gt;&lt;/p&gt;
&lt;/font&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121470"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121470" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/121470.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2008/04/21/121470.aspx</guid>
            <pubDate>Tue, 22 Apr 2008 02:07:23 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/121470.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2008/04/21/121470.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/121470.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/121470.aspx</trackback:ping>
        </item>
        <item>
            <title>Debian Repository für iSCSI Enterprise Target</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2008/03/02/120135.aspx</link>
            <description>Jeder der eine standard etch Installation sein eigen nennt kann jetzt entwerder via Apt oder per Download ein Debian-Paket für das iSCSI Enterprise Target 0.4.15  installieren. Ich werde in Zukunft diese Paket immer wieder aktualisieren. &lt;br /&gt;
&lt;a href="http://www.dirk-eisenberg.de/DEI/Projects.html"&gt;&lt;br /&gt;
hier gehts zum Paket&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Wer selbst mal Pakete erstellen und APT-Repositories aufsetzen möcht, dem helfen vielleicht die folgenden Informationen:&lt;br /&gt;
&lt;a href="http://www.debian-administration.org/articles/286"&gt;&lt;br /&gt;
Setting up your own APT repository with upload support&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.ibm.com/developerworks/linux/library/l-debpkg.html"&gt;Create Debian Linux packages&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120135"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120135" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/120135.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2008/03/02/120135.aspx</guid>
            <pubDate>Mon, 03 Mar 2008 00:56:22 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/120135.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2008/03/02/120135.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/120135.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/120135.aspx</trackback:ping>
        </item>
        <item>
            <title>WOW64 - Es lebe der 32Bit Prozess - Teil 2</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2006/03/06/71556.aspx</link>
            <description>&lt;P&gt;Und wieder hat mich die Schreibwut gepackt und ich m&amp;#246;chte Versuche ein weiteres Problem beim Umgang mit 64Bit Windows Features aus einem 32Bit-Prozess heraus beschreiben. Wer sich schonmal die Frage gestellt hat, wie kommte man an den Wert der Variable %ProgramFiles%, kommt schnell zum entsprechendne MSDN Artikel und den Shell-APIs. Das Mittel der Wahl ist SHGetFolderPath und die passende CSIDL.&lt;/P&gt;
&lt;P&gt;Was macht man aber unter 64Bit Windows, immerhin wird je ein %ProgramFiles% f&amp;#252;r 64Bit-Prozesse und eines f&amp;#252;r 32Bit-Prozesse angeboten. Ruft man also SHGetFolderPath aus einem 64Bit-Prozess aus bekommt man oft C:\Program Files zur&amp;#252;ck. Aus einem 32Bit-Prozess C:\Program Files(x86). &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Warum ist das so?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Zus&amp;#228;tzlich zur FileSystem-Redirection gibt es unter 64Bit Windows eine Registry-Redirection und der Registry-Value hinter SHGetFolderPath ist wie folgt zweimal verf&amp;#252;gbar:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;64Bit Prozesse&lt;BR&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir&lt;BR&gt;&lt;/LI&gt;
&lt;LI&gt;32Bit Prozesse unter der WOW64 Emulation&lt;BR&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ProgramFilesDir&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Wie kommt man jetzt an den 64Bit-Wert?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Was kann man nun machen um aus einem 32Bit Prozess sowohl das x86-ProgramFiles-Dir und das x64-ProgramFiles-Dir abzufragen und dabei auf einem legalen Pfad zu bleiben. Gut das Microsoft ein Set von Environment-Variablen Dokumentiert hat die uns weiter helfen werden. Die Folgende Matrix finde sich in der MSDN &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win64/win64/wow64_implementation_details.asp"&gt;hier&lt;/A&gt;:&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class=clsStd&gt;
&lt;TBODY&gt;
&lt;TR class=data&gt;
&lt;TH&gt;Environment Variable&lt;/TH&gt;
&lt;TH&gt;64-bit Value&lt;/TH&gt;
&lt;TH&gt;32-bit Value&lt;/TH&gt;&lt;/TR&gt;
&lt;TR class=data&gt;
&lt;TD class=data&gt;PROCESSOR_ARCHITECTURE&lt;/TD&gt;
&lt;TD class=data&gt;Native (AMD64 or IA64)&lt;/TD&gt;
&lt;TD class=data&gt;x86&lt;/TD&gt;&lt;/TR&gt;
&lt;TR class=data&gt;
&lt;TD class=data&gt;PROCESSOR_ARCHITEW6432&lt;/TD&gt;
&lt;TD class=data&gt; N/A&lt;/TD&gt;
&lt;TD class=data&gt;%PROCESSOR_ARCHITECTURE%&lt;/TD&gt;&lt;/TR&gt;
&lt;TR class=data&gt;
&lt;TD class=data&gt;ProgramFiles&lt;/TD&gt;
&lt;TD class=data&gt;%ProgramFiles%&lt;/TD&gt;
&lt;TD class=data&gt;%ProgramFiles(x86)%&lt;/TD&gt;&lt;/TR&gt;
&lt;TR class=data&gt;
&lt;TD class=data&gt;ProgramW6432&lt;/TD&gt;
&lt;TD class=data&gt; N/A&lt;/TD&gt;
&lt;TD class=data&gt;%ProgramFiles%&lt;/TD&gt;&lt;/TR&gt;
&lt;TR class=data&gt;
&lt;TD class=data&gt;CommonProgramFiles&lt;/TD&gt;
&lt;TD class=data&gt;%CommonProgramFiles%&lt;/TD&gt;
&lt;TD class=data&gt;%CommonProgramFiles(x86)%&lt;/TD&gt;&lt;/TR&gt;
&lt;TR class=data&gt;
&lt;TD class=data&gt;CommonProgramW6432&lt;/TD&gt;
&lt;TD class=data&gt; N/A&lt;/TD&gt;
&lt;TD class=data&gt;%CommonProgramFiles%&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;Ist davon auszugehen das seinem eigenem Prozess &lt;STRONG&gt;die Environment Variablen vererbt&lt;/STRONG&gt; werden, ist alles in Butter. Durch einfach Kombination von &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/iswow64process.asp"&gt;IsWow64Process&lt;/A&gt; und &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getenvironmentvariable.asp"&gt;GetEnvironmentVariable&lt;/A&gt; l&amp;#228;sst sich ein kleines Set von Funktionen bauen die immer das geforderte Directory korrekt zur&amp;#252;ckgeben egal wie der Prozess daher kommt.&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=71556"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=71556" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/71556.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2006/03/06/71556.aspx</guid>
            <pubDate>Tue, 07 Mar 2006 02:06:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/71556.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2006/03/06/71556.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/71556.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/71556.aspx</trackback:ping>
        </item>
        <item>
            <title>[Update] Der managed P/Invoke Mediator</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2006/03/05/71475.aspx</link>
            <description>&lt;P&gt;Wenn sich nach dem &lt;A href="http://geekswithblogs.net/dirksblog/archive/2006/03/05/71475.aspx"&gt;letzten Artikel&lt;/A&gt; vielleicht jemand fragt warum funktioniert das, sollte einen kurzen Blick auf die verschiedenen Bestandteile von Platform Invoke werfen. Daraus wird deutlich warum in einem Assembly DllImport-Verweise auf nicht existierende Dll vorhanden sein k&amp;#246;nnen und wann das &lt;A title="" href="http://de.wikipedia.org/wiki/.NET" target=_blank&gt;.NET&lt;/A&gt;-Framework wie auf die native DLL zugreift.&lt;/P&gt;
&lt;P&gt;Check this out: &lt;A href="http://msdn2.microsoft.com/en-us/library/h50dxzwx.aspx"&gt;http://msdn2.microsoft.com/en-us/library/h50dxzwx.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;There are three parts to a &lt;A title="" href="http://de.wikipedia.org/wiki/.NET" target=_blank&gt;.NET&lt;/A&gt; Compact Framework platform invoke:&lt;/EM&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;EM&gt;At design-time, the developer provides a description of the unmanaged function to call. This includes the module name (DLL file), entry point name, and calling convention. &lt;/EM&gt;&lt;/P&gt;
&lt;LI&gt;
&lt;P&gt;&lt;EM&gt;At just-in-time (JIT) compile time, the common language runtime extracts this information from the metadata, locates the DLL containing the function, loads the DLL into memory and retrieves the address of the function. If the module or function is not found, the common language runtime throw a &lt;?XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" /&gt;&lt;MSHelp:link tabIndex=0 keywords="T:System.MissingMethodException"&gt;MissingMethodException&lt;/MSHelp:link&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;LI&gt;
&lt;P&gt;&lt;EM&gt;At run time, the common language runtime marshals the parameters from managed format to unmanaged format before the unmanaged function is called. The common language runtime &lt;/EM&gt;&lt;/P&gt;
&lt;LI&gt;
&lt;P&gt;&lt;EM&gt;determines how to marshal each parameter based upon the managed declaration of the method.&lt;/EM&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Weiterhin sie auf das &lt;A href="http://msdn2.microsoft.com/en-us/library/ms229660.aspx"&gt;HowTo - Get the Device Platform&lt;/A&gt;&amp;nbsp;verwiesen. Dadurch l&amp;#228;sst sich der Platform Runtime Check auf sichere Beine stellen.&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=71475"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=71475" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/71475.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2006/03/05/71475.aspx</guid>
            <pubDate>Mon, 06 Mar 2006 02:21:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/71475.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2006/03/05/71475.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/71475.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/71475.aspx</trackback:ping>
        </item>
        <item>
            <title>Der managed P/Invoke Mediator</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2006/03/05/71471.aspx</link>
            <description>&lt;P&gt;Nach dem &lt;A href="http://mcblogs.craalse.de/sku?title=64_bit_windows_teil_9&amp;amp;more=1&amp;amp;c=1&amp;amp;tb=1&amp;amp;pb=1"&gt;letzten Blog&lt;/A&gt; meines &lt;A href="http://www.stefan-kuhr.de/"&gt;gleichgesinnten Kollegens&lt;/A&gt;&amp;nbsp;hat mich das Thema P/Invoke nicht mehr&amp;nbsp;los gelassen. Ich ging nur mit einer etwas&amp;nbsp;anderen Einstellung in das Thema. Mein Programmche soll nicht die File Redirection von&amp;nbsp;%systemroot%\system32 nutzen. Nein ich will keine Forwarder-Library in&amp;nbsp;das System32-Directory kopieren. Zustimmung erh&amp;#228;lt aber trotzdem das Mediator.Prinzip. Dieser&amp;nbsp;Mediator bestimmt welche native DLL geladen wird. Im Fall von 64Bit Windows w&amp;#228;re das die 64Bit-Dll, im Fall von 32Bit Windows die 32Bit-Dll und im Falle von Windows CE und dem Compact Framework eine andere.&lt;/P&gt;
&lt;P&gt;Mein Ziel ist aber die gesamte Distribution meiner Software in %ProgramFiles%\MySoftware zu handeln und eine foo.dll f&amp;#252;r 32Bit Windows, eine foo64.dll f&amp;#252;r 64Bit Windows und eine fooCe.dll f&amp;#252;r Windows CE zu halten.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Versuch Nummer 1:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Bendenkt man das Attribute in &lt;A title="" href="http://de.wikipedia.org/wiki/.NET" target=_blank&gt;.NET&lt;/A&gt; nur Klasse abgeleitet von System.Attribute sind, liegt die Idee nah das DllImportAttribute erneut abzuleiten und im Property-Handling f&amp;#252;r den DllName die Logik f&amp;#252;r die Namens-Nomenklatur zu Implementieren. Leider macht das kleine aber wichtige Schl&amp;#252;sselwort &lt;FONT face="Courier New"&gt;&lt;EM&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfsealed.asp"&gt;sealed&lt;/A&gt;&lt;/EM&gt;&lt;/FONT&gt; einen Strich duch die Rechnung. Damit sorgt das &lt;A title="" href="http://de.wikipedia.org/wiki/.NET" target=_blank&gt;.NET&lt;/A&gt; Framework das keine weitere Ableitung von dieser Klasse m&amp;#246;glich ist. Der n&amp;#228;chste Versuch war irgendeine Art Logik hinter den DllName zu h&amp;#228;ngen. Leider unterst&amp;#252;tzt auch hier das &lt;A title="" href="http://de.wikipedia.org/wiki/.NET" target=_blank&gt;.NET&lt;/A&gt; Framework nur konstante Parameter-Werte in Attributen. Also auf zu neuen Ufern.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Versuch Nummer 2:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Verfolgt man das Mediator-Konzept weiter, will aber keine eigene Forwarder-Dll schreiben, ist vielleicht folgendes Konzept hilfreich. F&amp;#252;r jede unterst&amp;#252;tzte Plattform wird eine DllImportHelper-Klasse implementiert. Diese kapselt lediglich das Marshaling und die DllImport-Anweisung. Um den Zugriff auf die richtige Helper-Klasse zu realisierien wird eine Schnittstelle zur Verf&amp;#252;gung gestellt. DieseDllImport-Klasse orchestriert den Zugriff auf die korrekte Helper-Klasse. Je nach aktueller Plattform wird die entsprechende Methode aus der korrekter DllImport-Helper-Klasse aufgerufen. &lt;/P&gt;
&lt;P&gt;Vorteile:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Das Mediator-Konzept wurde beibehalten und das Assembly kann einfach um weitere Plattformen erweitert werden. Baut man das Konzept aus,&amp;nbsp;so ist&amp;nbsp;eine Erweiterung f&amp;#252;r neue Platformen in reinem Managed-Code ohne Ver&amp;#228;nderung des aufrufenden Codes m&amp;#246;glich. 
&lt;LI&gt;Die Verwaltung einer extra Forwarder-Dll entf&amp;#228;llt. 
&lt;LI&gt;Die Applikation muss keine Libraries in %systemroot%\system32 ablegen.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Nachteil:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Die Bestimmung der aktuellen Platform kostet extra Zeit und verlangsamt den Sprung in den native Code nochmals. 
&lt;LI&gt;Es muss f&amp;#252;r jede Platform eine extra Klasse im Assembly gehalten werden aber kein zweites Assembly.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Ein einfaches Beispiel ist &lt;A href="http://www.dirk-eisenberg.de/files/PInvokeTest.cs"&gt;hier&lt;/A&gt; hinterlegt. Dieses Beispiel soll nur illustrieren wie das prinzipielle Vorgehen ist und wurde nicht f&amp;#252;r den produktiven Einsatz vorgesehen.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;64Bit Runtime Check:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Wie findet der geneigte Entwickler in C# heraus ob sich der Prozess gerade als 64Bit bzw. 32Bit-Prozess l&amp;#228;uft. Leider ist festzustellen das Microsoft in seinem Environment-Objekt keine passable L&amp;#246;sung f&amp;#252;r das Problem vorr&amp;#228;tig hat. Folgende L&amp;#246;sung stammt aus &lt;A href="http://blogs.msdn.com/joshwil/archive/2005/08/10/450198.aspx"&gt;diesem Blog&lt;/A&gt;&amp;nbsp;und &lt;A href="http://blogs.msdn.com/kstanton/archive/2004/04/20/116923.aspx"&gt;hier&lt;/A&gt; findet man wie es nicht gemacht werden sollte. Unter C# ist ein int-Datentyp immer 32Bit lang, egal ob 64Bit-Prozess der 32Bit-Prozess aber der IntPtr ist je nach Prozess-Art 32Bit oder 64Bit lang. &lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;bool bIs64Bit = (sizeof(IntPtr) == 8 )&lt;/FONT&gt;&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=71471"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=71471" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/71471.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2006/03/05/71471.aspx</guid>
            <pubDate>Mon, 06 Mar 2006 01:06:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/71471.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2006/03/05/71471.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/71471.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/71471.aspx</trackback:ping>
        </item>
        <item>
            <title>WOW64 - Es lebe der 32Bit Prozess</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2006/03/04/71368.aspx</link>
            <description>&lt;P&gt;Nach eingen Diskussionen mit hier nicht n&amp;#228;her &lt;A href="http://www.stefan-kuhr.de/"&gt;genannten Kollegen&lt;/A&gt; um das Thema File und Registry-Redirection unter 64Bit Windows habe ich mir die Frage gestellt, kann ein 32Bit-Prozess das automatische Redirecten &amp;#252;berwinden oder nicht? Ich will die Antwort nicht vorweg nehmen, also hier das gesteckte Ziel:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;"Ein 32Bit-Prozess soll einen Datei im 64Bit-Directory  %systemroot%\System32 anlegen."&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Unter 64Bit Windows wird das System32-Directory in einem 32Bit-Prozess, der unter der WOW64 Emulation getstartet wird, umgeleitet bzw. &amp;#252;berblendet. Ein 64Bit Prozess sieht die Dateien aus %systemroot%\System32 ein 32Bit-Prozess hingegen die Dateien aus %systemroot%\SysWOW64. Nach einiger Einarbeitung in die SDK-Dokumentation zu WOW64 haben sich folgende APIs als Goldgrube erwiesen:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Mit &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/iswow64process.asp"&gt;IsWow64Process&lt;/A&gt; kann gepr&amp;#252;ft werden ob der aufgerufene Prozess unter WOW64 l&amp;#228;uft. Ist das nicht der fall muss es ein 64Bit-Prozess sein oder ein 32Bit auf einem 32Bit OS. GetNativeSystemInfo hilft hier weiter. 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/wow64enablewow64fsredirection.asp"&gt;Wow64DisableWow64FsRedirection&lt;/A&gt; schaltet wie der Name schon sagt das WOW64 File-Redirecting f&amp;#252;r den aufrufenden Thread aus. Zum reverten (nicht wieder einschalten, weil es ja bereits abgeschaltet gewesen sein kann) wird Wow64RevertWow64FsRedirection angeboten.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Der Ablauf um in das System32 f&amp;#252;r 64Bit Prozesse aus einem 32Bit Prozess zu schreiben sieht dann wie folgt aus:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Pr&amp;#252;fen ob Prozess in der WOW64 Emulation l&amp;#228;uft 
&lt;LI&gt;FsRedirection ausschalten 
&lt;LI&gt;Jetzt kann direkt auf das System32 zugegriffen werden, ohne das der Prozess in SysWOW64 umgeleitet wird. 
&lt;LI&gt;FsRedirection reverten&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Folgendes Beispiel demonstriert das beschriebene Verfahren:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;PRE dir=ltr&gt;int _tmain(int argc, _TCHAR* argv[])
{
  BOOL bIsWOW64 = FALSE;
  if ( IsWow64Process( GetCurrentProcess(), &amp;bIsWOW64 ) &amp;&amp; bIsWOW64 == TRUE )
  {
    LPCTSTR lpszFileToCreate = _T("C:\\windows\\system32\\wow64test.txt"); 

    // Create the file in C:\windows\syswow64 
    HANDLE hFile = CreateFile( lpszFileToCreate, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    CloseHandle( hFile ); 

    // Create the file in C:\windows\system32 
    PVOID pOldValue = NULL; 
    if ( Wow64DisableWow64FsRedirection( &amp;pOldValue ) ) 
    { 
      HANDLE hFile64 = CreateFile( lpszFileToCreate, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 
      CloseHandle( hFile64 ); 
      Wow64RevertWow64FsRedirection( pOldValue ); 
    } 
  } 
  return 0; 
}&lt;/PRE&gt;&lt;/FONT&gt;
&lt;P&gt; &lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=71368"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=71368" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/71368.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2006/03/04/71368.aspx</guid>
            <pubDate>Sat, 04 Mar 2006 15:22:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/71368.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2006/03/04/71368.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/71368.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/71368.aspx</trackback:ping>
        </item>
        <item>
            <title>Die 64Bit Windows Artikel des eMCSCs</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2006/02/25/70683.aspx</link>
            <description>&lt;P&gt;Dank meinem Kollegen SKU wurde die Welt mit einer ganzen Serie &lt;A href="http://mcblogs.craalse.de"&gt;64Bit Windows Artikeln&lt;/A&gt; begl&amp;#252;ckt. Ich als ewig vergesslicher Mensch muss st&amp;#228;ndig in diesen Teilen etwas nachlesen. Leider st&amp;#246;rt das ewige Suchen im Blog jedesmal und strapaziert meinen ohnehin geringen Geduldsfaden. Aus diesem Grund habe ich die Teile als &lt;A href="http://geekswithblogs.net/dirksblog/articles/70682.aspx"&gt;Linkliste&lt;/A&gt; hier zusammengetragen. Aus meiner Sicht sind diese Artikel Pflichlekt&amp;#252;re f&amp;#252;r alle Entwickler die sowohl f&amp;#252;r die Microsoft Windows 32Bit als auch 64Bit-Plattform Software produzieren.&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=70683"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=70683" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/70683.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2006/02/25/70683.aspx</guid>
            <pubDate>Sat, 25 Feb 2006 18:12:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/70683.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2006/02/25/70683.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/70683.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/70683.aspx</trackback:ping>
        </item>
        <item>
            <title>IBM Active Protection (2)</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2005/09/28/55428.aspx</link>
            <description>&lt;P&gt;Ich habe mal einen sehr spartanischen Prototypen zur IBM Active Protection implementiert. Mit diesem Tool ist es m&amp;#246;glich die Bewegungen des Mouse-Pointers &amp;#252;ber die Neigung des Laptops zu steuern. Auf die Implementierung des Double-Click-Events haben ich verzichtet um gr&amp;#246;&amp;#223;eren Schaden beim Testen zu vermeiden.&lt;/P&gt;
&lt;P&gt;Download des MouseMovers &lt;A href="http://www.dirk-eisenberg.de/files/IBMMouseMover.exe"&gt;hier&lt;/A&gt;&amp;nbsp;und einen Screenshot des &lt;A href="http://geekswithblogs.net/dirksblog/gallery/image/1370.aspx"&gt;MouseMovers in Aktion&lt;/A&gt;.&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=55428"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=55428" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/55428.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2005/09/28/55428.aspx</guid>
            <pubDate>Thu, 29 Sep 2005 04:45:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/55428.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2005/09/28/55428.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/55428.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/55428.aspx</trackback:ping>
        </item>
        <item>
            <title>IBM Active Protection</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2005/09/26/54987.aspx</link>
            <description>&lt;P&gt;Nach einer kr&amp;#228;ftigen St&amp;#228;rkung im &lt;A href="http://www.buffet.com/"&gt;Old-Country Buffet&lt;/A&gt; (ich liebe diese amerikanischen Buffets) habe ich etwas Zeit gefunden meine abendlichen Experimente mit der IBM Active Protection zu dokumentieren. F&amp;#252;r alle interessierten Leser findet sich ein kleiner Artikel &lt;A href="http://geekswithblogs.net/dirksblog/articles/54935.aspx"&gt;hier&lt;/A&gt;.&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=54987"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=54987" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/54987.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2005/09/26/54987.aspx</guid>
            <pubDate>Mon, 26 Sep 2005 07:09:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/54987.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2005/09/26/54987.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/54987.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/54987.aspx</trackback:ping>
        </item>
        <item>
            <title>64 Bit Windows</title>
            <link>http://geekswithblogs.net/dirksblog/archive/2005/09/23/54806.aspx</link>
            <description>&lt;P&gt;Ich m&amp;#246;chte an dieser Stelle auf eine Blog Serie verweisen, die mein Kollege &lt;A href="http://www.stefan-kuhr.de"&gt;Stefan Kuhr &lt;/A&gt;begonnen hat. Hier bekommt man einen netten Einstieg in die derzeit von Microsoft unterst&amp;#252;tzten Tool und Techniken zur Entwicklung von Software auf 64Bit-Plattformen. F&amp;#252;r jeden der noch nicht  mit den Eigenheiten dieser Plattform vertraut ist, stellt diese Serie ein muss dar.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://mcblogs.craalse.de/sku?cat=15"&gt;http://mcblogs.craalse.de/sku?cat=15&lt;/A&gt;&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=54806"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=54806" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/dirksblog/aggbug/54806.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dirk Eisenberg</dc:creator>
            <guid>http://geekswithblogs.net/dirksblog/archive/2005/09/23/54806.aspx</guid>
            <pubDate>Fri, 23 Sep 2005 22:33:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/dirksblog/comments/54806.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/dirksblog/archive/2005/09/23/54806.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/dirksblog/comments/commentRss/54806.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/dirksblog/services/trackbacks/54806.aspx</trackback:ping>
        </item>
    </channel>
</rss>