[Bug 19494] Windows 3.1 'WRITE.EXE' fails to start, reports " Not enough memory for Write to complete this operation." ( apps must be installed and run from within the WINEPREFIX, drive 'C:')

wine-bugs at winehq.org wine-bugs at winehq.org
Sat Apr 7 19:52:47 CDT 2018


https://bugs.winehq.org/show_bug.cgi?id=19494

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Version|unspecified                 |1.1.26
         Resolution|---                         |INVALID
             Status|UNCONFIRMED                 |RESOLVED
            Summary|Add an option to report     |Windows 3.1 'WRITE.EXE'
                   |less available memory       |fails to start, reports
                   |                            |"Not enough memory for
                   |                            |Write to complete this
                   |                            |operation." (apps must be
                   |                            |installed and run from
                   |                            |within the WINEPREFIX,
                   |                            |drive 'C:')
                 CC|                            |focht at gmx.net

--- Comment #11 from Anastasius Focht <focht at gmx.net> ---
Hello folks,

the reason this bug was created for is invalid.

I found Windows 3.1 disk images from some Internet archive and extracted the
Win16 executable 'WRITE.EXE' (and .HLP) using 'msexpand'.

Reproducing the error by running 'WRITE.EXE' from '~/Downloads' directory:

--- snip ---
$ WINEDEBUG=+seh,+relay,+int21 wine ./WRITE.EXE >>log.txt 2>&1
...
0031:Call KERNEL.97: GETTEMPFILENAME(1400,1466028d "WRI",0000,1467:61f6)
ret=123f:0f91 ds=1466
0031:Call KERNEL32.GetCurrentDirectoryA(00000104,0068e2a4) ret=7e86811f
0031:Ret  KERNEL32.GetCurrentDirectoryA() retval=00000017 ret=7e86811f
0031:Call KERNEL32.GetTempPathA(00000104,0068e2a4) ret=7e868204
0031:Ret  KERNEL32.GetTempPathA() retval=00000014 ret=7e868204
0031:Call ntdll.RtlAllocateHeap(00110000,00000000,00000005) ret=7e868239
0031:Ret  ntdll.RtlAllocateHeap() retval=0017d858 ret=7e868239
0031:Call KERNEL32.GetTempFileNameA(0068e2a4
"C:\\users\\focht\\Temp\\",0017d858 "~WRI",00000000,003cb3f6) ret=7e868274
0031:Ret  KERNEL32.GetTempFileNameA() retval=00002cfb ret=7e868274
0031:Call ntdll.RtlFreeHeap(00110000,00000000,0017d858) ret=7e868295
0031:Ret  ntdll.RtlFreeHeap() retval=00000001 ret=7e868295
0031:Ret  KERNEL.97: GETTEMPFILENAME() retval=00002cfb ret=123f:0f91 ds=1466
0031:Call KEYBOARD.6: OEMTOANSI(146661f6
"C:\\users\\focht\\Temp\\~WR2cfb.tmp",1467:6162) ret=1247:0038 ds=1466
0031:Call user32.OemToCharA(003cb3f6
"C:\\users\\focht\\Temp\\~WR2cfb.tmp",003cb362) ret=7e53be34
0031:Ret  user32.OemToCharA() retval=00000001 ret=7e53be34
0031:Ret  KEYBOARD.6: OEMTOANSI() retval=ffffffff ret=1247:0038 ds=1466
0031:trace:seh:raise_exception code=c0000005 flags=0 addr=0x31 ip=00000031
tid=0031
0031:trace:seh:raise_exception  info[0]=00000000
0031:trace:seh:raise_exception  info[1]=ffffffff
0031:trace:seh:raise_exception  eax=ffff4743 ebx=00006284 ecx=00000000
edx=02d00003 esi=000060df edi=00000000
0031:trace:seh:raise_exception  ebp=00006048 esp=00006044 cs=123f ds=1466
es=1466 fs=0063 gs=006b flags=00210202
0031:trace:seh:call_vectored_handlers calling handler at 0x7e86dafc
code=c0000005 flags=0
0031:trace:seh:call_vectored_handlers handler at 0x7e86dafc returned 0
0031:trace:seh:call_stack_handlers calling handler at 0x7e8ac5ac code=c0000005
flags=0
0031:Call DOS int 0x21 ret=123f:00000033
  eax=ffff4743 ebx=00006284 ecx=00000000 edx=02d00003
  esi=000060df edi=00000000 ebp=00006048 esp=00006044
  ds=1466 es=1466 fs=0063 gs=006b ss=1467 flags=00210202
0031:trace:seh:call_stack_handlers handler at 0x7e8ac5ac returned 0
0031:trace:int21:DOSVM_Int21Handler AX=4743 BX=6284 CX=0000 DX=0003 SI=60df
DI=0000 DS=1466 ES=1466 EFL=00200202
0031:Call KERNEL32.GetDriveTypeW(0068d676 L"C:") ret=7e86f147
0031:Ret  KERNEL32.GetDriveTypeW() retval=00000003 ret=7e86f147 
0031:trace:int21:INT21_GetCurrentDirectory drive 3
0031:Call KERNEL32.GetCurrentDirectoryW(00000104,0068d7b4) ret=7e86f765
0031:Ret  KERNEL32.GetCurrentDirectoryW() retval=00000017 ret=7e86f765
0031:Call KERNEL32.GetEnvironmentVariableW(0068d6a8 L"=C:",0068d7b4,00000104)
ret=7e86f7eb
0031:Ret  KERNEL32.GetEnvironmentVariableW() retval=00000000 ret=7e86f7eb
0031:trace:int21:DOSVM_Int21Handler returning: AX=4743 BX=6284 CX=0000 DX=0003
SI=60df DI=0000 DS=1466 ES=1466 EFL=00200202
0031:trace:seh:raise_exception code=c0000005 flags=0 addr=0x3 ip=00000003
tid=0031
0031:trace:seh:raise_exception  info[0]=00000000
0031:trace:seh:raise_exception  info[1]=ffffffff
0031:trace:seh:raise_exception  eax=ffff4743 ebx=00006284 ecx=00000000
edx=02d00003 esi=000060df edi=00000000
0031:trace:seh:raise_exception  ebp=00006048 esp=000000fc cs=119f ds=1466
es=1466 fs=0063 gs=006b flags=00210202
0031:trace:seh:call_vectored_handlers calling handler at 0x7e86dafc
code=c0000005 flags=0
0031:trace:seh:call_vectored_handlers handler at 0x7e86dafc returned 0
0031:trace:seh:call_stack_handlers calling handler at 0x7e8ac5ac code=c0000005
flags=0
0031:Call DOS int 0x31 ret=119f:00000005
  eax=ffff4743 ebx=00006284 ecx=00000000 edx=02d00003
  esi=000060df edi=00000000 ebp=00006048 esp=000000fc
  ds=1466 es=1466 fs=0063 gs=006b ss=11a7 flags=00210202
0031:trace:seh:call_stack_handlers handler at 0x7e8ac5ac returned 0 
...
0031:Call USER.1: MESSAGEBOX(0000,146764d4 "Not enough memory for Write to
complete this operation.\n\nQuit one or more applications to increase available
memory, and then try again.",14671e78 "Write",0030) ret=1297:0252 ds=1467
--- snip ---

Source:
https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/krnl386.exe16/int21.c#l638

--- snip ---
 638 static BOOL INT21_GetCurrentDirectory( CONTEXT *context, BOOL islong )
 639 {
 640     char  *buffer = CTX_SEG_OFF_TO_LIN(context, context->SegDs,
context->Esi);
 641     BYTE   drive = INT21_MapDrive( DL_reg(context) );
 642     WCHAR  pathW[MAX_PATH];
 643     char   pathA[MAX_PATH];
 644     WCHAR *ptr = pathW;
 645 
 646     TRACE( "drive %d\n", DL_reg(context) );
 647 
 648     if (drive == MAX_DOS_DRIVES)
 649     {
 650         SetLastError(ERROR_INVALID_DRIVE);
 651         return FALSE;
 652     }
 653     
 654     /*
 655      * Grab current directory.
 656      */
 657 
 658     if (!GetCurrentDirectoryW( MAX_PATH, pathW )) return FALSE;
 659 
 660     if (toupperW(pathW[0]) - 'A' != drive || pathW[1] != ':')
 661     {
 662         /* cwd is not on the requested drive, get the environment string
instead */
 663 
 664         WCHAR env_var[4];
 665 
 666         env_var[0] = '=';
 667         env_var[1] = 'A' + drive;
 668         env_var[2] = ':';
 669         env_var[3] = 0;
 670         if (!GetEnvironmentVariableW( env_var, pathW, MAX_PATH ))
 671         {
 672             /* return empty path */
 673             buffer[0] = 0;
 674             return TRUE;
 675         }
 676     }
...
--- snip ---

'INT21_GetCurrentDirectory' with DL = 0x3 = 'C' fails due to current
install/working directory drive letter not being 'C' ('Z' by default).

The resulting app error message is typical Microsoft - generic as possible.
Just don't give the user a proper hint.
It has nothing to do with virtual memory/pagefile etc.

You need to install/copy the apps into the WINEPREFIX and run the app from
there ("cd" into prefix).

This works:

--- snip ---
$ pwd
/home/focht/.wine/drive_c

$ file WRITE.EXE
WRITE.EXE: MS-DOS executable, NE for MS Windows 3.x

$ wine ./WRITE.EXE 
0030:fixme:ole:OleRegisterClientDoc16 (WINWRITE,(Untitled),...): stub
0030:fixme:ole:OleEnumObjects16 (1, 1467:625c): stub
0030:fixme:ole:OleEnumObjects16 (1, 1467:625c): stub
0030:fixme:ole:OleEnumObjects16 (1, 1467:6320): stub
0030:fixme:ole:OleRevertClientDoc16 (1): stub
0030:fixme:ole:OleRevokeClientDoc16 (1): stub
...
--- snip ---

$ sha1sum WRITE.EXE 
60e30536b323d0239c07a56d6d20d20ddefa28df  WRITE.EXE

$ du -sh WRITE.EXE 
240K    WRITE.EXE

$ wine --version
wine-3.5-91-g3263d51a1f

Regards

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list