Windows 7 and Virtual Disks

Illustration

Today (2009-04-23) I gave lecture about virtual disk support in Windows 7.

Here are some links I promised:

If you are interested in this topic, you may wish to check this blog at later times also. I will be adding more detailed explanations of VHD API and updates to this C# implementation.

P.S. If you get “Privilege not held” exception message, run Visual Studio 2008 as administrator. VHD API requires elevated rights.

[2009-04-27: Windows 7 RC will have some changes regarding Virtual Disk API. Major ones include changing names of some functions (E.g. what was SurfaceVirtualDisk is now AttachVirtualDisk, what was UnsurfaceVirtualDisk is now DetachVirtualDisk) and structures. Once RC is out and I install it, I will release update of code.]

[2009-05-01: Code is updated.]

MobiReg 1.00

Illustration

Final version of MobiReg is out.

This is small registry editor which supports supports creating and editing of string, binary, DWord (32-bit), QWord (64-bit), multi-string and expandable-string data types. Additionally to that, there is support for both Smartphone (Windows Mobile Classic) and Pocket PC (Windows Mobile Professional) platform in single executable.

One of features that may help you to decide whether to use it or not is support for both import and export of registry in standard .reg file.

You can download it here.

In order to run it, you may need .NET Compact Framework 2.0 or higher (if it is not already installed).

Flicker-free Paint on Windows Mobile

On our desktop systems answer to flickering in Paint event was to use double buffering. .NET Framework supports it out of box and if you do not like built-in solution, there is quite a few solutions out there. Most of them use SetStyle method in order to inform Form that custom draw will be performed.

If you try that in Windows Mobile, you have a problem. Not only that there is no SetStyle, but you must remember that your application needs to work when rotated (all mobiles with keyboard need rotation too).

Solution is to create your own double-buffered class. Whole idea is rather simple, create bitmap with size of control (client area only) and draw everything to it. Once you have drawn everything you need, paint this bitmap over your control. Since this will be done in single operation, no blinking will occur. Be sure to override PaintBackground method also. If you forget that, you will still have flicker since painting will be done in two passes. First pass will be erasing background - usually in white, and second pass is drawing your buffer. Such sudden changes between white and non white tend to be noticeable.

Here is sample code that I usually use.

Finding Differences

Illustration

I often have need to compare two files. Usually, I just use PSPad compare, but that tool can be quirky at best.

I tried lot of stand-alone freeware programs for that purpose, but SourceGear’s DiffMerge was one I selected. It just works (and it works fast). Along standard features for such programs, there are two features that made it special to me.

First one that I liked a lot is capability to show changes within line. It will show you exactly which characters were changed. You can quickly see what was really changed and what was just small correction. Another one is integration inside Windows Explorer. While most programs do this, this one does it properly even on 64-bit systems. That was problem for all others I tried.

If you are looking for file compare program, try this one. There are lot of features inside that I didn’t mention and program is really easy to use.

Creating Self-signed Certificate

There are lot of providers of code signing certificates out there. But they all share same problem - they are not cheap. Certificate will cost you in range of 400 € (that is per year). Why pay that money when we can make our own free self-signed certificate? Yes, Windows will not recognize it as trusted, but it still can be used for file integrity purposes.

Illustration

In order for this to work, prerequisite is having Microsoft Windows SDK installed (here is Windows Vista and Windows 7 link). All our work will be done in “C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin” (for Windows 7 or something similar for Vista).

First we need to create certificate with private key:

makecert.exe -pe -n "CN=Example;E=example@example.com" -sv example.pvk -a sha1 -r -eku 1.3.6.1.5.5.7.3.3 example.cer
Succeeded

Window will pop-up and ask for password. You can leave it empty - we can delete private key after we finish. Notice that we are creating code signing only certificate here (-eku 1.3.6.1.5.5.7.3.3). If you wish certificate for all purposes, just omit that argument. Notice that CN and E parameters are ones that you would want to change.

Since with certificate alone we cannot do anything, we need to go through hoops in order to get pfx (PKCS #12) file:

cert2spc.exe example.cer example.spc
Succeeded
pvk2pfx.exe -pvk example.pvk -spc example.spc -pfx example.pfx

Illustration

PFX file can be imported. Just double-click it to get to Certificate import wizard and continue clicking until it is done.

This whole game caused our certificate to get imported to current user’s personal certification store. We can now safely delete all intermediate files (four of them: .pvk .cer .spc .pfx) since everything we need is in our user account. Smart idea would be to make backup of example.pfx before deleting (e.g. just in case Windows need reinstall) or we can just export it from certificate store at later time.

Code signing itself is lot easier. Just one command is needed:

signtool.exe sign /s "My" /n "Example" /v "test.exe"
The following certificate was selected:
Issued to: Example
Issued by: Example
Expires:   1.1.2040. 0:59:59
SHA1 hash: 740F9468A344BF7BB4DC338C2870BD73BB8797C3
Attempting to sign: test.exe
Successfully signed: test.exe
Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

Take care that this “Example” is same one you used after CN= (a.k.a. common name) in first command.

There it is, you have signed your executable.