Here’s what the notification center looks like in build 9841:
How do you enable it?
- Download the hack: 9841NotificationCenter.zip
- Copy the correct notificationact.dll (x86/x64) to C:\notificationcenter\
- Run notifyactids.reg and notifyclassids.reg to add them to the registry. (It’s possible you have to take ownership of HKLM\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId and HKLM\SOFTWARE\Microsoft\WindowsRuntime\CLSID, use something like SetACL or RegOwnershipEx)
- Now simply run notification.exe and the notification center will pop-up.
- You can also run notification.exe from the command line and append a number to select a corner:
notification 0 – top left
notification 1 – bottom left
notification 2 – top right
notification 3 – bottom right (default)
If you double click on a notification or long single click, it’ll crash. This doesn’t have anything to do with the hack, the bug is in Windows.UI.Shell.dll. It tries to convert one interface to another, the conversion fails but the code doesn’t check for this and assumes it will succeed. When it tries to use the result, it goes boom.
Stuff it could in theory do, but doesn’t do
The notifications popup can be shown on any monitor, though here it defaults to the one where the console window opens.
Also, I believe the code for the notification icon tray is present though it requires somebody more versed in WinRT to figure out how to connect it up to explorer, if indeed it can be. If you have a dissassembler and the Windows.UI.Shell.dll symbols, you want to be looking at ??0OverflowIcons@NotificationCenter@@Q$AAA@XZ which is where the object is created and the pointers to all its vtables assigned. The class ids of interest are NotificationCenter.OverflowIcons & NotificationCenter.TrayItemView.
Why doesn’t the notification center work out of the box?
The activatable class ids of the center in Windows.UI.Shell.dll aren’t registered in the parts of the registry mentioned above (hence the scripts). Also, the dll lacks a DllGetActivationFactory function which is needed to actually create those interfaces once they’re registered (hence the dll).
To solve this, the registry scripts point Windows to notificationact.dll which acts as a surrogate. Its DllGetActivationFactory uses a nasty hack to call the correct interface creation functions in Windows.UI.Shell.dll.
Explorer doesn’t contain any code to use Windows.UI.Shell.dll directly or indirectly. Neither does it contain any code to start the Notification controller server, though bizarrely it has the call to shut it down.
Building from source
The download includes the source code fro this hack (thanks again, Adrian), here are his notes on building/modifying the code yourself:
Anything above VC 6 should be able to build the code since I’ve inlined and GetProcAddress-ed the newer stuff that’s required. Uncomment the VERBOSE define in both files to print status messages, the build command lines are at the top of each file.
If you need any help, or you have any other cool tricks, let me know in the comments below or on Twitter (@Bav0)