The following patch is probably wrong, but it fixes my problem with WriteFile failing when writing to a COM port. The problem appears to be that NtWaitForSingleObject sends a count of '1' which results in the wine_server_call in NTDLL_wait_for_multiple_objects returning 'STATUS_USER_APC' which aborts the execution before 'call_apcs' gets called (which actually does the write).
calling 'NTDLL_wait_for_multiple_objects' with count = 0 allows the 'call_apcs' function to get called, and TzMax50 actually works perfectly (along with my nasty hack to allow the menus to work)
as a reminder, the COM port is opened in non-overlapped mode, and all timeouts are set to 0.
(I didn't submit this to wine-patches, since i'm not at all sure it is generally correct)
I can also try to write a test-case that shows this works (sort of...I can test that WriteFile returns the right result, but not that data was actually written on the serial port. I know of no way to do that without external hardware). I don't know how to make it general enough though (what to do when there is no COM port attached to the machine?)
.Geoff
--- orig/dlls/ntdll/file.c +++ mod/dlls/ntdll/file.c @@ -585,7 +585,7 @@ ret = register_new_async(&ovp->async); if (ret != STATUS_SUCCESS) return ret; - if (flags & FD_FLAG_TIMEOUT) + if (hEvent != NULL && flags & FD_FLAG_TIMEOUT) { NtWaitForSingleObject(hEvent, TRUE, NULL); NtClose(hEvent);