<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JEDI Windows API &#187; Downloads</title>
	<atom:link href="http://blog.delphi-jedi.net/category/downloads/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.delphi-jedi.net</link>
	<description>Joint Endeavor of Delphi Innovators of Windows Programming</description>
	<lastBuildDate>Wed, 19 Oct 2011 18:52:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>JWSCL Features Overview</title>
		<link>http://blog.delphi-jedi.net/2010/02/22/jwscl-features-overview/</link>
		<comments>http://blog.delphi-jedi.net/2010/02/22/jwscl-features-overview/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 12:43:46 +0000</pubDate>
		<dc:creator>Christian Wimmer</dc:creator>
				<category><![CDATA[JWSCL Downloads]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/?p=652</guid>
		<description><![CDATA[I had some free time that I used to put together all the features JWSCL provides currently. There are some more features that are implemented by other tool classes or functions that I left out in favor of a good overview. A complete overview of all classes, methods and more gives you the documentation at [...]]]></description>
			<content:encoded><![CDATA[<p>I had some free time that I used to put together all the features JWSCL provides currently. There are some more features that are implemented by other tool classes or functions that I left out in favor of a good overview. A complete overview of all classes, methods and more gives you the documentation at <a href="http://jwscldoc.delphi-jedi.net." target="_blank">http://jwscldoc.delphi-jedi.net</a>.</p>
<p>So here are the feautures (You can look up the class names on the documentation page):</p>
<p><span id="more-652"></span></p>
<ul>
<li> Windows Token management (TJwSecurityToken)
<ul>
<li>Impersonation</li>
<li>Supports LogonUser, LsaLogonUser </li>
<li>Lots more</li>
</ul>
</li>
<li>Full support of Security ID (SID) (TJwSecurityID, TJwSecurityIDList)
<ul>
<li>Also well known security IDs like Everyone (JwsclKnownSid.pas) are stored as simple to use variables.</li>
</ul>
</li>
<li>Full support of Access Control Lists (also CALLBACK_ACE and OBJECT_ACE)
<ul>
<li>DACL, SACL</li>
</ul>
</li>
<li>Full support of Security Descriptor (SECURITY_DESCRIPTOR) (TJwSecurityDescriptor)
<ul>
<li>DACL, SACL, Owner, Group</li>
<li>Implements a simple to use Security Descriptor (TJwSimpleDescriptor)</li>
</ul>
</li>
<li>Security Rights Mapping; Maps Generic Rights to specific ones (JwsclMapping.pas)
<ul>
<li>Conversion of Security Rights (DWORD) to Human Readable names (JwFormatAccessRights)</li>
</ul>
</li>
<li>Privileges (TJwPrivilege, TJwPrivilegeSet, JwsclPrivileges.pas)</li>
<li>Windowstation and Desktops (TJwSecurityWindowStation, TJwSecurityDesktop)</li>
<li>Local Security Authority Logon Sessions (TJwLsaLogonSession)</li>
<li>Security of Windows objects; files, registry, handles (TJwSecureFileObject, TJwSecureFileObject, TJwSecureGeneralObject)
<ul>
<li>Support of Access Checking (AccessCheck)</li>
<li>Supports Inheritance (by default only files and registry)</li>
</ul>
</li>
<li>Support of MS AuthZ API; Client Side Access Checks for custom Resources (JwsclAuthCtx.pas) </li>
<li>Credentials GUI API (TJwCredentialsPrompt)</li>
<li>MS Encryption and Protection API (TJwEncryptionApi,  TJwEncryptMemory, TJwRandomDataGenerator)</li>
<li>Windows Version Detection on remote or local client (TJwFileVersion, TJwServerInfo, TJwWindowsVersion) </li>
<li>Security Descriptor GUI (TJwSecurityDescriptorDialog)</li>
<li>Terminal Sessions (TJwTerminalServer)
<ul>
<li>Server Management</li>
<li>Sessions Management</li>
<li>Processes Management</li>
</ul>
</li>
<li>Vista Elevation (JwShellExecute, JwElevateProcess, JwsclElevation.pas)
<ul>
<li>Supports <a title="German page only" href="http://kay-bruns.de/wp/software/surun/" target="_blank">SuRun</a> (<a title="Auto Translation" href="http://translate.google.com/translate?u=http%3A%2F%2Fkay-bruns.de%2Fwp%2Fsoftware%2Fsurun%2F&amp;langpair=de%7Cen&amp;hl=de&amp;safe=active&amp;ie=UTF-8&amp;oe=UTF-8&amp;prev=%2Flanguage_tools" target="_blank">English version</a>) (JwElevateProcess, JwCheckSuRunStatus)</li>
</ul>
</li>
<li>Vista Integrity Level (Built in)</li>
<li>Firewall Administration (TJwsclFirewall)</li>
<li>Builtin basic Sma rtpointer Support (TJwAutoLock)</li>
<li>Job Object support (TJwJobObject) even with several sessions (TJwJobObjectSessionList)</li>
<li>Process Handling that encapsulates support for different Windows Versions and bugs in API (functions JwCreateProcessAsAdminUser, JwCreateProcessInSession, JwGetProcessSessionID, JwGetTokenFromProcess, JwProcessIdToSessionId) </li>
<li>Support Memory Mapped Objects (TJwFileStreamEx, TJwIPCStream, TJwVirtualStream)</li>
<li>Extended Thread Support lile naming threads and WaitWithTimeOut (TJwThread)</li>
<li>Hashing Support (TJwHash) 
<ul>
<li>For JWSCL classes (JwObjectHash)</li>
<li>For files (JwCreateFileHash, JwCompareFileHash, JwDataHash, JwIntegerHash) in combination with fast Memory Mapping.</li>
</ul>
</li>
<li>DCOM support for Client and Server (currently only developer branch); CoInitializeSecurity (TJwComProcessSecurity), Authentication, Impersonation, Proxy Security Blanket (TJwComClientSecurity, TJwComServerSecurity), Access Control (TJwServerAccessControl), DCOM Configuration (TJwComRegistrySecurity) of Global Configs and Class Security.</li>
<li>Easy to use WinAPI (Msg)WaitForMultipleObjects functions (JwMsgWaitForMultipleObjects, JwMsgWaitForMultipleObjects)</li>
<li>Multi Language Support of Resource Files (LoadLocalizedString)</li>
<li>Ansi- &amp; Unicode due to own Delphi compatible String type TJwString (JwsclAnsiUniCode.pas)</li>
<li>Mapping of Windows Constants to Delphi enumeration (TJwEnumMap)</li>
<li>All errors are reported by exceptions using a derived class from EJwsclSecurityException. (JwsclExceptions.pas)</li>
<li> Supports Bugreports with Eurekalog (JwsclEurekaLogUtils.pas)</li>
<li>JWSCL is based on OOP </li>
</ul>
<p>To come</p>
<ul>
<li> Active Directory Support</li>
<li>User Account Management</li>
</ul>
<p>Current version is <a href="http://blog.delphi-jedi.net/2009/09/23/releases-for-delphi-2010/">0.9.3 Download.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2010/02/22/jwscl-features-overview/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Releases for Delphi 2010</title>
		<link>http://blog.delphi-jedi.net/2009/09/23/releases-for-delphi-2010/</link>
		<comments>http://blog.delphi-jedi.net/2009/09/23/releases-for-delphi-2010/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 22:07:07 +0000</pubDate>
		<dc:creator>Christian Wimmer</dc:creator>
				<category><![CDATA[Common]]></category>
		<category><![CDATA[JWA Downloads]]></category>
		<category><![CDATA[JWSCL Downloads]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/?p=450</guid>
		<description><![CDATA[JEDI Windows API (JWAL) and JEDI Windows Security Library (JWSCL) are now available in version 2.3 and 0.9.3. They support Delphi 2010. You can download them or use the new Subversion branches. If you find bugs, have questions, hints or want to participate: just mail us. Downloads Download from one of the Sourceforge mirrors at: [...]]]></description>
			<content:encoded><![CDATA[<p>JEDI Windows API (JWAL) and JEDI Windows Security Library (JWSCL) are now available in version 2.3 and 0.9.3. They support Delphi 2010.<br />
 You can download them or use the new Subversion branches.</p>
<p><span id="more-450"></span></p>
<p>If you find bugs, have questions, hints or want to participate: just <a href="http://mailhide.recaptcha.net/d?k=01MeKrDPlF4UMY4OOGe4JcPA==&amp;c=qu6RnFAF5jjxh0bbfE7ymCJCa5TFUIfZS6RdKFzWmME=">mail</a> us.</p>
<h2>Downloads</h2>
<p>Download from one of the Sourceforge mirrors at:</p>
<p><a href="https://sourceforge.net/projects/jedi-apilib/files">https://sourceforge.net/projects/jedi-apilib/files</a></p>
<p>(The download has Subversion folders <em>.SVN</em> which you can use to get updates through a Subversion Client. See below.)</p>
<h3>AND do <span style="text-decoration: underline;">not</span> forget to read:</h3>
<p><a href="http://blog.delphi-jedi.net/2007/12/27/how-to-setup-the-library/">How to Setup the JEDI Windows API Library (JWA).</a><br />
 and<br />
 <a href="http://blog.delphi-jedi.net/2008/03/03/how-to-setup-jwscl/">How to Setup the JEDI Windows Security Code Library (JWSCL).</a></p>
<h2>Subversion Access</h2>
<p>You can use a Subversion client, like <a href="http://tortoisesvn.tigris.org/" target="_blank">TortoiseSVN</a>, to download the sources directly.<br />
 <span style="text-decoration: underline;">Advantage</span>: You can easily get updated sources.</p>
<h3>JWA</h3>
<table style="width: 477px; height: 58px;" border="1">
<tbody>
<tr>
<td><a href="tsvn:https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwapi/branches/2.3"><img title="tortoisecheckout" src="http://blog.delphi-jedi.net/wp-content/uploads/2007/12/tortoisecheckout.png" alt="Checkout with TortoiseSVN" width="48" height="48" /></a></td>
<td>https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwapi/branches/2.3</td>
</tr>
</tbody>
</table>
<h3>JWSCL</h3>
<table style="width: 485px; height: 58px;" border="1">
<tbody>
<tr>
<td><a href="tsvn:https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwscl/branches/0.9.3"><img title="tortoisecheckout" src="http://blog.delphi-jedi.net/wp-content/uploads/2007/12/tortoisecheckout.png" alt="Checkout with TortoiseSVN" width="48" height="48" /></a></td>
<td>https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwscl/branches/0.9.3</td>
</tr>
</tbody>
</table>
<p><em>Click on the turtle to get the source if you have installed TortoiseSVN.</em></p>
<h2>Remaining Issues</h2>
<p>22. August 2009</p>
<p>There is an issue left with D2010: <br />
 The interface <em>IXMLElement</em> is no more available in file msxml.pas (MS XML Version 1). So the file <em>JwaUrlMon.pas</em> has been changed to use a <em>Pointer </em>instead of the <em>IXMLElement </em>interface. Unfortunately, the new IXmlDOMElement (MS XML Version 2) is not compatible with the old interface. <br />
 If you have an idea how to fix that, please <a href="http://mailhide.recaptcha.net/d?k=01MeKrDPlF4UMY4OOGe4JcPA==&amp;c=qu6RnFAF5jjxh0bbfE7ymCJCa5TFUIfZS6RdKFzWmME=">mail</a> to us.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2009/09/23/releases-for-delphi-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TakeControl of Your Files</title>
		<link>http://blog.delphi-jedi.net/2009/03/10/takecontrol-of-your-files/</link>
		<comments>http://blog.delphi-jedi.net/2009/03/10/takecontrol-of-your-files/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 18:15:50 +0000</pubDate>
		<dc:creator>Christian Wimmer</dc:creator>
				<category><![CDATA[JEDI Windows Security Code Lib]]></category>
		<category><![CDATA[JWSCL Downloads]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/?p=296</guid>
		<description><![CDATA[Recently my Windows Vista partition ran out of disk space. Well, the partition has 30GiB but that is not enough even if you choose to install 3rd party software on a separate disk. The main reason why Windows Vista needs so much space is the WinSxS folder which contains a lot of DLL files and [...]]]></description>
			<content:encoded><![CDATA[<p>Recently my Windows Vista partition ran out of disk space. Well, the partition has 30GiB but that is not enough even if you choose to install 3rd party software on a separate disk. The main reason why Windows Vista needs so much space is the <a href="http://blog.delphi-jedi.net/2008/09/30/why-windows-vista-eats-up-your-harddisk-space/">WinSxS</a> folder which contains a lot of DLL files and more (at least for me). I don&#8217;t want to go into detail here but this folder holds (nearly) duplicate files for compability and language reasons.</p>
<h3><span id="more-296"></span>Astonishment</h3>
<p>However, I was (a little) astounded when I found out that in this folder also Windows Media (.WMV) files reside which took about 600MiB alone on my PC (depends on your situation and software). I watched them and can tell you that I&#8217;ve never seen them before and I won&#8217;t watch them in future. These files usually can be found in C\Windows\Help\Windows\&lt;languageID&gt;.  I have them in two language versions because it happens that I have installed a German and English language Windows pack.  Windows fools you by linking these files to any of the WinSxS file &#8220;duplicates&#8221;. Depending on your language  you always watch them in your language.</p>
<h3>Command and Conquer your System</h3>
<p>Removing these files is very trick. The reason is that the WinSxS folder is heavily secured against messing around. Only the user &#8220;Trusted Installer&#8221; () can get full control and it is also the owner. Well, that is nice for beginners. But experts &#8211; like me &#8211; <strong>want full control</strong> of their files. So the easiest way to get full access is to become the owner of each folder we want to remove. Then we can give us full control by adding our user to the access control list (ACL). However in this way we need a lot of time to change all these folders. We could also change the top folder and let the security changes iterate through the childs (folders and files). But this approach takes a long time and is also a security risk because all folders and files are changed without exceptions. You could also write a batch or any other script file to do the job, but I am not experienced enough for this.<br />
Another problem is that we maybe want to keep a backup that can be restored in the case of an emergency (&#8220;I want to see these movies!&#8221;).</p>
<p>So which language could we use to become owner of a file, change file security, copy a file and more? Well, if you don&#8217;t  think Delphi you can stop reading now  <img src='http://blog.delphi-jedi.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>TakeControl</h3>
<p>I have created this application which I call &#8220;TakeControl&#8221;. It is a simple application that helps you to find files and let you access them with full control.<br />
Its main task is to move files which you think aren&#8217;t necessary to have on the partiton.  In my case there were a lot of media files which I didn&#8217;t want to have (also in Windows folder).</p>
<p>The application dialog looks like this</p>
<p><a href="http://blog.delphi-jedi.net/wp-content/uploads/2009/03/takecontrol.jpg"><img class="alignnone size-full wp-image-302" title="takecontrol" src="http://blog.delphi-jedi.net/wp-content/uploads/2009/03/takecontrol.jpg" alt="takecontrol" width="295" height="296" /></a></p>
<p>The numbers in the picture are explained here:</p>
<p>1. This edit box receives a semicolon separated list of file extentsions (with a dot in front of each). It usually looks like &#8220;.mpg;.wmv&#8221;. Imo you should not add &#8220;DLL&#8221; or &#8220;MUI&#8221; file extensions there.</p>
<p>2. &amp; 3. These edit boxes receive the source (2.) and target (3.) folders. The source folder defines where to search for the files and the target folder defines where to copy/move them. The source folder structure is retained in the target folder. So if a file is stored in this source folder : &#8220;C:\Windows&#8221; (2.)&#8221; say &#8220;\XXXX\File.wmv&#8221; and your target folder looks like &#8220;E:\temp&#8221; (3.) the new file will be created here: &#8220;E:\Temp\XXXX\File.wmv&#8221;.</p>
<p>4. If this checkbox is checked all files are copied instead of moved. Furthermore the security of the files aren&#8217;t changed at all. So if a file isn&#8217;t accessible an error is shown in the log memo (8.).<br />
This checkbox is only available if you run with administrator privileges; otherwise you aren&#8217;t able to move files.</p>
<p>5.  This checkbox lets you do a simple search. No file is changed or copied/moved. In this way you can find out how many files there are and if there is a file which isn&#8217;t accessible at all.</p>
<p>6. The run button starts the process (with a confirmation prompt). If the search is in progress, you can abort it here.</p>
<p>7. The status area shows some (rare) information.<br />
a) A waiting gradient shows you that something is still going on.<br />
b) A status label shows you the current file processed.<br />
c) A progress bar shows you the current copy/move operation progress.<br />
d) Number of errors and already processed files are shown on the right side of the dialog.</p>
<h3>Mandatory Instruction</h3>
<p>Well, before you start, you should always backup your system (this is mandatory). In the next step you can try to get rid of the media files if you want. But do it at your own risk.</p>
<h3>Appendix</h3>
<p>Yes, I know, there are many other possibilities that can be used to clean the Windows partition. Trust me, I tried them all! The last step would be to buy a new hard disk. <img src='http://blog.delphi-jedi.net/wp-includes/images/smilies/icon_twisted.gif' alt=':twisted:' class='wp-smiley' /> </p>
<h2>Sourcecode</h2>
<p>Source code is available in the example folder of our Subversion repository only.  See Subversion description <a href="http://blog.delphi-jedi.net/2008/03/03/how-to-setup-jwscl/">here</a>.<br />
Direct Subversion (for Checkout) and browser link is <a href="https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwscl/trunk/examples/TakeControl">here</a>.</p>
<h2>Download history</h2>
<p><a href="http://blog.delphi-jedi.net/wp-content/uploads/2009/03/takecontrol.zip">TakeControl Version 0.7</a> (zipped ~700Kib)</p>
<p>Be aware that you run this program at your own risk</p>
<h2>FAQ</h2>
<p>Q:  I can&#8217;t move files because the checkbox isn&#8217;t enabled.<br />
A: You need to run the application as a member of the Administrators group.</p>
<p>Q: I can do the same thing using X.<br />
A: If X doesn&#8217;t include JWSCL or JWA it is not a subject for this blog. You are welcome to post a comment though.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2009/03/10/takecontrol-of-your-files/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pre-Release of JEDI API 2.2 &amp; WSCL 0.9.2</title>
		<link>http://blog.delphi-jedi.net/2008/08/30/pre-release-of-jedi-api-22-wscl-092-2/</link>
		<comments>http://blog.delphi-jedi.net/2008/08/30/pre-release-of-jedi-api-22-wscl-092-2/#comments</comments>
		<pubDate>Sat, 30 Aug 2008 19:23:31 +0000</pubDate>
		<dc:creator>Christian Wimmer</dc:creator>
				<category><![CDATA[Common]]></category>
		<category><![CDATA[JWA Downloads]]></category>
		<category><![CDATA[JWSCL Downloads]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/?p=254</guid>
		<description><![CDATA[JEDI API and JWSCL compile with Delphi2009 and also the examples work as far as I could test it. I&#8217;ve created a Subversion branch for each project: JEDI API Version 2.2 pre-release https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwapi/branches/2.2a JEDI WSCL Version 0.9.2 pre-release https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwscl/branches/0.9.2a Download a ZIP package with both projects from SourceForge. Always update this package with a SVN [...]]]></description>
			<content:encoded><![CDATA[<p><strong>JEDI API </strong>and <strong>JWSCL</strong> compile with <strong>Delphi2009</strong> and also the examples work as far as I could test it.</p>
<p><span id="more-254"></span></p>
<p>I&#8217;ve created a <a title="Go get Windows Subversion Client TortoiseSVN" href="http://tortoisesvn.tigris.org/" target="_blank">Subversion</a> branch for each project:</p>
<p><strong>JEDI API Version 2.2 pre-release </strong></p>
<p>https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwapi/branches/2.2a</p>
<p><strong>JEDI WSCL Version 0.9.2 pre-release</strong></p>
<p>https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwscl/branches/0.9.2a</p>
<p>Download a ZIP package with both projects from <a href="http://sourceforge.net/project/showfiles.php?group_id=121894&amp;package_id=251762&amp;release_id=626467">SourceForge</a>. <span style="text-decoration: underline;">Always update this package with a SVN client to get best quality.</span></p>
<p><!--more-->As you can see we abandoned the revision numbers and instead use simple version numbers (as people are more used to those).<em><br />
These pre-releases won&#8217;t be available as packages from sourceforge.net!</em></p>
<p><strong>Please!<br />
We encourage you to use, test and check the released projects!</strong></p>
<p>If you find errors, have problems or questions don&#8217;t hesitate to ask them in the <a href="http://sourceforge.net/mail/?group_id=121894">mailinglist</a>, <a href="news://forums.talkto.net:119/jedi.apiconversion">newsgroup</a>, <a href="http://homepages.codegear.com/jedi/issuetracker/main_page.php">JEDI IssueTracker</a> or send it to <a href="http://mailhide.recaptcha.net/d?k=01MeKrDPlF4UMY4OOGe4JcPA==&amp;c=qu6RnFAF5jjxh0bbfE7ymCJCa5TFUIfZS6RdKFzWmME=">mail[at)delphi-jedi.net</a> .</p>
<p>Regards<br />
Christian Wimmer</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2008/08/30/pre-release-of-jedi-api-22-wscl-092-2/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Calculating Binary Hashes using TJwFileStreamEx</title>
		<link>http://blog.delphi-jedi.net/2008/06/17/239/</link>
		<comments>http://blog.delphi-jedi.net/2008/06/17/239/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 08:50:37 +0000</pubDate>
		<dc:creator>NeutralGeneral</dc:creator>
				<category><![CDATA[JEDI Windows Security Code Lib]]></category>
		<category><![CDATA[JWSCL Downloads]]></category>
		<category><![CDATA[JWSCL]]></category>
		<category><![CDATA[Memory Mapped Files]]></category>
		<category><![CDATA[MMF]]></category>
		<category><![CDATA[Streams]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/?p=239</guid>
		<description><![CDATA[Calculating Binary Hashes using TJwFileStreamEx Why should I use TJwFileStreamEx instead of any other common stream class from the VCL? Well this question is quite easily answered. The first thing is that TJwFileStreamEx is based on Memory Mapped Files (MMF). MMF might be the fastest way to access files on your hard disk. Another good [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;"><strong>Calculating Binary Hashes using TJwFileStreamEx</strong></span></p>
<p><strong>Why should I use TJwFileStreamEx instead of any other common stream class from the VCL?</strong></p>
<p>Well this question is quite easily answered.</p>
<p>The first thing is that TJwFileStreamEx is based on Memory Mapped Files (MMF). MMF might be the fastest way to access files on your hard disk. Another good reason for using TJwFileStreamEx is its <em>Memory</em> property which is well known from the VCL <strong>TMemoryStream</strong> class. This property will reduce the effort remarkably.</p>
<p><strong>Getting Started</strong></p>
<p>First you have to include following units to your project:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">uses</span> JwsclTypes, JwsclStreams, JwsclCryptProvider;</div>
<p>The signature of our hashing-function looks like this:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> GetFileHash<span class="br0">&#40;</span>Algorithm: TJwHashAlgorithm; <span class="kw1">const</span> Filename: <span class="kw4">String</span><span class="br0">&#41;</span> : <span class="kw4">String</span>;</div>
<p>The first parameter is used to specify the Algorithm which is used to hash the file data. The second parameter defines the path to the file which hash you want to compute.</p>
<p>So what do we need to calculate the hash of a file? All we need is an instance of TJwFileStreamEx to open the file and an instance of TJwHash to calculate the hash:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> GetFileHash<span class="br0">&#40;</span>Algorithm: TJwHashAlgorithm; <span class="kw1">const</span> Filename: <span class="kw4">String</span><span class="br0">&#41;</span> : <span class="kw4">String</span>;<br />
<span class="kw1">var</span><br />
&nbsp; Stream: TJwFileStreamEx;<br />
&nbsp; Hash: TJwHash;<br />
<span class="kw1">begin</span><br />
&nbsp; Stream := TJwFileStreamEx.<span class="me1">Create</span><span class="br0">&#40;</span>Filename,fmOpenRead<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; Hash := TJwHash.<span class="me1">Create</span><span class="br0">&#40;</span>Algorithm<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="co1">// Calculate and return the Hash as a Hex-String</span><br />
&nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; Hash.<span class="me1">Free</span>;<br />
&nbsp; &nbsp; Stream.<span class="me1">Free</span>; &nbsp;<br />
&nbsp; <span class="kw1">end</span>;<br />
<span class="kw1">end</span>;</div>
<p>This is the basic framework of our function. To calculate the hash of the file we need 2 methods:</p>
<div class="dean_ch" style="white-space: wrap;">TJwHash.<span class="me1">HashData</span><span class="br0">&#40;</span>Data: <span class="kw4">Pointer</span>; Size: <span class="kw4">Cardinal</span><span class="br0">&#41;</span>;<br />
TJwHash.<span class="me1">RetrieveHash</span><span class="br0">&#40;</span>out Len: <span class="kw4">Cardinal</span><span class="br0">&#41;</span>: <span class="kw4">Pointer</span>;</div>
<p>HashData tells our instance of TJwHash which data is to be hashed and which size this data has. RetrieveHash calculates the Hash and retrieves a pointer to the hash data.</p>
<p>Finally we have to free the Buffer using the class method</p>
<div class="dean_ch" style="white-space: wrap;">TJwHash.<span class="me1">FreeBuffer</span><span class="br0">&#40;</span>Buffer: <span class="kw4">Pointer</span><span class="br0">&#41;</span>;</div>
<p>Now our function looks like this:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> GetFileHash<span class="br0">&#40;</span>Algorithm: TJwHashAlgorithm; <span class="kw1">const</span> Filename: <span class="kw4">String</span><span class="br0">&#41;</span> : <span class="kw4">String</span>;<br />
<span class="kw1">var</span><br />
&nbsp; Stream: TJwFileStreamEx;<br />
&nbsp; Hash: TJwHash;<br />
&nbsp; HashSize: <span class="kw4">Cardinal</span>;<br />
&nbsp; HashData: <span class="kw4">Pointer</span>;<br />
<span class="kw1">begin</span><br />
&nbsp; Stream := TJwFileStreamEx.<span class="me1">Create</span><span class="br0">&#40;</span>Filename,fmOpenRead<span class="br0">&#41;</span>;<br />
&nbsp; Hash := TJwHash.<span class="me1">Create</span><span class="br0">&#40;</span>Algorithm<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; Hash.<span class="me1">HashData</span><span class="br0">&#40;</span>Stream.<span class="me1">Memory</span>,Stream.<span class="me1">Size</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; HashData := Hash.<span class="me1">RetrieveHash</span><span class="br0">&#40;</span>HashSize<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; TJwHash.<span class="me1">FreeBuffer</span><span class="br0">&#40;</span>HashData<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; Hash.<span class="me1">Free</span>;<br />
&nbsp; &nbsp; Stream.<span class="me1">Free</span>;<br />
&nbsp; <span class="kw1">end</span>;<br />
<span class="kw1">end</span>;</div>
<p>At last we need to convert the binary hash into a hex-string:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">for</span> i:= <span class="nu0">1</span> <span class="kw1">to</span> HashSize <span class="kw1">do</span><br />
<span class="kw1">begin</span><br />
&nbsp; Result := Result + <span class="kw3">IntToHex</span><span class="br0">&#40;</span><span class="kw4">PByte</span><span class="br0">&#40;</span>HashData<span class="br0">&#41;</span>^,<span class="nu0">2</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw3">inc</span><span class="br0">&#40;</span><span class="kw4">PByte</span><span class="br0">&#40;</span>HashData<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">end</span>;<br />
<span class="kw3">dec</span><span class="br0">&#40;</span><span class="kw4">PByte</span><span class="br0">&#40;</span>HashData<span class="br0">&#41;</span>,HashSize<span class="br0">&#41;</span>; <span class="co1">//neccessary to free HashData</span></div>
<p>Now we&#8217;re done and finally our function looks like this:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> GetFileHash<span class="br0">&#40;</span>Algorithm: TJwHashAlgorithm; <span class="kw1">const</span> Filename: <span class="kw4">String</span><span class="br0">&#41;</span> : <span class="kw4">String</span>;<br />
<span class="kw1">var</span><br />
&nbsp; Stream: TJwFileStreamEx;<br />
&nbsp; Hash: TJwHash;<br />
&nbsp; HashSize: <span class="kw4">Cardinal</span>;<br />
&nbsp; HashData: <span class="kw4">Pointer</span>;<br />
&nbsp; i: <span class="kw4">Integer</span>;<br />
<span class="kw1">begin</span><br />
&nbsp; Stream := TJwFileStreamEx.<span class="me1">Create</span><span class="br0">&#40;</span>Filename,fmOpenRead<span class="br0">&#41;</span>;<br />
&nbsp; Hash := TJwHash.<span class="me1">Create</span><span class="br0">&#40;</span>Algorithm<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; Hash.<span class="me1">HashData</span><span class="br0">&#40;</span>Stream.<span class="me1">Memory</span>,Stream.<span class="me1">Size</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; HashData := Hash.<span class="me1">RetrieveHash</span><span class="br0">&#40;</span>HashSize<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">for</span> i:= <span class="nu0">1</span> <span class="kw1">to</span> HashSize <span class="kw1">do</span><br />
&nbsp; &nbsp; <span class="kw1">begin</span><br />
&nbsp; &nbsp; &nbsp; Result := Result + <span class="kw3">IntToHex</span><span class="br0">&#40;</span><span class="kw4">PByte</span><span class="br0">&#40;</span>HashData<span class="br0">&#41;</span>^,<span class="nu0">2</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; <span class="kw3">inc</span><span class="br0">&#40;</span><span class="kw4">PByte</span><span class="br0">&#40;</span>HashData<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; &nbsp; <span class="kw3">dec</span><span class="br0">&#40;</span><span class="kw4">PByte</span><span class="br0">&#40;</span>HashData<span class="br0">&#41;</span>,HashSize<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; TJwHash.<span class="me1">FreeBuffer</span><span class="br0">&#40;</span>HashData<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; Hash.<span class="me1">Free</span>;<br />
&nbsp; &nbsp; Stream.<span class="me1">Free</span>;<br />
&nbsp; <span class="kw1">end</span>;<br />
<span class="kw1">end</span>;</div>
<p><strong>How do I use this function?</strong></p>
<div class="dean_ch" style="white-space: wrap;"><span class="co1">// first param can be one of these values:</span><br />
<span class="co1">// haMD2, haMD4, haMD5, haSHA</span><br />
Label1.<span class="me1">Caption</span> := GetFileHash<span class="br0">&#40;</span>haSHA,<span class="st0">&#8216;C:\Progam Files\Program\AFile.ext&#8217;</span><span class="br0">&#41;</span>;</div>
<p><strong>OK, but what is the advantage of TJwFileStreamEx over other Streams?</strong></p>
<p>Well, you don&#8217;t have to load the file into a TMemoryStream and thus the file will not be loaded completely into memory. Furthermore this solution is much faster than a solution using TMemoryStream and similar&#8230;</p>
<h2>Download</h2>
<p><a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/06/jwfilestreamex_demo.zip">Download</a> the source and binaries of this example (260kiB). This includes the new and necessary JWSCL source files. However you need to download the whole package separately.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2008/06/17/239/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Winlogon Notification Package</title>
		<link>http://blog.delphi-jedi.net/2008/05/27/winlogon-notification-package/</link>
		<comments>http://blog.delphi-jedi.net/2008/05/27/winlogon-notification-package/#comments</comments>
		<pubDate>Tue, 27 May 2008 18:07:05 +0000</pubDate>
		<dc:creator>Christian Wimmer</dc:creator>
				<category><![CDATA[JEDI Windows API Headers]]></category>
		<category><![CDATA[JWA Downloads]]></category>
		<category><![CDATA[JWA]]></category>
		<category><![CDATA[winlogon]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/?p=234</guid>
		<description><![CDATA[What is that? MSDN say&#8217;s: A Winlogon Notification Package is a DLL that exports functions that handle Winlogon events. For example, when a user logs onto the system, Winlogon calls each notification package&#8217;s logon event handler function to provide information about the event. So you might know, the mechanism of Winlogon Notification Package is available [...]]]></description>
			<content:encoded><![CDATA[<p><strong>What is that? MSDN say&#8217;s: </strong><em>A Winlogon Notification Package is a DLL that exports functions that handle Winlogon events. For example, when a user logs onto the system, Winlogon calls each notification package&#8217;s logon event handler function to provide information about the event.</em></p>
<p><span id="more-234"></span></p>
<p>So you might know, the mechanism of Winlogon Notification Package is available in Windows 2000, Windows XP and Windows 2003 Server. In contrast to Windows Vista, it is completely different, maybe I’ll come back with separate tutorial describing how to build a notification package for Windows Vista.</p>
<p>I&#8217;m going to demonstrate here, how to create such a notification package and as a special gift, we will learn how to create a PNG image with drop shadow effect, which we will use later to draw a transparent window inside the Winlogon Desktop.</p>
<p><a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/05/capture.jpg"><img class="alignnone size-thumbnail wp-image-230" title="capture" src="http://blog.delphi-jedi.net/wp-content/uploads/2008/05/capture.jpg" alt="Winlogon" width="301" height="221" /></a></p>
<p>It&#8217;s time for our <strong>Winlogon Notification Package</strong>. Start Delphi and create a new DLL project.</p>
<p>What we need to do next is to define the Message Callback and the WLXNotificationInfo, as described in <a href="http://msdn.microsoft.com/en-us/library/aa381183(VS.85).aspx">MSDN</a></p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">Type</span><br />
<span class="co1">// this callback function does not return a value as described on mdsn.</span></p>
<p>&nbsp; TFnMsgeCallback = <span class="kw1">function</span> <span class="br0">&#40;</span>bVerbose: <span class="kw4">Boolean</span>; lpMessage: <span class="kw4">PWideChar</span><span class="br0">&#41;</span>: <span class="kw4">Cardinal</span>; <span class="kw1">stdcall</span>;</p>
<p><span class="co1">// this structure stores information about a Winlogon event.</span></p>
<p>TWlxNotificationInfo = <span class="kw1">record</span><br />
&nbsp; &nbsp; Size: <span class="kw4">Cardinal</span>;<br />
&nbsp; &nbsp; Flags: <span class="kw4">Cardinal</span>;<br />
&nbsp; &nbsp; UserName: <span class="kw4">PWideChar</span>;<br />
&nbsp; &nbsp; Domain: <span class="kw4">PWideChar</span>;<br />
&nbsp; &nbsp; WindowStation: <span class="kw4">PWideChar</span>;<br />
&nbsp; &nbsp; Token: <span class="kw4">Cardinal</span>;<br />
&nbsp; &nbsp; Desktop: <span class="kw4">Cardinal</span>;<br />
&nbsp; &nbsp; StatusCallback: TFnMsgeCallback;<br />
&nbsp; <span class="kw1">end</span>;<br />
&nbsp; PWlxNotificationInfo = ^TWlxNotificationInfo;</p>
<p><span class="coMULTI">{ &nbsp;winlogon can inform about the following events:<br />
Lock,<br />
Lockoff,<br />
Logon,<br />
Shutdown,<br />
StartScreensave,<br />
StartShell,<br />
StartUp,<br />
StopScreenSaver,<br />
Unlock</p>
<p>For a complete describtion of those events look at: </p>
<p>http://msdn.microsoft.com/en-us/library/aa380544(VS.85).aspx<br />
}</span></p>
<p><span class="co1">// example of handling the Logon Message</span></p>
<p><span class="kw1">procedure</span> LogonHandler<span class="br0">&#40;</span>Info: PWlxNotificationInfo<span class="br0">&#41;</span>; <span class="kw1">stdcall</span>;<br />
<span class="kw1">begin</span></p>
<p><span class="kw1">end</span>;</p>
<p><span class="co1">// the entrance function for DLL</span></p>
<p><span class="kw1">procedure</span> EntryPointProc<span class="br0">&#40;</span>reason: <span class="kw4">integer</span><span class="br0">&#41;</span>;<br />
<span class="kw1">begin</span><br />
&nbsp; <span class="kw1">case</span> reason <span class="kw1">of</span><br />
&nbsp; &nbsp; DLL_PROCESS_ATTACH: &nbsp;<span class="co1">//1</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">Begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// Disable DLL_THREAD_ATTACH &amp;amp; DLL_THREAD_DETACH</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// notification calls. This is a performance optimization</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// for multithreaded applications that do not need</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// thread-level notifications of attachment or</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// detachment.</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; DisableThreadLibraryCalls<span class="br0">&#40;</span>hInstance<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; &nbsp; DLL_THREAD_ATTACH: &nbsp; <span class="co1">//2</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">begin</span></p>
<p>&nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; &nbsp; DLL_PROCESS_DETACH: &nbsp;<span class="co1">//3</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">begin</span></p>
<p>&nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; &nbsp; DLL_THREAD_DETACH: &nbsp; <span class="co1">//0</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">begin</span></p>
<p>&nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; <span class="kw1">end</span>;</p>
<p><span class="kw1">end</span>;</p>
<p><span class="co1">// define the exports for the DLL</span></p>
<p>exports<br />
&nbsp; LogonHandler;</p>
<p><span class="kw1">begin</span><br />
&nbsp; DllProc := @EntryPointProc;<br />
&nbsp; DllProc<span class="br0">&#40;</span>DLL_PROCESS_ATTACH<span class="br0">&#41;</span>;<br />
<span class="kw1">end</span>.</div>
<p>Our Prototype, is ready to use. The compiled DLL has to be in the following folder:</p>
<p style="padding-left: 30px;"><strong> C:\Windows\System32 </strong>(adapt it to your environment)<strong><br />
</strong></p>
<p>Now we can inform the operating system that we created a <strong>Winlogon Notification Package. </strong>This step will be done in the registry under the following key:</p>
<p style="padding-left: 30px;"><strong>HKey_Local_Machine\Software\Microsoft\WindowsNT\<br />
CurrentVersion\Winlogon\Notify\YourNotification </strong></p>
<table class="MsoTableMediumList2Accent1" style="border: medium none; width: 73.16%; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="73%">
<tbody>
<tr>
<td style="padding: 0cm 5.4pt; background: white none repeat scroll 0%; width: 21.78%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium medium 3pt none none solid -moz-use-text-color -moz-use-text-color #4f81bd;" width="21%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Name</span></p>
</td>
<td style="padding: 0cm 5.4pt; background: white none repeat scroll 0%; width: 20.94%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium medium 3pt none none solid -moz-use-text-color -moz-use-text-color #4f81bd;" width="20%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">Type</span></p>
</td>
<td style="padding: 0cm 5.4pt; background: white none repeat scroll 0%; width: 57.28%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium medium 3pt none none solid -moz-use-text-color -moz-use-text-color #4f81bd;" width="57%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">Value</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; background: white none repeat scroll 0%; width: 21.78%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium 1pt medium medium none solid none none -moz-use-text-color #4f81bd -moz-use-text-color -moz-use-text-color;" width="21%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">DLLName</span></p>
</td>
<td style="border: medium none; padding: 0cm 5.4pt; background: #d3dfee none repeat scroll 0%; width: 20.94%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" width="20%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">REG_SZ</span></p>
</td>
<td style="padding: 0cm 5.4pt; background: #d3dfee none repeat scroll 0%; width: 57.28%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium 1pt medium medium none solid none none -moz-use-text-color #4f81bd -moz-use-text-color -moz-use-text-color;" width="57%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">C:\Windows\System32\YourDLLName.dll</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; background: white none repeat scroll 0%; width: 21.78%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium 1pt medium medium none solid none none -moz-use-text-color #4f81bd -moz-use-text-color -moz-use-text-color;" width="21%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Asynchronous</span></p>
</td>
<td style="border: medium none; padding: 0cm 5.4pt; width: 20.94%;" width="20%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">REG_DWORD</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 57.28%; border: medium 1pt medium medium none solid none none -moz-use-text-color #4f81bd -moz-use-text-color -moz-use-text-color;" width="57%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">0</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; background: white none repeat scroll 0%; width: 21.78%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium 1pt medium medium none solid none none -moz-use-text-color #4f81bd -moz-use-text-color -moz-use-text-color;" width="21%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span lang="EN-US">Impersonate</span></p>
</td>
<td style="border: medium none; padding: 0cm 5.4pt; background: #d3dfee none repeat scroll 0%; width: 20.94%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" width="20%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">REG_DWORD</span></p>
</td>
<td style="padding: 0cm 5.4pt; background: #d3dfee none repeat scroll 0%; width: 57.28%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium 1pt medium medium none solid none none -moz-use-text-color #4f81bd -moz-use-text-color -moz-use-text-color;" width="57%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">0</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; background: white none repeat scroll 0%; width: 21.78%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; border: medium 1pt medium medium none solid none none -moz-use-text-color #4f81bd -moz-use-text-color -moz-use-text-color;" width="21%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="color: black;">Logon</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 20.94%; border: medium medium 1pt none none solid -moz-use-text-color -moz-use-text-color #4f81bd;" width="20%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span lang="EN-US">REG_SZ</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 57.28%; border: medium 1pt 1pt medium none solid solid none -moz-use-text-color #4f81bd #4f81bd -moz-use-text-color;" width="57%" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"><span style="color: black;">LogonHandler</span></p>
</td>
</tr>
</tbody>
</table>
<p>The valid values are described in this <a href="http://msdn.microsoft.com/en-us/library/aa379402(VS.85).aspx">MSDN article.</a></p>
<p><strong>Creating the PNG Image</strong></p>
<p>For completing this Project you will need to download the following:</p>
<p><strong>Graphics32 Library</strong><br />
<em>Graphics32 is a graphics library for Delphi and Kylix/CLX. Optimized for 32-bit pixel formats, it provides fast operations with pixels and graphic primitives. In most cases Graphics32 considerably outperforms the standard TBitmap/TCanvas methods.</em></p>
<p><strong>PNG Components<br />
</strong><em>Delphi VCL Components with PNG Image support.</em></p>
<p>What you&#8217;ll need is an already exisiting PNG or a new one. I&#8217;ll use with the <a href="http://blog.delphi-jedi.net/home/">Jedi Api WSCL Logo</a>.<br />
Open the Logo in Photoshop but remember this can be done in almost any other Graphic Application which supports PNG and layer based drawing.</p>
<p>The Logo from this site is already a PNG, so you will see a transparent background when it is opened in Photoshop. If you like to add a drop shadow style to it, you won&#8217;t see it,because of the mentioned transparent background. It is also a problem on a black background, btw. So first thing to do is to add a temporary background layer into the Logo. To do so, click on the &#8220;<strong>Create New Layer Symbol</strong>&#8221; in the layer palette (indicated as a small notepad icon).</p>
<p>Now select the new created layer by clicking on it and drag it behind the Logo layer. With the new layer still selected, switch to the &#8220;Tools Window&#8221; and select the &#8220;<strong>Paint Bucket Tool</strong>&#8220;. Select white as your foreground color. If you have another color as foreground color, <strong>simply press d and then x</strong>. In this way it will reset the foreground and backgound colors. Now click inside your image on the transparent part and you&#8217;ll see the Logo with a white background applied.</p>
<p>Switch to your layers palette and double click on the Logo layer. The &#8220;Layers Styles Dialog&#8221; should be visible now. Select &#8220;Drop Shadow&#8221; and you can adjust the angle of the drop shadow and its size. While you adjust it, also watch the Logo. Photoshop shows you a preview of the changes. If you&#8217;re satisfied with your settings hit ok.</p>
<p>At this time, we don&#8217;t need our white background layer anymore, so select it and drag it to the trash can symbol in the layer palette. It will be deleted then. Afterwards save the Logo, select PNG as the file format and a new window will appear (PNG Options). Select none and hit ok.</p>
<p>There also exists a small <a href="#Downloads">video presentation</a> which will help you<strong>.</strong></p>
<p><strong>Drawing the PNG onto the Form Canvas</strong></p>
<p>The following source is kindly provided by <strong>Coder90</strong>. He wrote a nice example in a german delphi <a href="http://www.delphipraxis.net/post606056.html#606056">forum<br />
</a></p>
<p><strong>The Sources<br />
</strong>I won&#8217;t go into any details here, basically the procedure will load the PNG into a Bitmap32 Object and blends it to the forms canvas.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">Type</span><br />
<span class="kw1">interface</span></p>
<p><span class="kw1">uses</span><br />
&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br />
&nbsp; Dialogs, ExtCtrls, StdCtrls, GR32;</p>
<p>&nbsp; <span class="kw1">public</span><br />
&nbsp; &nbsp; <span class="coMULTI">{ Public declarations }</span><br />
&nbsp; &nbsp; BMP32 : TBitmap32;<br />
&nbsp; &nbsp; BlendF: TBlendFunction;<br />
&nbsp; &nbsp; P: TPoint;<br />
&nbsp; &nbsp; Size: TSize;<br />
&nbsp; &nbsp; <span class="kw1">procedure</span> BlendIt;<br />
&nbsp; <span class="kw1">end</span>;</p>
<p>&nbsp; <span class="kw1">procedure</span> LoadPNGintoBitmap32<span class="br0">&#40;</span>DstBitmap: TBitmap32;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Filename: <span class="kw4">String</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out AlphaChannelUsed: <span class="kw4">Boolean</span><span class="br0">&#41;</span>; <span class="kw1">overload</span>;</p>
<p>&nbsp; <span class="kw1">procedure</span> LoadPNGintoBitmap32<span class="br0">&#40;</span>DstBitmap: TBitmap32;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SrcStream: TStream;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out AlphaChannelUsed: <span class="kw4">Boolean</span><span class="br0">&#41;</span>; <span class="kw1">overload</span>;</p>
<p>&nbsp; <span class="kw1">procedure</span> LoadPNGintoBitmap32<span class="br0">&#40;</span>DstBitmap: TBitmap32;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; szSection : <span class="kw4">PChar</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; szName &nbsp; &nbsp;: <span class="kw4">String</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out AlphaChannelUsed: <span class="kw4">Boolean</span><span class="br0">&#41;</span>; <span class="kw1">overload</span>;</p>
<p><span class="kw1">uses</span> PNGImage;</p>
<p><span class="kw1">procedure</span> LoadPNGintoBitmap32<span class="br0">&#40;</span>DstBitmap: TBitmap32;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SrcStream: TStream;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out AlphaChannelUsed: <span class="kw4">Boolean</span><span class="br0">&#41;</span>;<br />
<span class="kw1">var</span><br />
&nbsp; PNGObject: TPNGObject;<br />
&nbsp; TransparentColor: TColor32;<br />
&nbsp; PixelPtr: PColor32;<br />
&nbsp; AlphaPtr: <span class="kw4">PByte</span>;<br />
&nbsp; X, Y: <span class="kw4">Integer</span>;<br />
<span class="kw1">begin</span><br />
&nbsp; PNGObject := <span class="kw2">nil</span>;<br />
&nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; PNGObject := TPngObject.<span class="me1">Create</span>;<br />
&nbsp; &nbsp; PNGObject.<span class="me1">LoadFromStream</span><span class="br0">&#40;</span>SrcStream<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; DstBitmap.<span class="me1">Assign</span><span class="br0">&#40;</span>PNGObject<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; DstBitmap.<span class="me1">ResetAlpha</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">case</span> PNGObject.<span class="me1">TransparencyMode</span> <span class="kw1">of</span><br />
&nbsp; &nbsp; &nbsp; ptmPartial:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>PNGObject.<span class="me1">Header</span>.<span class="me1">ColorType</span> = COLOR_GRAYSCALEALPHA<span class="br0">&#41;</span> <span class="kw1">or</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>PNGObject.<span class="me1">Header</span>.<span class="me1">ColorType</span> = COLOR_RGBALPHA<span class="br0">&#41;</span> <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PixelPtr := PColor32<span class="br0">&#40;</span>@DstBitmap.<span class="me1">Bits</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> Y := <span class="nu0">0</span> <span class="kw1">to</span> DstBitmap.<span class="me1">Height</span> &#8211; <span class="nu0">1</span> <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AlphaPtr := <span class="kw4">PByte</span><span class="br0">&#40;</span>PNGObject.<span class="me1">AlphaScanline</span><span class="br0">&#91;</span>Y<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> X := <span class="nu0">0</span> <span class="kw1">to</span> DstBitmap.<span class="me1">Width</span> &#8211; <span class="nu0">1</span> <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PixelPtr^ := <span class="br0">&#40;</span>PixelPtr^ <span class="kw1">and</span> <span class="re0">$00FFFFFF</span><span class="br0">&#41;</span> <span class="kw1">or</span> <span class="br0">&#40;</span>TColor32<span class="br0">&#40;</span>AlphaPtr^<span class="br0">&#41;</span> <span class="kw1">shl</span> <span class="nu0">24</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Inc</span><span class="br0">&#40;</span>PixelPtr<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Inc</span><span class="br0">&#40;</span>AlphaPtr<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AlphaChannelUsed := <span class="kw2">True</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; &nbsp; &nbsp; ptmBit:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TransparentColor := Color32<span class="br0">&#40;</span>PNGObject.<span class="me1">TransparentColor</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PixelPtr := PColor32<span class="br0">&#40;</span>@DstBitmap.<span class="me1">Bits</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> X := <span class="nu0">0</span> <span class="kw1">to</span> <span class="br0">&#40;</span>DstBitmap.<span class="me1">Height</span> &#8211; <span class="nu0">1</span><span class="br0">&#41;</span> * <span class="br0">&#40;</span>DstBitmap.<span class="me1">Width</span> &#8211; <span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> PixelPtr^ = TransparentColor <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PixelPtr^ := PixelPtr^ <span class="kw1">and</span> <span class="re0">$00FFFFFF</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Inc</span><span class="br0">&#40;</span>PixelPtr<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AlphaChannelUsed := <span class="kw2">True</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; &nbsp; &nbsp; ptmNone:<br />
&nbsp; &nbsp; &nbsp; &nbsp; AlphaChannelUsed := <span class="kw2">False</span>;<br />
&nbsp; &nbsp; <span class="kw1">end</span>;<br />
&nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">Assigned</span><span class="br0">&#40;</span>PNGObject<span class="br0">&#41;</span> <span class="kw1">then</span> PNGObject.<span class="me1">Free</span>;<br />
&nbsp; <span class="kw1">end</span>;<br />
<span class="kw1">end</span>;</p>
<p><span class="kw1">procedure</span> LoadPNGintoBitmap32<span class="br0">&#40;</span>DstBitmap: TBitmap32;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Filename: <span class="kw4">String</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out AlphaChannelUsed: <span class="kw4">Boolean</span><span class="br0">&#41;</span>;<br />
<span class="kw1">var</span><br />
&nbsp; FileStream: TFileStream;<br />
<span class="kw1">begin</span><br />
&nbsp; FileStream := TFileStream.<span class="me1">Create</span><span class="br0">&#40;</span>Filename, fmOpenRead<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; LoadPNGintoBitmap32<span class="br0">&#40;</span>DstBitmap, FileStream, AlphaChannelUsed<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; FileStream.<span class="me1">Free</span>;<br />
&nbsp; <span class="kw1">end</span>;<br />
<span class="kw1">end</span>;</p>
<p><span class="kw1">procedure</span> LoadPNGintoBitmap32<span class="br0">&#40;</span>DstBitmap: TBitmap32;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; szSection : <span class="kw4">PChar</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; szName &nbsp; &nbsp;: <span class="kw4">String</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out AlphaChannelUsed: <span class="kw4">Boolean</span><span class="br0">&#41;</span>;<br />
<span class="kw1">var</span><br />
&nbsp; Stream: TResourceStream;<br />
<span class="kw1">begin</span><br />
&nbsp; Stream := TResourceStream.<span class="me1">Create</span><span class="br0">&#40;</span>hInstance, szName, <span class="kw4">PChar</span><span class="br0">&#40;</span>szSection<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; LoadPNGintoBitmap32<span class="br0">&#40;</span>DstBitmap, Stream, AlphaChannelUsed<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; &nbsp;Stream.<span class="me1">Free</span>;<br />
&nbsp; &nbsp;<span class="kw1">end</span>;<br />
<span class="kw1">end</span>;</p>
<p><span class="coMULTI">{ Works only Win2000_Up }</span></p>
<p><span class="kw1">procedure</span> TForm1.<span class="me1">BlendIt</span>;<br />
&nbsp; <span class="kw1">var</span><br />
&nbsp; &nbsp; Alpha: <span class="kw4">Boolean</span>;<br />
<span class="kw1">begin</span><br />
&nbsp; BMP32 := TBitmap32.<span class="me1">Create</span>;<br />
&nbsp;<span class="coMULTI">{Load PNG from File<br />
&nbsp; LoadPNGintoBitmap32(BMP32, ExtractFilePath(ParamStr(0)) + &#8216;WSCL.png&#8217;, Alpha);<br />
&nbsp;}</span><br />
&nbsp; <span class="co1">// Load PNG From Resource</span><br />
&nbsp; LoadPNGintoBitmap32<span class="br0">&#40;</span>BMP32, <span class="kw4">PChar</span><span class="br0">&#40;</span><span class="st0">&#8216;PNG&#8217;</span><span class="br0">&#41;</span>, <span class="st0">&#8216;WSCL&#8217;</span>, Alpha<span class="br0">&#41;</span>;</p>
<p>&nbsp; setWindowLong<span class="br0">&#40;</span>Handle, GWL_EXSTYLE,<br />
&nbsp; getWindowLong<span class="br0">&#40;</span>Handle, GWL_EXSTYLE<span class="br0">&#41;</span> <span class="kw1">or</span> WS_EX_LAYERED <span class="coMULTI">{or WS_EX_TRANSPARENT}</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="co1">// WS_EX_TRANSPARENT makes the Window for MouseClicks transparent&#8230;</span></p>
<p>&nbsp; BlendF.<span class="me1">BlendOp</span> := AC_SRC_OVER;<br />
&nbsp; BlendF.<span class="me1">BlendFlags</span> := <span class="nu0">0</span>;<br />
&nbsp; BlendF.<span class="me1">SourceConstantAlpha</span> := <span class="nu0">255</span>;<br />
&nbsp; BlendF.<span class="me1">AlphaFormat</span> := AC_SRC_ALPHA;<br />
&nbsp; P := Point<span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;<br />
&nbsp; Size.<span class="me1">cx</span> := BMP32.<span class="me1">Width</span>;<br />
&nbsp; Size.<span class="me1">cy</span> := BMP32.<span class="me1">Height</span>;</p>
<p>&nbsp; UpdateLayeredWindow<span class="br0">&#40;</span>Handle, <span class="nu0">0</span>, <span class="kw2">nil</span>, @Size, BMP32.<span class="me1">Handle</span>, @P, <span class="nu0">0</span>, @BlendF, ULW_ALPHA<span class="br0">&#41;</span>;</p>
<p>&nbsp; <span class="co1">// Set Window on Top</span><br />
&nbsp; SetWindowPos<span class="br0">&#40;</span>Handle, HWND_TOPMOST, Left, Top, Width, Height,<br />
&nbsp; SWP_NOACTIVATE <span class="kw1">or</span> SWP_NOMOVE <span class="kw1">or</span> SWP_NOSIZE<span class="br0">&#41;</span>;</p>
<p>&nbsp; <span class="co1">// Set Parent to Desktop</span><br />
&nbsp; SetWindowLong<span class="br0">&#40;</span>Handle, GWL_HWNDPARENT, <span class="nu0">0</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; <span class="co1">// Hide Window from Taskbar</span><br />
&nbsp; SetWindowLong<span class="br0">&#40;</span>Handle, GWL_EXSTYLE,<br />
&nbsp; GetWindowLong<span class="br0">&#40;</span>Handle, GWL_EXSTYLE<span class="br0">&#41;</span> <span class="kw1">or</span><br />
&nbsp; WS_EX_TOOLWINDOW <span class="kw1">and</span> <span class="kw1">not</span> WS_EX_APPWINDOW<span class="br0">&#41;</span>;<br />
<span class="kw1">end</span>;</div>
<p>Call it in the FormOnCreate handler and don&#8217;t forget to free the Bitmap32 Object, a good place e.g. would be on the FormOnDestroy Handler.</p>
<p><strong>Additional informations for you</strong></p>
<p>I have to tell you that the first version of this package was slightly different than the one I’ll post here.<br />
Well I used an external executeable which was called from my DLL when the LogonEvent was called.</p>
<p>But I encountered a big problem with that technique. One of the biggest problems were that my external application was executed more then once. Additionally I wasn’t able to close it. Neither Application.Terminate nor Application.Mainform.Close worked here. I did some experiments with a mutex which worked in some cases, but then, Christian Wimmer gave me many good ideas and suggestions.</p>
<p>So the improvements were:</p>
<ol>
<li>The transparent Window is now directly created inside of the Winlogon Process by creating a new thread object.</li>
<li>Christian implemented an TApplication.OnIdle handler inside the thread object which will safely close the transparent window when it isn&#8217;t needed anymore.</li>
</ol>
<h3>Prerequisites:</h3>
<p>The following Delphi packages are necessary. They are not included and must therfore downloaded and installed (if necessary) separately. Please, also recognize the license of these packages. The winlogon examples does only have a Copyright and no Warranty license.</p>
<h3>Download:<a name="Downloads"></a></h3>
<p>3rd Party Components and Library&#8217;s you need to download:<br />
<a href="https://sourceforge.net/projects/graphics32/">Graphics32</a><br />
<a href="http://www.thany.org/article/18/Delphi_components">PNG Components</a></p>
<p>Jedi Tutorial Files:<a href="http://www.thany.org/article/18/Delphi_components"><br />
</a><a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/05/vid.avi">Photoshop Tutorial<br />
</a>(dowload size: 2.12 MB Format: AVI)<a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/05/vid.avi"><br />
</a><a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/05/winlogon.zip">winlogon<br />
</a>(dowload size: 82.2 KB Format: ZIP)</p>
<h2>Warning:</h2>
<p>If you want to use such a Winlogon Notification DLL in a productive system you have to make sure that the wrong person can&#8217;t manipulate the DLL file. This can be done by setting the file&#8217;s access control list to allow only write access to SYSTEM and Administrators. There is no need for other users to have even read access, since the DLL is only used by winlogon. Furthermore you should save this file in a save place like the System32 folder.</p>
<p><strong>Conclusion:</strong></p>
<p>I hope you learned something new and had as much fun as I had writing this little tutorial for you!<br />
My biggest thanks fly out to Christian Wimmer for all his support and help for making me finish this project.</p>
<p>Kindest regards<br />
stOrM!</p>
<p>(contact by comments or <a href="http://blog.delphi-jedi.net/about/">mail @ JEDI</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2008/05/27/winlogon-notification-package/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
<enclosure url="http://blog.delphi-jedi.net/wp-content/uploads/2008/05/vid.avi" length="2232108" type="video/x-msvideo" />
		</item>
		<item>
		<title>AutoPointer with JWSCL [Update]</title>
		<link>http://blog.delphi-jedi.net/2008/05/25/autopointer-with-jwscl/</link>
		<comments>http://blog.delphi-jedi.net/2008/05/25/autopointer-with-jwscl/#comments</comments>
		<pubDate>Sun, 25 May 2008 10:00:11 +0000</pubDate>
		<dc:creator>Christian Wimmer</dc:creator>
				<category><![CDATA[Downloads]]></category>
		<category><![CDATA[JEDI Windows Security Code Lib]]></category>
		<category><![CDATA[JWSCL]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/?p=126</guid>
		<description><![CDATA[JWSCL provides access to auto pointers or objects. It means that allocated space or objects are automtically destroyed/freed as soon as the auto object runs out of scope. What is a scope? A scope exists as long as the (I say) parent object exists. Parent objects can be: The process. The auto pointer and thus [...]]]></description>
			<content:encoded><![CDATA[<p>JWSCL provides access to auto pointers or objects. It means that allocated space or objects are automtically destroyed/freed as soon as the auto object runs out of scope. What is a scope? A scope exists as long as the (I say) parent object exists. Parent objects can be:</p>
<ol>
<li>The process. The auto pointer and thus the object exist as long as the process runs. The object will be destroyed when the process is destroyed.</li>
<li>A class or record. The auto pointer exists as long as the class instance exists. If the instance is freed the managed auto pointer object will be freed as well.</li>
</ol>
<p>What is not a parent object?</p>
<ol>
<li>begin end. In contrast to C++, a begin/end construct does not allow to create a variable scope. You have to create a new function do achieve the same effect.</li>
<li>A pointer to an object. Auto pointer to any object (class, record, variable) will not be automatically destroyed. You have to free the memory manually (Dispose, FreeMem) to let the auto pointer take effect.</li>
</ol>
<p>The current release only allows to create or wrap objects. It is done by the methods of <a href="http://jwscldoc.delphi-jedi.net/JwsclComUtils.TJwAutoPointer.html#%40Methods">TJwAutoPointer</a>.</p>
<p>The following sample shows how to avoid to manually call free. It uses the Wrap method of TJwAutoPointer to activate the managed pointer mechanism. There is no method to undo this call.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">procedure</span> X;<br />
<span class="kw1">var</span><br />
&nbsp; ManagedObject : TJwSecurityID;<br />
&nbsp; AutoPtr : IJwAutoPointer;<br />
<span class="kw1">begin</span><br />
&nbsp; ManagedObject := TJwSecurityID.<span class="me1">Create</span><span class="br0">&#40;</span>&#8230;<span class="br0">&#41;</span>;<br />
&nbsp; AutoPtr := TJwAutoPointer.<span class="me1">Wrap</span><span class="br0">&#40;</span>ManagedObject<span class="br0">&#41;</span>;<br />
&#8230;<br />
<span class="co1">//no need to free ManagedObject</span><br />
<span class="kw1">end</span>;</div>
<p>The advantage of the auto pointer approach is that we do not need to call Free for every possible exit. Even exceptions cannot avoid that the managed object is destroyed.<br />
The next sample demonstrates this fact.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">procedure</span> X;<br />
<span class="kw1">var</span><br />
&nbsp; ManagedObject : TJwSecurityID;<br />
&nbsp; AutoPtr : IJwAutoPointer;<br />
<span class="kw1">begin</span><br />
&nbsp; ManagedObject := TJwSecurityID.<span class="me1">Create</span><span class="br0">&#40;</span>&#8230;<span class="br0">&#41;</span>;<br />
&nbsp; AutoPtr := TJwAutoPointer.<span class="me1">Wrap</span><span class="br0">&#40;</span>ManagedObject<span class="br0">&#41;</span>;</p>
<p>&nbsp; <span class="kw1">if</span> DoExit <span class="kw1">then</span><br />
&nbsp; &nbsp;<span class="kw3">exit</span>;</p>
<p>&nbsp; <span class="kw1">if</span> Error <span class="kw1">then</span><br />
&nbsp; &nbsp;<span class="kw1">raise</span> Exception.<span class="me1">Create</span><span class="br0">&#40;</span>&#8230;<span class="br0">&#41;</span>;<br />
&nbsp; &#8230;<br />
&nbsp; <span class="co1">//no need to free ManagedObject</span><br />
<span class="kw1">end</span>;</div>
<p>The same way can be used to add the IJwAutoPointer variable into classes and records.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">uses</span><br />
&nbsp; SysUtils,<br />
&nbsp; JwsclComUtils;<br />
<span class="kw1">type</span><br />
&nbsp; TMyClass = <span class="kw1">class</span><br />
&nbsp; <span class="kw1">public</span><br />
&nbsp; &nbsp; N : <span class="kw4">String</span>;<br />
&nbsp; &nbsp; x : IJwAutoPointer;<br />
&nbsp; &nbsp; <span class="kw1">constructor</span> Create<span class="br0">&#40;</span>Name : <span class="kw4">String</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw1">destructor</span> Destroy; <span class="kw1">override</span>;<br />
&nbsp; <span class="kw1">end</span>;</p>
<p>TMyRecord = <span class="kw1">record</span><br />
&nbsp; x : IJwAutoPointer;<br />
<span class="kw1">end</span>;</p>
<p><span class="kw1">constructor</span> TMyClass.<span class="me1">Create</span><span class="br0">&#40;</span>Name: <span class="kw4">String</span><span class="br0">&#41;</span>;<br />
<span class="kw1">begin</span><br />
&nbsp; <span class="kw1">inherited</span> Create;<br />
&nbsp; <span class="kw3">Writeln</span><span class="br0">&#40;</span><span class="st0">&#8216;Create :&#8217;</span>,Name<span class="br0">&#41;</span>;<br />
&nbsp; N := Name;<br />
<span class="kw1">end</span>;</p>
<p><span class="kw1">destructor</span> TMyClass.<span class="me1">Destroy</span>;<br />
<span class="kw1">begin</span><br />
&nbsp; <span class="kw3">Writeln</span><span class="br0">&#40;</span><span class="st0">&#8216;DesTMyRecordoy: &#8216;</span>,N<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">inherited</span>;<br />
<span class="kw1">end</span>;</p>
<p><span class="kw1">procedure</span> X;<br />
<span class="kw1">var</span> Y,Z : TMyClass;<br />
<span class="kw1">begin</span><br />
&nbsp; Y := TMyClass.<span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">&#8217;1&#8242;</span><span class="br0">&#41;</span>;<br />
&nbsp; Z := TMyClass.<span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">&#8217;2&#8242;</span><span class="br0">&#41;</span>;<br />
&nbsp; Y.<span class="me1">x</span> := TJwAutoPointer.<span class="me1">Wrap</span><span class="br0">&#40;</span>Z<span class="br0">&#41;</span>;</p>
<p>&nbsp; Y.<span class="me1">Free</span>;<br />
<span class="kw1">end</span>;</p>
<p><span class="kw1">procedure</span> Y<span class="br0">&#40;</span>UseDispose : <span class="kw4">Boolean</span><span class="br0">&#41;</span>;<br />
<span class="kw1">var</span><br />
&nbsp; L : TMyRecord;<br />
&nbsp; pL : ^TMyRecord;<br />
&nbsp; Y : TMyClass;<br />
<span class="kw1">begin</span><br />
&nbsp; <span class="kw3">new</span><span class="br0">&#40;</span>pL<span class="br0">&#41;</span>;<br />
&nbsp; Y := TMyClass.<span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">&#8217;1&#8242;</span><span class="br0">&#41;</span>;<br />
&nbsp; PL.<span class="me1">x</span> := TJwAutoPointer.<span class="me1">Wrap</span><span class="br0">&#40;</span>Y<span class="br0">&#41;</span>;</p>
<p>&nbsp; <span class="kw3">writeln</span>;<br />
&nbsp; <span class="kw1">if</span> UseDispose &nbsp;<span class="kw1">then</span><br />
&nbsp; &nbsp;<span class="kw3">dispose</span><span class="br0">&#40;</span>PL<span class="br0">&#41;</span>;<br />
<span class="kw1">end</span>;</div>
<p>A call to X returns:</p>
<p style="padding-left: 30px;">Create :1<br />
Create :2<br />
Destroy: 1<br />
Destroy: 2</p>
<p>As you can see, the managed object (Name : &#8220;2&#8243;) is shortly destroyed after the parent object is destroyed. You should know about this fact, because accessing the parent object will fail (if you are luck) in an exception.</p>
<p>A call to Y(false) returns</p>
<p style="padding-left: 30px;">Create :1</p>
<p>A call to Y(true) returns</p>
<p style="padding-left: 30px;">Create :1<br />
Destroy: 1</p>
<p>The next release of <strong>JWSCL</strong> will bring support for pointers created by <strong>New</strong> and <strong>GetMem</strong> as well as <strong>LocalAlloc</strong>. It will also implement thread safe locking mechanisms.</p>
<h2>[Update]</h2>
<p>There is no need to save the COM object if you want to keep the object only alive in a single function.<br />
Just wrap it.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">procedure</span> X;<br />
<span class="kw1">var</span> Y,Z : TMyClass;<br />
<span class="kw1">begin</span><br />
&nbsp; Y := TMyClass.<span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">&#8217;1&#8242;</span><span class="br0">&#41;</span>;<br />
&nbsp; TJwAutoPointer.<span class="me1">Wrap</span><span class="br0">&#40;</span>Y<span class="br0">&#41;</span>;<br />
<span class="kw1">end</span>;</div>
<p>You even can wrap it several times. All wrapped up instances will be freed, regardeless of the variable&#8217;s name.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">procedure</span> X;<br />
<span class="kw1">var</span> Y,Z : TMyClass;<br />
<span class="kw1">begin</span><br />
&nbsp; Y := TMyClass.<span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">&#8217;1&#8242;</span><span class="br0">&#41;</span>;<br />
&nbsp; TJwAutoPointer.<span class="me1">Wrap</span><span class="br0">&#40;</span>Y<span class="br0">&#41;</span>;</p>
<p>&nbsp; Y := TMyClass.<span class="me1">Create</span><span class="br0">&#40;</span><span class="st0">&#8217;2&#8242;</span><span class="br0">&#41;</span>;<br />
&nbsp; TJwAutoPointer.<span class="me1">Wrap</span><span class="br0">&#40;</span>Y<span class="br0">&#41;</span>;<br />
<span class="kw1">end</span>;</div>
<p>Of course you can&#8217;t access the first object anymore. But sometimes it comes quite handy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2008/05/25/autopointer-with-jwscl/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>RunAsSYS 1.0 preview [update#1]</title>
		<link>http://blog.delphi-jedi.net/2008/05/08/runassys-10-preview/</link>
		<comments>http://blog.delphi-jedi.net/2008/05/08/runassys-10-preview/#comments</comments>
		<pubDate>Thu, 08 May 2008 19:10:53 +0000</pubDate>
		<dc:creator>Christian Wimmer</dc:creator>
				<category><![CDATA[JWSCL Downloads]]></category>
		<category><![CDATA[JWSCL]]></category>
		<category><![CDATA[RunAsSYS]]></category>
		<category><![CDATA[Token]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/?p=141</guid>
		<description><![CDATA[This is the preview Version of RunAsSys for Windows XP and Vista made with the help of JWSCL. RunAsSys runs applications as SYSTEM user in the current user&#8217;s session. If you start it without any parameters it creates a command prompt with SYSTEM privileges by default. Otherwise you can add an application with parameters to [...]]]></description>
			<content:encoded><![CDATA[<p>This is the preview Version of RunAsSys for Windows XP and Vista  made with the help of JWSCL.<br />
 RunAsSys runs applications as SYSTEM user in the current user&#8217;s session.  If you start it without any parameters it creates a command prompt with SYSTEM privileges by default. Otherwise  you can add an application with parameters to start this process as  SYSTEM user. Use quotation marks if necessary for your path.<br />
 On Windows Vista and UAC it should prompt you for elevation. On XP  without Admin privileges it should prompt you for Admin credentials.</p>
<p><strong>Warning</strong>: On Windows XP (and older) the application shows the credential prompt dialog which allows you to run as the same user. If you just click OK button, the application will maybe response one more time but finally stop working. This is due to a bug in ShellExecuteEx with &#8220;runas&#8221; verb.</p>
<h3>UPDATE</h3>
<h3>Version 1.2</h3>
<p>This version fixes a bug that prevents the command prompt to be started sometimes. And it fixes a bug with Windows 7 where a dialog pops up with no use. (Most problems are fixed with the new JWSCL)<br />
 This version is also available as <a href="https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwscl/branches/0.9.4a/examples/RunAsSys" target="_blank">source</a> (Subversion Link) from the preRelease of <a href="tsvn:https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwapi/branches/2.3"> </a><a href="https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwapi/branches/2.4a" target="_blank">JWA 2.4a</a> (Subversion Link) and <a href="https://jedi-apilib.svn.sourceforge.net/svnroot/jedi-apilib/jwscl/branches/0.9.4a" target="_blank">JWSCL 0.9.4a</a> (Subversion Link).</p>
<p><a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/05/runassys12.zip">Download RunAsSys 1.2</a></p>
<p><strong>Version 1.1</strong></p>
<p>I publish Version 1.1 which fixes several errors and also makes it available to Windows 64bit systems.<br />
 The zip archive contains a 64bit version registry key file that is compatible with WOW64.<br />
 RunAsSys contains EurekaLog, which logs internal things. If you get an error, you can send the error report directly to us. However it is not the default behaviour. We use your error report only for improving our software. It will be used internally only and will be finally deleted. No screenshot is taken.</p>
<p><a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/05/runassys111.zip">Download RunAsSys 1.1</a></p>
<p><strong>Version 1.0</strong></p>
<p>Additional Info:<br />
 The reg file creates a reg key that is used to enable logging and set  the log output folder (default where exe resides)<br />
 It is located in HKEY_LOCAL_MACHINE\SOFTWARE\JEDI\WSCL\RunAsSys\1.0</p>
<p><a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/04/runassys.zip">Download RunAsSYS 1.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2008/05/08/runassys-10-preview/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>The Delphi JEDI Project needs your help</title>
		<link>http://blog.delphi-jedi.net/2008/04/20/the-delphi-jedi-project-needs-your-help/</link>
		<comments>http://blog.delphi-jedi.net/2008/04/20/the-delphi-jedi-project-needs-your-help/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 20:16:40 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Common]]></category>
		<category><![CDATA[JEDI Windows API Headers]]></category>
		<category><![CDATA[JEDI Windows Security Code Lib]]></category>
		<category><![CDATA[JWA Downloads]]></category>
		<category><![CDATA[JWSCL Downloads]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/2008/04/20/the-delphi-jedi-project-needs-your-help-2/</guid>
		<description><![CDATA[The JEDI API Library project (JWA) has been successfully revived from a sleep status to an active project with lots of ambitions. Some recent achievements are the new include model of JWA, the release of JWSCL (the Security Library) and of course the &#8220;birth&#8221; of this blog. We made a roadmap for JWA and JWSCL [...]]]></description>
			<content:encoded><![CDATA[<p>The JEDI API Library project (JWA) has been successfully revived from a sleep status to an active project with lots of ambitions. Some recent achievements are the new include model of JWA, the release of JWSCL (the Security Library) and of course the &#8220;birth&#8221; of this blog.</p>
<p><span id="more-155"></span></p>
<p>We made a roadmap for JWA and JWSCL which includes &#8220;unicodifying&#8221; (Nick Hodges gave birth to a new word, meaning making the code ready for the next Delphi) and converting new Vista/Server 2008 API&#8217;s.</p>
<p>To help us fullfill these ambitions and continue contributing to the Delphi Community, we are looking for experienced Delphi developers to help us with the following tasks:</p>
<ul>
<li>Maintaining and extending the Jedi API Library (convert new header files, fix errors in existing code).</li>
<li>Maintaining and extending the Jedi Windows Security Code Library (use and test the library, contribute new code, maintain documentation, <em>Active Directory</em>).</li>
<li>Create examples and write blog posts about using JWA and/or JWSCL.</li>
</ul>
<p>See also the <a href="http://blog.delphi-jedi.net/2008/04/09/roadmap-of-jwa-jwscl/">Roadmap</a> for more details.</p>
<p>Of course you will get something back as well: the JEDI projects are very well known and respected in the Delphi Community, so active participation will earn you the respect of the community and is likely to offer additional benefits to your professional career!</p>
<p>Joining the projects means that you will be part of a team where the members actively support and help each other. You can learn a lot from the team&#8217;s knowledge and expertise and we look forward to learning from your knowledge.</p>
<p>If you think you can help us with either JWA, JWSCL or both projects please contact us:<br />
<a href="http://mailhide.recaptcha.net/d?k=01MeKrDPlF4UMY4OOGe4JcPA==&amp;c=qu6RnFAF5jjxh0bbfE7ymCJCa5TFUIfZS6RdKFzWmME="><img src="http://blog.delphi-jedi.net/wp-content/uploads/2008/04/mail-1.gif" alt="mail" width="129" height="12" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2008/04/20/the-delphi-jedi-project-needs-your-help/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WindowMessages</title>
		<link>http://blog.delphi-jedi.net/2008/04/04/windowmessages/</link>
		<comments>http://blog.delphi-jedi.net/2008/04/04/windowmessages/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 18:55:10 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Common]]></category>
		<category><![CDATA[Downloads]]></category>

		<guid isPermaLink="false">http://blog.delphi-jedi.net/2008/04/04/windowmessages/</guid>
		<description><![CDATA[If you have ever been as puzzled as I was by some of the numerical values that are supposed to be window messages, you&#8217;ll like this little tool of mine. The aptly named tool &#8220;WindowMessages&#8221; comes with source code and a Perl script to assist you in creating your own version of it by &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>If you have ever been as puzzled as I was by some of the numerical values that are supposed to be window messages, you&#8217;ll like this little tool of mine. The aptly named tool &#8220;WindowMessages&#8221; comes with source code and a Perl script to assist you in creating your own version of it by &#8211; for example &#8211; updating the window message list from newer header files. The whole idea is that you enter any numerical value and the tool will show you the respective messages (also notification messages, separated from ordinary window messages) if any matching messages were found.<span id="more-118"></span></p>
<p><a href="http://blog.delphi-jedi.net/wp-content/uploads/2008/04/windowmessages.png"><img src="http://blog.delphi-jedi.net/wp-content/uploads/2008/04/windowmessages.png" alt="WindowMessages" width="450" /></a></p>
<p>The tool (along with source) is available from:<br />
<a href="http://assarbad.net/stuff/windowmessages.rar" target="_blank">http://assarbad.net/stuff/windowmessages.rar</a><br />
<a href="http://assarbad.net/stuff/windowmessages.zip" target="_blank">http://assarbad.net/stuff/windowmessages.zip</a></p>
<p>// Oliver</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delphi-jedi.net/2008/04/04/windowmessages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

