Current version

v1.10.4 (stable)

Navigation

Main page
Archived news
Downloads
Documentation
   Capture
   Compiling
   Processing
   Crashes
Features
Filters
Plugin SDK
Knowledge base
Contact info
Forum
 
Other projects
   Altirra

Search

Archives

01 Dec - 31 Dec 2013
01 Oct - 31 Oct 2013
01 Aug - 31 Aug 2013
01 May - 31 May 2013
01 Mar - 31 Mar 2013
01 Feb - 29 Feb 2013
01 Dec - 31 Dec 2012
01 Nov - 30 Nov 2012
01 Oct - 31 Oct 2012
01 Sep - 30 Sep 2012
01 Aug - 31 Aug 2012
01 June - 30 June 2012
01 May - 31 May 2012
01 Apr - 30 Apr 2012
01 Dec - 31 Dec 2011
01 Nov - 30 Nov 2011
01 Oct - 31 Oct 2011
01 Sep - 30 Sep 2011
01 Aug - 31 Aug 2011
01 Jul - 31 Jul 2011
01 June - 30 June 2011
01 May - 31 May 2011
01 Apr - 30 Apr 2011
01 Mar - 31 Mar 2011
01 Feb - 29 Feb 2011
01 Jan - 31 Jan 2011
01 Dec - 31 Dec 2010
01 Nov - 30 Nov 2010
01 Oct - 31 Oct 2010
01 Sep - 30 Sep 2010
01 Aug - 31 Aug 2010
01 Jul - 31 Jul 2010
01 June - 30 June 2010
01 May - 31 May 2010
01 Apr - 30 Apr 2010
01 Mar - 31 Mar 2010
01 Feb - 29 Feb 2010
01 Jan - 31 Jan 2010
01 Dec - 31 Dec 2009
01 Nov - 30 Nov 2009
01 Oct - 31 Oct 2009
01 Sep - 30 Sep 2009
01 Aug - 31 Aug 2009
01 Jul - 31 Jul 2009
01 June - 30 June 2009
01 May - 31 May 2009
01 Apr - 30 Apr 2009
01 Mar - 31 Mar 2009
01 Feb - 29 Feb 2009
01 Jan - 31 Jan 2009
01 Dec - 31 Dec 2008
01 Nov - 30 Nov 2008
01 Oct - 31 Oct 2008
01 Sep - 30 Sep 2008
01 Aug - 31 Aug 2008
01 Jul - 31 Jul 2008
01 June - 30 June 2008
01 May - 31 May 2008
01 Apr - 30 Apr 2008
01 Mar - 31 Mar 2008
01 Feb - 29 Feb 2008
01 Jan - 31 Jan 2008
01 Dec - 31 Dec 2007
01 Nov - 30 Nov 2007
01 Oct - 31 Oct 2007
01 Sep - 30 Sep 2007
01 Aug - 31 Aug 2007
01 Jul - 31 Jul 2007
01 June - 30 June 2007
01 May - 31 May 2007
01 Apr - 30 Apr 2007
01 Mar - 31 Mar 2007
01 Feb - 29 Feb 2007
01 Jan - 31 Jan 2007
01 Dec - 31 Dec 2006
01 Nov - 30 Nov 2006
01 Oct - 31 Oct 2006
01 Sep - 30 Sep 2006
01 Aug - 31 Aug 2006
01 Jul - 31 Jul 2006
01 June - 30 June 2006
01 May - 31 May 2006
01 Apr - 30 Apr 2006
01 Mar - 31 Mar 2006
01 Feb - 29 Feb 2006
01 Jan - 31 Jan 2006
01 Dec - 31 Dec 2005
01 Nov - 30 Nov 2005
01 Oct - 31 Oct 2005
01 Sep - 30 Sep 2005
01 Aug - 31 Aug 2005
01 Jul - 31 Jul 2005
01 June - 30 June 2005
01 May - 31 May 2005
01 Apr - 30 Apr 2005
01 Mar - 31 Mar 2005
01 Feb - 29 Feb 2005
01 Jan - 31 Jan 2005
01 Dec - 31 Dec 2004
01 Nov - 30 Nov 2004
01 Oct - 31 Oct 2004
01 Sep - 30 Sep 2004
01 Aug - 31 Aug 2004

Stuff

Powered by Pivot  
XML: RSS feed 
XML: Atom feed 

§ VirtualDub 1.6.19 released

Thanks to a lucky Dr. Watson dump sent in by a user, I've finally tracked down the reason that recent versions of VirtualDub crash on startup on some machines running Windows 98/ME. This was impossible for me to track down for a long time since I couldn't reproduce the problem myself and the crash occurred in a 16-bit DLL. I didn't realize that Dr. Watson on Windows 98 is able to do a stack trace across both 16-bit and 32-bit calls with disassembly, which make it MUCH easier to track down what was going wrong. Because of the severity of the problem, I've fast-tracked the 1.6.19 release.

Changelog:

Build 24478 (1.6.19, stable): [June 3, 2007]
   [bugs fixed]
   * Fixed crash when creating batch jobs with certain Pinnacle video codecs.
   * Fixed crash when reading top-down BMP files.
   * Added workaround for crash on startup on some Windows 98/ME machines. 

This isn't a 100% fix, because I've been able to reproduce the problem in ways that seem unfixable at the application level, but at least one person has reported the problem fixed, so I figured it was worthy of release anyway. Details of the cause and fix after the jump.

The crash turned out to be triggered by a call to the USER32 GetAncestor() function, which I use within my main message loop to determine the top level window for each input event. This is necessary to support accelerators (keyboard shortcuts) in dialogs -- without it, keystrokes can be trapped by controls inside of a dialog and never tested against the accelerator table. Therefore, I use GetAncestor() to retrieve the top-level window, look up if that window has an accelerator table assocated with it, and call TranslateAccelerator() if it does. GetAncestor() on the user's machine was actually crashing within USER32 itself.

If you look at the MSDN library documentation for CreateWindow(), it says that you can specify a parent window handle of HWND_MESSAGE to create a "message-only window." This is a window whose sole purpose is to receive messages, never to be displayed or to receive input. I suppose this hack was put in because too many people were creating such windows, given the lack of support for message targets that aren't threads or windows. Now, the documentation says that HWND_MESSAGE is valid only in Windows 2000/XP or newer, and <windows.h> will only define this constant if you have WINVER set to at least 0x0500. In reality, the call succeeds just fine under Windows 98 — you get a window that can receive messages and whose window procedure is invoked as usual.

Until someone calls GetAncestor() on your window.

A message-only window doesn't show up in Spy++'s list, but if you call IsWindow() on it, it returns TRUE. Call GetAncestor(hwnd, GA_ROOT), however, and USER32 dies, turns over, and smells bad in 16-bit code. The workaround for this is to use GetParent(), which isn't fooled by the odd window and returns NULL instead. This is what I did in 1.6.19, and it solved the user's startup problem. The reason I say that this isn't a 100% fix, though, is that when I wrote a repro case for this, I originally created a message only window in a DLL and then started a 500ms timer on it. Not only did this cause a crash in DialogBoxParamA() — which I can't really work around, since it's Microsoft's dialog message loop — but it once caused several blue screens, a white Windows 3.1-style General Application Fault dialog, and finally took down the whole OS. The best that I can tell is that this is a problem in the core window manager, and is something that only Microsoft could truly fix... but given the support status of Windows 98/ME, it probably won't ever be fixed.

Windows XP doesn't seem to have this problem, as GetAncestor(hwnd, GA_ROOT) just returns NULL. It seems that Windows 2000 would originally blue screen in win32k.sys under similar situations, but the problem has been fixed in Service Pack 3.

While I still believe in supporting the Windows 9x line — which is why VirtualDub 1.6.x still supports Windows 95 and above and 1.7.x supports Windows 98 and above — the Windows programming world will be a bit nicer once these operating systems truly become ignorable. Many new applications are already limiting themselves to Windows XP and up, but even the .NET Framework still supports running under 98 to some extent.

Comments

Comments posted:


I think its great that you still support the Win9x line, hats off. For most of my small apps I try to support 98 and up with unofficial support for Win95+IE4/ShellUpdate+WinSock update.

ac - 03 06 07 - 23:23


Yeah I agree, please keep supporting Win9x.

Arnie (link) - 06 06 07 - 09:16


I seriously don't understand why people are still using these operating systems. After you've used Windows 2000 (and even XP, if you've only used pre-2000 versions of Windows) you'll never want to go back to these unstable abominations.

I understand people are reluctant to change, but this is just ridiculous.

yuzyu - 07 06 07 - 04:54


The reason why i guess is that some older capture hardware running on w95/98.
One of these was the miro dc30 because missing vfw drivers in xp.

kaibenson - 14 06 07 - 05:59


Yup. In fact, for a long time, it was missing ANY drivers in XP... and then for a while, only drivers with a proprietary API....

Judging by the crash reports that I get (third party drivers suck), most of my users are running Windows XP. However, we have a media machine here that is running Windows 2000, and very occasionally, I have use to run my program on someone's Win98 machine. I hate it when I can't run my own program.

I'd agree that Windows 98 is fairly unstable, particularly once you start loading it up with applications that are themselves not paragons of software engineering, but for a lot of people it works, and upgrading to Windows XP is not a simple undertaking. For many people it would require an entirely new system.

Phaeron - 15 06 07 - 00:21


"I seriously don’t understand why people are still using these operating systems."
There are various reasons, like using outdated hardware. The 98SE "scene" is booming, check this:
http://www.msfn.org/board/Unofficial_Win..
I run a heavily modified 98SE myself on an old laptop. It's good enough for IRC, IM and the odd webpage from the comfort of my bed :).

mf - 23 09 07 - 20:30

Comment form


Please keep comments on-topic for this entry. If you have unrelated comments about VirtualDub, the forum is a better place to post them.
Name:  
Remember personal info?

Email (Optional):
Your email address is only revealed to the blog owner and is not shown to the public.
URL (Optional):
Comment: /

An authentication dialog may appear when you click Post Comment. Simply type in "post" as the user and "now" as the password. I have had to do this to stop automated comment spam.



Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.