Thursday, May 05, 2016

The blog has moved

Blogger seemed to be getting a bit tired, so I've shifted my blog to a new home. Head over to https://blog.yuo.be for the new one!

Monday, March 28, 2016

Windows 10: The bugs that irk me

There are a few small bugs in Windows 10 that, despite being small bugs, manage to irritate the hell out of me.

1. Desktop icon positions reset themselves during graphics card driver update

This is a peculiar one, as it happens on my desktop, but not on another PC. The bug is simple: while GeForce Experience is installing a new driver, the icons on my desktop are automatically rearranged (as if 'Auto arrange icons' was turned on and then off again). (I only mention GeForce experience, as that's how I get my driver updates.) Now, I keep some frequently used shortcuts near the right edge of the screen, so having them automatically moved from there and mixed in with the other icons is annoying to say the least. And, nVidia release driver updates fairly frequently so it is at least once a month it happens.

Since it doesn't happen on my laptop, I can only guess it's related either to using 125% DPI or having an external display.

2. Bottom line of command prompts cut-off

When you reach the bottom of a command prompt, the active line ends up being half cut-off.

You can scroll down, but it will just happen again when you next reach the bottom of the window. My best guess again is that this is a high-DPI bug, since it doesn't happen on my laptop (which is set to 100% DPI).

3. Pressing Ctrl on the lock screen doesn't always bring up the login screen

I like pressing Ctrl to wake up my monitor and bring up the login screen, because it is usually a fairly innocuous key to press. The problem is that sometimes pressing Ctrl on the lock screen brings up the login screen, while other times it does nothing. I have no idea what the pattern is here (though I'm pretty sure there is one).

4. It wakes up in the middle of the night to finish installing updates

My laptop is in my bedroom. If I hibernate it, Windows likes waking up in the middle of the night to finish installing pending updates. So, I get woken up by the sound of the laptop's DVD drive initialising and a glaring display. I have no idea who thought this would be a good behaviour – Windows 10 giving me sleep problems ranks among the worst problems it could give me. I don't even think it installs the updates properly (or it wakes up early and does nothing for a fair while). I haven't found a way to disable this behaviour, so I've resorted to using shut down instead. My laptop is left connected to the mains, if it matters (I hope it does, since it'd be even worse if it happens when running on battery, or the laptop was in a laptop bag, say).

5. When installing new builds, it reinstalls different drivers

I have a laptop enrolled in the Windows Insider Programme. Whenever a new build is installed, it installs a touch pad driver with a version lower than the one I had previously installed myself. So, whenever a new build is installed, I have to manually reinstall the correct touch pad driver version. Pretty annoying, as some touch pad software/driver settings get reset in the process.


All of these problems are current, on fully up-to-date Windows 10 installation as of today (28 March 2016).

Sunday, January 24, 2016

If you delete the WINDIR environment variable, it's (almost) game over

I came across an interesting problem recently. I was editing some environment variables on a Windows 10 PC, using some third-party software. After doing that, a few things started behaving oddly, such as some system programs would not open. Things got worse after rebooting: I could not right-click on the start button, I could not open Task Manager, I couldn't start anything that required elevation and Windows Firewall kept telling me it was turned off.

Most of the actions that failed to do anything would hang for a fair while, eventually displaying dialog boxes with the message 'The system could not find the environment option that was entered'. Like this:


As it turned out, the cause of all these problems was that WINDIR environment variable had been deleted. (Of course, not intentionally.) And it really was was catch-22: I could not edit the system environment variables without elevation. The best I managed to do was kill explorer.exe using Process Explorer, start a command prompt, set %WINDIR% in the command prompt and start explorer.exe. Alas, that only helped marginally, and trying to open the advanced system properties (SystemPropertiesAdvanced.exe, as it turns out) in the same way did not work.

All was not lost: I could still access the modern settings app and reboot into the recovery menu. From there, I was able to use System Restore to go back a day to when WINDIR was still present. (Of course, I'm sure there are other ways I could've fixed it, but I just took the easiest and quickest solution as the time.)

After all that, I was curious about whether the standard Windows environment variables editor lets you delete the WINDIR environment variable. I just tried (in a VM of course): yes, it does.

Sunday, January 17, 2016

The death of Google Cloud Print on my MX895 printer: a story of ineptitude

I bought a Canon PIXMA MX895 all-in-one printer in May 2012. In fact, I was one of the first owners of the printer in the UK, having pre-ordered it the previous month. The printer was on sale from then until around April 2013.

One of the features the printer had was Google Cloud Print. The printer didn't support it out of the box – it needed a firmware update to add support for it (although it was available on day one). And, since then, I used the Cloud Print feature sporadically.

Fast-forward to late last year. I tried to use Google Cloud Print, but all I got was useless error messages from the printer about it not being able to connect to the server. Suspecting something was up, I set about Googling and can came across this discussion. As it transpired. Google deprecated the authentication API the device was using in April 2012, before there was even any stock of the printer in the UK. And, while Canon have released firmware updates for more recent models, for some models Canon will not release updated firmware, stating in a support article dated 1 September 2015:
Google has recently announced future planned changes to the server authentication method of their Google Cloud Print™ (GCP) service. An impact of these changes will be that specific Canon printers will no longer be able to support Google Cloud Print™ (GCP) because the printer firmware cannot accommodate these planned changes.
Recently is certainly a stretch. I suspect what they mean is that Google recently followed through on something announced over three years ago. For models other than my one, the timeline is even worse. The MG5450, for example, was announced in September 2012 and on sale until around September 2013.

Needless to say, I wasn't exactly impressed on learning all of this. To top it all of, as of writing, Google UK are still listing the MX895 as a Cloud Print printer1.

1No idea if that link will redirect outside of the UK.

Migrating a Windows 10 installation from MBR to GPT/UEFI

I recently updated to Windows 10 on a Z170-based motherboard, but my Windows installation was an MBR-based one rather than a modern UEFI one. I wanted to switch to a UEFI installation for the marginally fast boot time – without losing data during the switch – but most of the information online about doing that involved either purchasing software to do it or dubious use of command-line utilities.

Somewhere, though, I came across the strategy of backing up the current Windows installation, making a clean one in UEFI mode in order to create the relevant boot partitions etc., and then restoring the Windows partition from the backup. I was upgrading my system drive to a larger SSD so it seemed like a good time to give it a go. And indeed, it worked fine, so I thought I'd document the steps I followed here in case it helps anyone else.

The process requires some spare space on another drive in order to save an image of your system drive. Naturally, if you follow these steps and something goes wrong, I don't take any responsibility – it goes without saying that you should make doubly-sure you have everything backed up.

The steps are roughly as follows:
  1. Download the Windows 10 Media Creation Tool.
  2. Use the tool to create a Windows 10 installation image on either a flash drive or a DVD. I used a flash drive.
  3. Back up your system drive using drive imaging software. Macrium Reflect (free) should do, but I used the bootable version of Acronis True Image 2016 (not free) as I already had it. The software you use should allow you to selectively restore partitions from the backup to a partition of a GPT drive. If you are not using a bootable version of the imaging software, then it also needs to be able to restore backups to the system drive. Make sure you validate your backup to make sure there is nothing wrong with it.
  4. At this point, I installed Windows 10 in UEFI mode to my new disk drive. It took minutes to install to a decent SSD from a decent USB 3.0 flash drive (surprisingly fast when compared to how long the upgrade from Windows 7 to 10 took). I disconnected all the other drives in my PC out of an abundance of caution. To install Windows in UEFI mode you need to boot from the Windows 10 installation media in UEFI mode. For me this was achieved by pressing F8 when on my BIOS splash screen and then selecting the entry for my flash drive that was prefixed with UEFI. If you're reusing your existing drive for the UEFI installation, you will need to delete all the partitions on it. You should be able to do this in Windows 10 setup, but I haven't tried that.
  5. When prompted for a product key, select the option saying you don't have one, and then select the relevant Windows edition.
  6. A couple of screens later, you'll need to select your disk drive and create a partition. If you booted the installer in UEFI mode correctly, another three partitions (recovery/system/MSR) should be automatically created when you create the one to install Windows to, leaving you with four in total. If that doesn't happen, you might not have booted in UEFI mode.
  7. You can click through the remaining setup options – they don't matter much as we are just going to overwrite the Windows installation.
  8. Once installation is complete, you need to restore the Windows partition from your backup to your drive using your drive imaging software. You need to only overwrite the current Windows partition with the one from the backup – take care not to restore the whole disk which will wipe your GPT layout.
  9. Reboot and if everything worked as planned your old Windows installation should be back!
  10. You should now be able to disable CSM in your BIOS, which should reduce POST time a bit.
Hopefully that helps someone else – doing this and disabling CSM did indeed make a reasonable improvement to my boot times.

Wednesday, January 06, 2016

Today I learned...

...in the properties for devices in the Sound control panel applet, you can right-click on the volume bars and change the units to decibels:



Friday, January 01, 2016

A change of web host

I shifted yuo.be to Amazon Web Services. Here's a recent screenshot of the 'Time spent downloading a page' graph from the Googlebot crawler stats displayed in the Google Search Console:

Can you pinpoint when the switchover happened? Yes, my old host was that bad.

The baseline 'Pages crawled per day' has also increased – presumably it was throttling itself before...

Wednesday, December 30, 2015

The death of IMpeg2Data and the false start of IPSITables


In the Windows Vista-era, I wrote a DVB-T program. Apart from letting you view TV, it read and parsed DVB-SI. With the removal of Media Centre in Windows 10, I recently tried to get it working again but quickly hit a fairly major snag.

I was using the IMpeg2Data interface to retrieve DVB-SI. In particular, the IMpeg2Data::GetTable and IMpeg2Data::GetStreamOfSections methods.

However, you'll note that Microsoft state:
[IMpeg2Data is no longer available for use as of Windows 7. Instead, use the IPSITables interface to get program specific information (PSI) tables from an MPEG-2 transport stream.]
Fine, the API has been replaced, it should be straightforward to use the new one. Except, it is very poorly documented, and the documentation that is there does not make sense.

Let's have a look at the documentation for the parameters of the only method that the new interface has, IPSITables::GetTable:
dwTSID [in]
Transport stream identifier (TSID) for the table that is retrieved (bytes 0 - 15) and the original network ID (ONID) for an Event Information Table (EIT) that is retrieved (bytes 16 - 31).
dwTID_PID [in]
Table identifier (TID) or the program ID (PID) that identifies the transport stream packet.
dwHashedVer [in]
Hash value that identifies the table contents.
dwPara4 [in]
PID for a Program Mapping Table or the service ID (SID) for an EIT. Otherwise, not used.
ppIUnknown [out]
Pointer to the IUnknown interface for the table object that is retrieved. The caller is responsible for freeing the memory.
How many things are wrong with it?
  • Can a DWORD store 32 bytes now?
  • Is a PID is a program ID now rather than a packet identifier?
  • What the hell the hash value (or hashed version as suggested by the name of the parameter) – the word hash comes up in neither ISO/IEC 13818-1 nor ETSI EN 300 468. CRC32 does – but how on earth would you know the checksum of the table you are trying to retrieve?
  • When do you put the TID in dwTID_PID and when do you put the PID? If you put the PID there, where do you put the TID?
  • What do you put in bits 16 – 31 of dwTSID when it's not an EIT?
  • What do you do if you don't know the TSID?
  • And even if you manage to work all that out, you get a pointer to an IUnknown interface, with no information on what interfaces it actually implements!
As for IMpeg2Data::GetStreamOfSections, there doesn't appear to even be a replacement.

The old IMpeg2Data method was reasonably well-documented and more importantly the method parameters actually made sense.

I wondered what Microsoft actually meant by IMpeg2Data is no longer available for use as of Windows 7. I noticed that the filter and interface are still present. Alas, my experience of what they mean is that IMpeg2Data::GetTable times out and returns EVENT_E_INTERNALERROR, while IMpeg2Data::GetStreamOfSections returns S_OK but no data ever arrives. It is bizarre as it suggests the method implementations are still in place.

In any case, I'm pretty sure my TV app will never work again. Never mind...

Tuesday, December 29, 2015

Windows 10: 'How do you want to open this file'? dialog box

It certainly feels like all the feedback I enter into the Windows Feedback app on Windows 10 ends up in free fall towards the floor of a bottomless abyss. So, perhaps inscribing my thoughts on the more traditional world wide web will be a more productive use of time.

My first in a series of complaints is the 'How do you want to open this file?' dialog box:



My initial complaint (which I'll come back to) was simply that it does not mention which file it is talking about. On closer inspection, though, there are other things amiss. Firstly, albeit a minor quibble, the title seems a bit silly to me – if someone asked me that question I would probably reply 'quickly'. Not sure what is wrong with 'Which app do you want to open this file with?' (apart from being slightly longer).

Secondly, if you view the images at their original sizes, you'll notice the icons are distorted. I use 125% DPI on this PC which is presumably something to do with it.

Back to the original complaint. It can be summarised as: I was running a script in the background. The script sometimes runs a Python script. Some time after I started the script, one of these dialog boxes popped up and I had no idea what file it was referring to. It annoyed me that it did not tell me.

Now I've started writing, I've realised I have even more complaints with this dialog box. Why does it close when you click somewhere else? There is zero visual indication it is going to do that. And, why is there no cancel button?

On my laptop, if I try to open a JPEG I get this:


I haven't as yet selected "%1" to see what happens.

And here's another one. If you try to change the program associated with a file extension via Control Panel, you get this version of the dialog box:


The title makes no sense. There is no 'this .py file'!

Tuesday, July 05, 2011

Welcome to the club

It looks like iTunes can join the mega-GDI-resource-leak club:

Congratulations (?)

Wednesday, April 27, 2011

Broken drivers

Lenovo finally posted an updated driver - version 267.21 - for the Nvidia NVS 3100M chipset in my ThinkPad T510. Unfortunately after installing it I was greeted with strange, but horrible, colour banding. Do they test these things? I also tried 270.61 from nVidia - which actually supports my laptop for a change - but alas, the same obvious problem was present. I reverted to version 260.63, which works fine.

Lenovo also posted an updated Intel Wi-Fi driver, version 14.0.1. This one gave me BSODs, I think when entering sleep mode. Back I went to the official Intel version, 13.5.0, which seems to works fine.

And let's not forget the Bluetooth drivers which wipe your hard drive when upgrading/uninstalling them. The only warning you get from Lenovo is a tiny "Please back up your important data before running the update." I have not bothered to remove them....

Sunday, March 13, 2011

Adobe Reader X 10.0.1: bugged

Hi Adobe,

You might want to do a better job testing your software before releasing it.

I was happily reading a PDF document when I wondered why the taskbar clock was where the start button should be. Also, Adobe Reader had rendering glitches everywhere. Recognising the symptoms, I fired up task manager:



Yes - Adobe Reader X 10.0.1 has a large GDI-resource leak bug. This happens when the semi-transparent light blue search box overlay is visible. If you are in select mode, a chunk of resources will be leaked every time the text cursor flashes. Otherwise, just scrolling around will leak a chunk of resources. Eventually you will reach the default 10k limit. Lovely. Eventually my taskbar responding.

Monday, February 28, 2011

Some never learn

I downloaded the Dragon Age II PC demo, to find that mouse wheel support is broken - a familiar tale. (Specifically, support for freely rotating mouse wheels with non-120-multiple wheel rotation values). Ho-hum.

Sunday, February 27, 2011

Careful with SHAutoComplete

If you call it with a NULL HWND, it will return E_INVALIDARG but leak six GDI handles (seen under Windows 7 SP1).

Yes, you can blame the caller, but 'tis just something to note.

Tuesday, July 13, 2010

Thoughts of the day

1. Surely a (laptop) recovery DVD that depends on the original storage drive partition layout to be (loosely) intact is a complete fail? I'm looking at you, Acer.

2.Some people might call that a memory leak, Notepad++. I'll try version 5.7: let's hope it's better even if it doesn't make any specific promises about this.

3. The hot fix for the Windows 7 erroneous file is corrupt nonsense was finally released a few weeks ago.

4. Some questions on notification icons (tested on Windows 7):
  • When pressing Enter on a focused notification icon, why are two NIN_KEYSELECT notifications sent to the associated application? (i.e. when using Windows 2000 or newer behaviour), Space was OK, as I remember.
  • In the main notification icon area, why are WM_XBUTTONDOWN/WM_XBUTTONUP notifications sent when the 'X' buttons are pressed over another icon?
5. Why do PC modern games still have problems with freely rotating mouse wheels (with non-120-multiple wheel rotation values)? I'm looking at you, Dragon Age. Even worse is to not bother fixing it.

Friday, June 11, 2010

Microsoft SAPI text-to-speech fun

It seems to fail at resampling. I tested on Windows 7 with the stock Microsoft Anna voice; you probably won't notice unless you use an alternative output (e.g. write to file) and specify a non-native sample rate (I suppose most people don't do that).

Handily I was in the context of a foobar2000 component, so I was able to make SAPI output to memory at the native sample rate and use FB2K's resampler.

Here are some samples (native 16kHz, SAPI-resampled 22kHz, FB2K-resampled 22kHz). Feel free to share any insight in the comments...

Sunday, May 30, 2010

Letter of rage

Dear Broadcom WIDCOMM Bluetooth Software 6.2.1.2100 installer,

Thank you for deleting every file you had access to on my system volume. There's nothing like seeing random icons disappear from your desktop one-by-one. It's a shame you left all my other drives alone, but one can't have everything.

Yours sincerely,

Anonymous fan

Update: Ah, came across another report - so the problem has been known (with earlier versions!) for at least a month. Great...

Sunday, May 23, 2010

Web host fun

So my web host blocked my IP address from the server my web site is hosted on... and are denying it/are uninterested in doing anything about it. Seems like I tripped some "security" measure trying to edit a large wiki page.

So off I go to find a new host... which is always a fun process. Wish me luck.

Wednesday, February 10, 2010

Attn: UPEK

As I know the nice person(s) at UPEK like to take notice of things posted here, I thought I'd write about a couple of new problems I had with Protector Suite / my fingerprint reader under Windows 7.

1. A new error message appeared today; it was hiding under all other windows so it went unnoticed for a while:

First time I've seen that one, so not an often occurrence.

2. Sometimes after resuming from sleep, my fingerprint reader doesn't function (no feedback when swiping). If I try to restart the Windows Biometric Service, it times-out or something, though after a while things work again.

Perhaps the below message logged by Windows will help. There's also something for the Windows Biometric Service from when I tried to restart it, that's under Bucket ID 1376951512.
Source
Windows Driver Foundation - User-mode Driver Framework Host Process

Summary
Driver host process timeout.

Date
‎02/‎02/‎2010 8:40 AM

Status
Report sent

Description
The Windows User-Mode Driver Framework detected that a driver host-process did not complete a critical operation within the allowed timeout period.
This report contains information about the process and the drivers running within and will be used to improve the quality of these drivers.

Problem signature
Problem Event Name: WUDFHostProblem
EventClass: HostProblem
Problem: HostTimeout
DetectedBy: 2
UMDFVersion: 6.1.7600.16385. (win7_rtm.090713-1255)
ExitCode: 103
Operation: 0
Message: 6
Status: ffffffff
HardwareId: USB\VID_147E&PID_2016&REV_0001
OS Version: 6.1.7600.2.0.0.256.1
Locale ID: 2057

Extra information about the problem
Bucket ID: 4
That's with driver version 1.3.0.214, the latest version available for download at time of writing.

Tuesday, January 26, 2010

Failure at using COM/OLE: Part 2

Last time we just touched on a small issue, as a precursor to the important one.

Consider an application that populates an STGMEDIUM structure as follows:
  • Sets tymed to TYMED_ISTREAM
  • Sets pstm to a pointer to an IStream object
  • Sets pUnkForRelease as a pointer to the IUnknown interface of the same IStream object
  • This IStream object has a reference count of 1.
What's wrong? Let's read the documentation for ReleaseStgMedium:
When the original provider of the medium is responsible for freeing the medium, the provider calls ReleaseStgMedium, specifying the medium and the appropriate IUnknown pointer as the punkForRelease structure member. Depending on the type of storage medium being freed, one of the following actions is taken, followed by a call to the IUnknown::Release method on the specified IUnknown pointer.

Medium





ReleaseStgMedium Action
TYMED_ISTREAM





Calls IStream::Release.
(My emphasis, irrelevant parts of table omitted)

In other words, calling ReleaseStgMedium on that STGMEDIUM structure will end up in the IStream object being released twice, and unsurprisingly things like to blow up the second time.

Sad thing is it didn't really take much time to look up the problem - all of 30 seconds once I found out that freeing TYMED_ISTREAM STGMEDIUMs was the issue. You'd better allocate more time for "convincing person X that the problem exists".