The music volume only maxing at half, that was the issue with the game's formula that converts number from 1 to 10 (from audio options menu) to DWORD to pass to auxSetVolume.
Generally, it looks like I simplified code calling mciSendCommandA, not sure yet if this in itself is the problem, I noticed going from menus to the mission's cutscene, only MCI_CLOSE is sent, while from mission to cutscene sends MCI_STOP, followed by MCI_CLOSE when the cutscene ends. Surely the latter should implicitly stop playback if device is being closed? DxWnd bug? I'm almost positive it works this way in Microsoft's WinMM.
Heh, I undid zeroing memory in HeapAlloc calls where I've put it before and got crash pretty soon, first time I failed the mission after clicking Replay from mission failed screen. It crashed in stricmp, standard C library function for comparing two strings. There are quite a lot of calls to strncpy specifying 15 for size while others specify 16. I wonder if they meant to use 16 across the board. There'd still be the problem if string being copied exceeded 15 characters as it wouldn't be properly zero-terminated then.
There are some parts where I'm not sure how I came to the conclusion, like there's one part of code that is always called when your weapon hits another vehicle and in one place, I'm taking value with 0ffset 0x10 rather 0x44. Probably accessing the latter crashed at some point, but what actually goes on there?
Another instruction I skipped in one place, a decision to set some variable in a certain way is made based on the result of comparison of certain yet uninitialized (garbage) value in just allocated memory!
I recognized another error which fix isn't in the published patch (unsure when, if executed in practice), one code sequence for reallocating memory is wrong, it calls MSVCRT's _msize to get current block's size, then calls HeapReAlloc with size increased by 4096 from the result of the previous call. This is wrong, this game creates many heaps with HeapCreate, correct sequence would be calling HeapSize with correct specified heap that part of the code deals with. It also assumes pointer to re-allocated block won't change from the original, which is sometimes the case, but not always. _msize is meant for allocated blocks from MSVCRT's allocation routines. You sure got number of ways to allocate memory in Windows.
It's quite amusing how stable this game managed to be under Win9x, with the exception of that fatal mission 12-13 transition.