The ___djgpp_hw_exception routine uses a DPMI call to generate a fake exception
when control returns to the main program. The crash seems to happen inside the
call, which could mean the WinNT DPMI host is not re-entrant (actually, I didn't
investigate the things long enough). The problem was gone when I patched the
program to use another method to generate the fake exception (the method was
only good for testing, so I don't describe it here).
There seems to be one more problem with Ctrl+Break only - under WinNT, both
the DJGPP's and original INT 1B/INT 23 handlers get executed (if I patch the
program not to crash on the DPMI call described above). I tested that loading
a TSR that intercepts INT 23 before running my DJGPP program, and the TSR's
INT 23 got called when running under WinNT (of course, this means that if I
don't load such a TSR, the program gets terminated by DOS's INT 23 handler,
even if I intercepted SIGINT to do something else).