PS: IIRC, the ACCESSDENIED is what you get back from ::ShellExecuteEx() for timeout and user cancel, so the only thing Burn could do was to treat them all as canceled. 

If ::GetLastError() gives us better codes to handle, then that would be great.