NOVELL TECHNICAL INFORMATION DOCUMENT TITLE: Deadlocks with Novell NetWare and Windows DOCUMENT ID: TID021978 DOCUMENT REVISION: C DATE: 11JAN95 ALERT STATUS: Yellow INFORMATION TYPE: Symptom Solution README FOR: NA NOVELL PRODUCT and VERSION: NetWare Client for DOS/MS Windows 1.2 ABSTRACT: These document discusses updates that resolve problems when using Windows 3.x or Windows for Workgroups 3.11 on a Novell network. The symptom is a blank screen with a blinking underline curser in the upper-left-hand corner of the screen and the workstation hangs. ----------------------------------------------------------------- DISCLAIMER THE ORIGIN OF THIS INFORMATION MAY BE INTERNAL OR EXTERNAL TO NOVELL. NOVELL MAKES EVERY EFFORT WITHIN ITS MEANS TO VERIFY THIS INFORMATION. HOWEVER, THE INFORMATION PROVIDED IN THIS DOCUMENT IS FOR YOUR INFORMATION ONLY. NOVELL MAKES NO EXPLICIT OR IMPLIED CLAIMS TO THE VALIDITY OF THIS INFORMATION. ----------------------------------------------------------------- ADDITIONAL CONFIGURATION Third-Party Product and Version: Windows 3.x Windows for Workgroups 3.x SYMPTOM The symptom is a blank screen with a blinking underline cursor in the upper-left-hand corner of the screen and the workstation hangs. This may happen at any time while in Windows, launching a DOS box, using a Windows application or exiting Windows. The following is a list of causes/solutions that Novell has isolated that can cause/remedy the symptom described above. CAUSE IPXODI.COM had a problem in SPX. During a retry, SPX would jump to invalid memory causing an invalid opcode exception in v86 mode only when SPX is being used. This usually manifests itself as a reboot, hung machine, or blank screen with cursor in upper-left corner. CAUSE LSL.COM had an issue that was GetStackECBPrescanIsPresent destroyed the return Flag when an ECB was given. The symptom of this problem would most likely manifest it self by a workstation hang when using a protocol stack that expects to get an ECB from the LSL under a heavy load. CAUSE LSL.COM also had a problem with the "Do Send for Windows" code that needed a "Start and End Critical Section" call added. CAUSE An incorrect system configuration including memory management. CAUSE Any I/O, memory, or IRQ conflicts may cause this problem. CAUSE Using third-party device drivers or terminate-and-stay-resident (TSR) programs. CAUSE Lan Card MLID driver's misuse of ECB buffers. (Update ODI MLIDs as a standard trouble shooting tip) CAUSE Third party protocol stacks, such as TCPIP. CAUSE VIPX.386 is a Windows 3.x virtualization driver for IPXODI.COM driver that was enhanced jointly by Novell and Microsoft. It virtualizes requests to the globally loaded IPX driver. When a request is made to IPX, VIPX will allocate a request buffer in the system's global memory, copy the original request to the global buffer and give the global request to IPX. When the global request completes, IPX will call VIPX. VIPX will then copy any results back to the original request buffer and call the application that submitted the request. CAUSE Some Windows applications have been found to create the symptom if when exiting Windows the application is running in the background in a minimized state. If this occurs, close all applications before leaving Windows. CAUSE There are occasions when using a WINSTART.BAT file (which is created by the user and placed in the Windows directory) may also cause Windows to hang when exiting Windows. Avoid a WINSTART.BAT file if the symptom persists. CAUSE Microsoft has a patch called VTDA.386 for their Windows 3.1 VTD (Virtual Timer Device). VTDA.386 is a obtainable from Microsoft. Their BBS number is 206-936-6735 and the file to download is WW0863.EXE. *Note: Windows 3.1 was refreshed to 3.11. In the update, VTDA.386 is made available in the box. This patch is installed by default if you select NetWare in the Windows SETUP option. This also applies to Windows for Workgroups 3.11 users. Version Compatibility with Dedicated IPX ---------------------------------------- Novell officially ceased maintenance on the dedicated IPX driver (IPX.OBJ) version 3.10 dated 11-21-91. The last version of VIPX to explicitly support that driver is 1.10. The current version of VIPX supports IPXODI.COM only. Packet Size Limitations ----------------------- VIPX.386 will only virtualize packets that are 8000 (decimal) bytes or less. Any DOS and Windows IPX or SPX applications that use networks with a physical packet size greater than 8000 bytes may not work with VIPX.386. For example, IBM Token Ring can be configured to run with 16 KB packets. A request by a DOS or Windows IPX application to send a 16 KB packet will be truncated to 8000 bytes. On the other hand, any 16 KB packet that is received by the LAN driver will be dropped because VIPX cannot allocate a packet big enough to handle it. Memory Manager Limitations -------------------------- When a request is passed up from IPX, VIPX will immediately test the request buffer to see if it is in global memory. If it is in global memory, the request will be passed back down to IPX without any virtualization. For example, a TSR loaded before Windows is considered to be in global memory. If that TSR calls IPX, VIPX will test the requests and pass them back down to IPX. This is done because there is no need to virtualize requests that are already global. The use of UMA memory complicates the test for global memory. There are two basic scenarios. The first scenario is when a TSR has been loaded high before Windows was loaded. In this case, IPX requests will come from global UMA memory. VIPX will simply pass these requests back down to IPX. The second scenario is when a TSR is loaded high in a Windows DOSBOX. In this case, IPX requests will come from local UMA memory. VIPX will virtualize these requests. Some memory managers test for global UMA memory and will work properly under both scenarios. However, other memory managers exist that do not work properly under Windows. With these drivers, all local DOSBOX UMAs look as if they are GLOBAL UMAs. In the case of the second scenario when a TSR calls IPX, VIPX will test the request buffer and think that it is in global UMA memory when it is really in LOCAL UMA memory. As a result, VIPX will pass a local ECB to IPX without virtualization. The normal result of this is a hung machine or data corruption. SOLUTION Novell strongly recommends that you update your dedicated IPX driver with IPXODI.COM v2.12 or higher, included in VLMUP2 .EXE, when using versions of VIPX later than 1.10. Because of the problems with LSL.COM, Novell also recommends that you update your LSL.COM to v2.05 or higher. This version is also available in VLMUP4.EXE in the NOVFILES forum of Compuserve. If you are using third-party memory managers and hang, do not load TSRs using the IPX interface (including IPX itself) high. Load these in conventional memory only. Files Needed: Size Date Version Location Owner ================================================================ VIPX.386 23855 05-23-94 1.19 WINDR2.EXE Novell IPXODI.COM 39353 10-31-94 3.01 VLMUP2.EXE Novell LSL.COM 18313 10-11-94 2.14 VLMUP2.EXE Novell VTDA.386 xxxxx xx-xx-xx x.xx WW0863.EXE Microsoft Installation Instructions: 1. Rename or backup the old VIPX.386, IPXODI.COM, and LSL.COM files. 2. Copy IPXODI.COM and LSL.COM to where the network board's software is initialized. 3. Copy VIPX.386 to your WINDOWS\SYSTEM directory. 4. Virtualize the network board's IRQ in the [VIPX] section of the SYSTEM.INI if using IBM LAN SUPPORT. (See Specialized Configuration Parameters below for instructions) 5. Put TimerCriticalSection=10000 in the [386Enh] section of the SYSTEM.INI. 6. Download, and implement the VTDA.386 driver from Microsoft as documented in their README file. 7. Reboot the machine and load the ODI drivers. 8. Enter Windows. Solution Specifics: Specialized Configuration Parameters ------------------------------------ Under most circumstances, VIPX will work fine under the default configuration. However, there may be some applications that require custom configuration of the driver. This following is a list of SYSTEM.INI parameters that can be used to configure VIPX: [VIPX] VipxMappingPages =[number of 4K pages] (default = 16) VipxFailOverSizedPackets =[ON|OFF|TRUE|FALSE] (default = OFF) VirtualizeIrq[0-F] =[ON|OFF|TRUE|FALSE] (default = OFF) VIPX Parameters VipxMappingPages ---------------- This is the number of pages that VIPX can use to globalize requests to the global IPXODI.COM driver. VIPX is not absolutely guaranteed to have all of these pages available at any one point, because this is the requested number of pages for shared global mapping that VIPX makes to the Windows VMM at initialization time. VipxFailOverSizedPackets ------------------------ This parameter tells VIPX to fail any requests that require more than the maximum allowed globalization size. The actual maximum will vary according to the media the user is using. The absolute maximum is 8000 (decimal) bytes. With media that have smaller packets than 8000 bytes, the maximum allowed size is the maximum packet size that can be put onto the media. VirtualizeIrq[0-F] ------------------ VIPX v1.15 or greater avoids a deadlock between the machine and network board by virtualizing the network board's IRQ. With ODI and dedicated IPX (IPX.OBJ) drivers, VIPX will automatically read the configuration of the network board from the driver and virtualize the selected IRQs. However, when using the IBM LAN Support Program with SLANSUP.OBJ or LANSUP.COM, the LAN IRQ is not readable from the driver. The only way to get this information is to read the network board hardware itself. The problem with doing this is that the hardware can be Token Ring, PCN2 or Ethernet. VIPX must now be aware of many different hardware configurations. Instead of this, VIPX requires the IBM LAN Support user to specify the network board's IRQ in the [VIPX] section of the SYSTEM.INI. IRQs range from 0 to F (hex). An example is listed below: [VIPX] VirtualizeIrq2=TRUE VirtualizeIrq3=TRUE In this example, VIPX will virtualize both IRQ 2 and IRQ 3. VIPX can virtualize up to four different LAN IRQs. The reason for virtualizing multiple IRQs is to allow other LAN boards and protocols to be installed on the same PC and prevent them from deadlocking the machine. For example, you may have IPX running through an NE2000 board on IRQ 3 and TCP/IP running through to an IBM Token-Ring board on IRQ 2. VIPX.386 v1.18 included the two following changes: 1. This file corrects a possible problem with virtualizing the network board's interrupt line (IRQ) setting. The Virtualization API returns a carry clear (OK) when the IRQ handle is 0. Now, VIPX.386 will not virtualize the IRQ if the IRQ handle is 0. Also a code was added to specify which VM (Virtual Machine) "owns" a virtualized IRQ. 2. In VIPX.386, a comparison for the VM handle for an AES ECB in the GLOBAL ECB was added. VIPX.386 also verifies the VM handle for an AES ECB in a condition not previously considered. VIPX.386 v1.19 includes the previous two changes plus three additional changes: 1. A changed was made to force Windows applications to open only long-lived sockets. For example, if you ran a DOS BOX with RCONSOLE with v1.18, it would allocate a short-lived socket; and if this DOS box was terminated, VIPX would overwrite an area that caused Windows to trap with a black screen and flashing cursor. VIPX v1.19 fixes this issue. 2. This patch address an issue with a TSR (globally loaded) that needs to open sockets after Windows is loaded. Right now, v1.18 closes all sockets, opened after Windows is loaded, when exiting Windows. A fix was made to check for the KeepLongLivedSocketsOpen parameter. This parameter is set to OFF by default. If this parameter is set to ON when an Open Socket operation is issued from V86 mode, the socket will be considered global and will not be closed when exiting Windows. The syntax to change the default from OFF to ON needs to be added to the end of SYSTEM.INI file as follows: [VIPX] KeepLongLivedSocketsOpen=[TRUE|FALSE|ON|OFF] default=FALSE 3. This patch resolved an issue related to Virtualizing LAN IRQs. For example, when exiting enhanced mode Windows back to DOS, sometimes the cursor will flash in the upper left hand corner and not return back to the DOS prompt. With this update the releasing of a Virtualized IRQ is restored, allowing COMMAND.COM to be reloaded, and the SYSTEM to return to the DOS prompt. TimerCriticalSection -------------------- As of version 1.15 of VIPX, TimerCriticalSection is required to be set on. The recommended setting is as follows: [386Enh] TimerCriticalSection=10000 The reason for this parameter is to avoid a deadlock with the LAN IRQ Virtualization code. See "VirtualizeIrq[0-F]" section. ================================================================ LSL.COM Commandline Switches: Valid switches: U, F, ?, H, C= Only the "U, ?, C=" are documented in the help. U Used to unload LSL. ? Used for Help. F Used to force the unload. H Used as an equivalent to "?" switch, and is used by many of Novell's other utilities. C= Used to change the path or filename of the configuration file. The "C=" switch is the only two-letter switch that is valid, Custom Configuration Files. When using the "C=" command-line switch, the LSL first tries the [path]\filename as given. If the file is not found, then the filename is searched for in the directory where the LSL was loaded from; and if it still cannot be found, it looks in the current working directory. If all these efforts fail, then the LSL reverts back to looking for a "NET.CFG" file in the directory where the LSL was loaded from then in the current working directory. The filename is considered valid even if the path was incorrect. After parsing the Configuration file, the LSL displays the relative path of the Configuration file that was parsed. ================================================================ IPXODI.COM Command line Switches: Valid switches: /?, /D, /A, /C=, /U, /F ? Used for help screen. D Used for Eliminate Diagnostic Responder; reduces size by 3 KB. A Used for Eliminate Diagnostic Responder and SPX; reduces size by 9 KB. PLEASE NOTE: Disabling SPX will mean that SPX applications (such as RPRINTER, BTRIEVE, RCONSOLE, or NetWare for SAA STRNRTR) will not be supported on this workstation. C= Used to change the path or filename of the configuration file. "C=" is the only two letter switch that is valid. If the *.CFG file used does not exist a message will be displayed that the standard NET.CFG file will be used instead. U Used to unload. F Used to force the unload. ----------------------------------------------------------------- Any trademarks referenced in this document are the property of their respective owners. Consult your product manuals for complete trademark information. -----------------------------------------------------------------