Int21 bug

Valentijn Sessink 001+1067428028 at nospam.blub.net
Wed Oct 29 06:24:42 CST 2003


Hi folks,

I think I hunted down a bug in DOS int21 function 0x5b (my DOS book insists
this is 91 decimal). My older version of wine, 2000821, goes like this:

trace:int21:DOS3Call CREATE NEW FILE 0x00 for X:\TMP41.$$$
trace:file:CreateFileA X:\TMP41.$$$ GENERIC_READ GENERIC_WRITE FILE_SHARE_READ FILE_SHARE_WRITE CREATE_NEW
trace:dosfs:DOSFS_GetFullName X:\TMP41.$$$ (last=0)
trace:string:lstrcpynA (0x40e35fa0, "/tmp", 1024)
trace:dosfs:DOSFS_FindUnixName /tmp,TMP41.$$$
trace:heap:HeapAlloc (403c0000,00000002,0000022c): returning 414c9cf4
trace:heap:HeapAlloc (65430000,04000000,00000018): returning 65432c30
warn:dosfs:DOSFS_FindUnixName 'TMP41.$$$' not found in '/tmp'
trace:heap:HeapFree (65430000,04000000,65432c30): returning TRUE
trace:heap:HeapFree (403c0000,00000002,414c9cf4): returning TRUE
trace:dosfs:DOSFS_GetFullName returning /tmp/TMP41.$$$ = X:\tmp41.$$$
080732c8: create_file( access=c0000000, inherit=0, sharing=00000003, create=1, attrs=00000000, filename="/tmp/TMP41.$$$" )
080732c8: create_file() = 0 { handle=136 }
trace:file:FILE_AllocDosHandle Got 10 for h32 136
trace:int21:DOS3Call returning: AX=000a BX=5b0c CX=0000 DX=e9a8 SI=0000 DI=e9a8 DS=0a27 ES=0907 EFL=00000202
trace:global:GlobalHandle16 0107
Ret  KERNEL.102: DOS3CALL() retval=none ret=0347:2513 ds=0a27
     AX=000a BX=5b0c CX=0000 DX=e9a8 SI=0000 DI=e9a8 ES=0907 EFL=00000202
trace:global:GlobalHandle16 0107

So: file handle 0x136 translates to DOS handle 10, and int21 returns AX=0x000a

My newer version, Wine 20030408, does the following:

000a:trace:int21:INT_Int21Handler CREATE NEW FILE 0x00 for X:\TMP18467.$$$
000a:trace:heap:RtlAllocateHeap (0x40370000,00000002,00000020): returning 415b32c0
000a:trace:file:CreateFileW L"X:\\TMP18467.$$$" GENERIC_READ GENERIC_WRITE FILE_SHARE_READ FILE_SHARE_WRITE CREATE_NEW attributes 0x0
000a:trace:dosfs:DOSFS_GetFullName L"X:\\TMP18467.$$$" (last=0)
000a:trace:string:lstrcpynA (0x40f40d84, "/tmp", 1024)
000a:trace:dosfs:DOSFS_FindUnixName /tmp,L"TMP18467.$$$"
000a:trace:dosfs:DOSFS_ToDosFCBFormat (L"TMP18467.$$$", 0x40f40ce4)
000a:trace:heap:RtlAllocateHeap (0x40370000,00000002,00000110): returning 415cc890
000a:trace:dosfs:DOSFS_OpenDir "/tmp"
000a:trace:heap:RtlAllocateHeap (0x40370000,00000002,00000018): returning 415cbca0
000a:trace:heap:RtlReAllocateHeap (0x40370000,00000002,415cc890,00000210): returning 415cc890
000a:trace:heap:RtlReAllocateHeap (0x40370000,00000002,415cc890,00000410): returning 415cc890
000a:trace:heap:RtlReAllocateHeap (0x40370000,00000002,415cc890,00000810): returning 415cc890
000a:trace:heap:RtlReAllocateHeap (0x40370000,00000002,415cc890,00001010): returning 415cc890
000a:trace:heap:RtlFreeHeap (0x40370000,00000002,415cbca0): returning TRUE
000a:trace:dosfs:DOSFS_ReadDir Read: long_name: L".", short_name: (null)
000a:trace:dosfs:DOSFS_ReadDir Read: long_name: L"..", short_name: (null)
000a:trace:dosfs:DOSFS_ReadDir Read: long_name: L".font-unix", short_name: (null)
           [cut directory listing]
000a:warn:dosfs:DOSFS_FindUnixName L"TMP18467.$$$" not found in '/tmp'
000a:trace:heap:RtlFreeHeap (0x40370000,00000002,415cc890): returning TRUE
000a:trace:dosfs:DOSFS_GetFullName returning /tmp/TMP18467.$$$ = L"X:\\tmp18467.$$$"
000a:trace:dosfs:GetDriveTypeW (L"X:\\tmp18467.$$$")
000a: create_file( access=c0000000, inherit=0, sharing=00000003, create=1, attrs=00000000, drive_type=3, filename="/tmp/TMP18467.$$$" )
000a: create_file() = 0 { handle=0x98 }
000a:trace:file:CreateFileW returning 0x98
000a:trace:heap:RtlFreeHeap (0x40370000,00000002,415b32c0): returning TRUE
000a:trace:file:Win32HandleToDosFileHandle Got 10 for h32 0x98
000a:Ret  kernel32.INT_Int21Handler() retval=00000000 ret=41560c39
000a:trace:int21:DOSVM_Int21Handler failed, error 0
000a:trace:int21:DOSVM_Int21Handler returning: AX=0000 BX=5b0f CX=0000 DX=e9a8 SI=0000 DI=e9a8 DS=0a47 ES=0927 EFL=00000203
000a:Ret  winedos.CallBuiltinHandler() retval=0000007c ret=4008d9f0
000a:trace:global:GlobalHandle16 011f

This seems weird: there's a file handle, there's a DOS file handle but Int21
returns AX=0, indicating an error.

I did not yet check the code (will do this afternoon, but beware: I'm not
much of a coder), but I think a fix should be rather easy, there's probably
just a typo (or a thinko) in the Int21 handler.

I'm not sure, but this bug could also help number 1170, that seems related
in that there's a file that is not actually there, and 717, which also tries
to make a file that isn't created.

Please Cc: my e-mail-address as I'm not on the Wine-devel list. the "nospam"
part has an MX record, so mailing shouldn't be a problem.

We also checked Codeweavers Wine for this bug; it seems to be there, but
after two days of bug hunting our hunting ground is a bit of a mess, so I'm
not sure if we tested 2.0 or 2.1. I searched Bugzilla for a DOS related bug
and couldn't find one, but if it's fixed between 20030408 and now, then
please accept my apologies for wasting your precious reading time.

Best regards,

Valentijn



More information about the wine-devel mailing list