Win32s 1.30a Bug
List at the Time of Its Release
The information in this article applies to:
- Microsoft Win32s version 1.30a
This article lists the known bugs in Win32s version 1.30a at the time of its release.
- Incorrect context at EXIT_PROCESS_DEBUG_EVENT.
- DEBUG_EVENT.RIP_INFO not supported.
- Progman gets restored when debugger app exits.
- Problem with journaling hooks on Win32s when using MSTest.
- OLE: need try/except at 32-bit entrypoints.
- EXCEPTION_RECORD: The # of params and Info array always zero.
- Frame: Access Violation in PackFindData@8 (FindFirstFile looking for arrow.pcx).
- Using StartDoc, the return value is correct but the printer does not output the
- CVW32s: int 3 disables receipt of bp for DbgBreakpoint.
- CVW32s: Machine deadlock w/debugger, div0.exe & FatalAppExit.
- CVW32s: Ubrowse.exe runs on NT, but not Win32s example.
- cvw/win32s: restart of mfc app blows.
- cvw/w32s: exception; procterm; l; g; async stop doesn't stop.
- EM_GETWORDBREAKPROC return code incorrect. If an application sends the
EM_GETWORDBREAKPROC message to an edit control, it will receive the address of a 32->16
callback thunk with no code on the other end of the stub.
- Dialog procs should return BOOL not DWORD.
- The DDE message thunks force the fAckReq bit to 1 if WM_DDE_DATA is sent with it set
to 0. This forces the client to post the WM_DDE_ACK message so that the thunk layer can
know when to free up data allocated for thunking the WM_DDE_DATA message. The server isn't
expecting the ACK in this case. The thunk layer will recognize the forced ACK, however the
code to consume it has not been implemented yet. Problems so far unseen but still
- Int 3 cannot be trapped via SEH on Win32s.
- Win32's CreateFile() opens files in cooked mode as opposed to raw mode.
- Some time functions, such as ctime(), return values that are off by nine hours. This
happens when the TZ environment variable is not defined. When TZ is defined and set to 0,
these time functions return the correct value. The time offset is determined by the TZ
environment variable, and when it is not defined a default of -9 is used.
- MSTest script Mantapp.mst detects stack overflow when test runs out of memory the
- _lopen - Wrong error code when file does not exist. _lopen failes with error code 87
instead of error code 2 (ERROR_FILE_NOT_FOUND). Win32s is unable to determine from the
return value provided by Windows if the call failed due to the file not being there.
- Cannot do ReadProcessMemory() on memory that has hardware bp set on it.
- MFC Speakn sample won't run on Win32s.
- UT Diagram in Programmers Reference is incorrect.
- CRT: getdcwd/getcwd does not work on Win32s.
- Exception in DLL termination routine causes the system to quit.
- PlayMetaFileRecord/EnumMetaFile contains incorrect lpHTable.
- Windbg assertion on HOST machine.
- The .pif files are not supported.
- PlaySound() with SND_RESOURCE.
- File mapping rounded to a whole number of pages, a multiple of 256 instead of 4096.
The workaround is to use SetFilePointer() and SetEndOfFile() after closing the mapping
handles, but before closing the file.
- chdrive() and SetCurrentDirectory() fail on PCNFS drive.
- Microsoft Excel bapco MSTest script does not run to completion.
- Dynamic dialog boxes under Win32s. An ANSI Win32 application loads a dialog box
resource directly from its executable via LoadResource(). Traverses the dialog box
template and renders its controls into another dialog box. The application then displays
the dialog box which re-positions some of its controls during WM_INITDIALOG. In Windows
NT, the controls rearrange as intended whereas in Win32s, they appear misaligned by 50
pixels or so.
- GetExitCodeProcess() does not return exit codes for 16-bit Windows-based
- Limitation in how NCB memory needs to be allocated on Win32s. The Win31 netbios VxD
expects the memory to be allocated from the Win31 memory space to lock that specific
memory page. If the memory is allocated from somewhere else such as from the Win32s sparse
area, it will fail. In this specific case, allocate a buffer using GlobalAlloc(), memcpy
in it the data retrieved, and call Netbios.
- biSizeImage field of BITMAPINFOHEADER is zero. GetDIBits() is not placing the correct
value for this field into the buffer.
- Only the first CBT hook gets messages.
- Registry functions return incorrect result code. Registry functions such as
RegCreateKey() return incorrect results upon failure. The Windows 3.1 return code is
returned, not the Windows NT return code. The functions that return correct results are:
RegQueryValueA() and RegQueryValueExA()
- General protection (GP) fault in WinExec() 16-bit application context.
- Bad handles from CreateProcess16() if the child doesn't yield.
- GlobalReAlloc(x,y,GMEM_MOVEABLE) returns wrong handle type.
- GMEM_SHARE memory must be freed explicitly.
- RestartThread() writes to debuggee stack.
- The memory for CallBack frames is allocated once. The allocation size is 64K. In most
cases this is too large, and in some extreme cases this 64K may be exhausted.
- CreateDirectory() handles errors differently between Windows NT and Win32s. Under
Windows NT, all failures are handled correctly. For example, directory already exists, no
space left on device, and so on. Under Win32s, all errors are handled identically (error
#5, "Access is denied").
- SetCurrentDirctory(): different error codes on Windows NT and Win32s.
SetCurrentDirectory() works differently under Windows NT 3.5 and Win32s. For example, if
there is no floppy disk in drive B, and SetCurrentDirectory() is called with
"b:\", under Windows NT error #21 is returned, "The device is not
ready," while under Win32s, error #161, "The specified path is invalid" is
- signal(SIGINT, SIGABRT, SIGTERM): need instance data.
- FindText() leaks memory and may cause a general protection (GP) fault.
- spawnl doesn't pass parameters to an MS-DOS-based application.
- Win32s does not support forwarded exports.
- module management APIs missing ANSI to OEM translation.
- PlaySound() w/ SND_NOWAIT.
- FormatMessage() doesn't set last error.
- Createfile(), when used on a write-protected floppy disk, fails. GetLastError()
returns 2 instead of 19.
- Win32app cannot be browsed if the same application is running.
- Setup doesn't create backup files for some of the OLE files.
- winhlp32:Compare macro does not display windows side by side.
- MEASUREITEMSTRUCT and DRAWITEMSTRUCT are missing fields in menus.
- HeapValidate() fails on a new heap. HeapValidate() is not supported in the retail
version of Win32s. GetLastError() returns ERROR_CALL_NOT_IMPLEMENTED. HeapValidate() is
supported only in the debug version of Win32s and in both the retail and debug versions of
Other new heap APIs that are not supported in Win32s are:
HeapCompact() HeapCreateTags() HeapExtend() HeapLock() HeapQueryTag() HeapSummary()
HeapUnlock() HeapUsage() HeapWalk()
All these APIs, including HeapValidate, are documented as not supported on Win32s and
- winhlp32:delete of annotation in popup causes unh exception.
- winhlp32:PopupContext macro produces incorrect error message.
- winhlp32: PC macro with non-help file.
- winhlp32:PopupID with non-existing context string.
- A file opened as GENERIC_READ only can still be written to.
- winhlp32 doesn't play .avi files.
- winhlp32:new highlight feature is not consistent.
- winhlp32:System error on write protected medium.
- winhlp32:bitmap in Shed.hlp does not print correctly.
- winhlp32:winword produces error when attempting to print from a secondary window.
- winhlp32:Clicks go through File Manager.
- MPLAY32.EXE of Windows NT 3.1 does not run on Win32s.
- winhlp32:Window title does not change back.
- winhlp32:kicked out of help after opening non-helpfile.
- SearchPath() doesn't find file if Path is empty. NULL for lpszPath is fine, but an
lpszPath = "" will not work the same as on Windows NT.
- Wrong exception reported for overflow exception.
- VerLanguageNameA() not exported by version.dll.