This document is the (unofficial HTML formated) documentation of CWSDPMI
This is release 1. The files in this binary distribution may be redistributed without the source code provided:
CWSDPMI was written to provide DPMI services for V2 of DJGPP. It currently does not support 16-bit DPMI applications, DPMI applications requiring a built in extender, or some DOS/4G programs. It does support virtual memory and hardware interrupt reflection from real mode to protected mode. DJGPP V1.1x and RSX applications will also run using this server, which can be used to provide enhanced control over hardware interrupts. Some DPMI 1.0 extensions (0x506, 0x507, 0x508) have been implemented.
CWSDPR0.EXE is an alternate version which runs at ring 0 with virtual memory disabled. It may be used if access to ring-0 features are desired. It currently does not switch stacks on HW interrupts, so some DJGPP features such as SIGINT and SIGFPE are not supported and will generate a double fault or stack fault error (to be fixed someday).
Directions for use (server can be used in either of two different ways):
I would like to give special thanks to DJ Delorie who wrote the original GO32 code on which CWSDPMI is based. Morten Welinder also provided and improved much of the code in this program.
This section contains a list of the error messages you might see out of CWSDPMI and some details on what they mean.
Exceptions are only handled by CWSDPMI if the application does not establish an exception handler, exceptions nest 5 deep, or the error is particularly bad:
"Page fault" -
"Double Fault" - multiple exceptions occured
"Invalid TSS" - typically due to RMCB or HW interrupt being called after the selectors/memory have been deallocated (remember to reset the mouse)
"General Protection Fault" - bad parameter sent to a DPMI call
"80386 required."
Since 80286 and lesser processors don't have the hardware necessary to run CWSDPMI. No workaround, upgrade.
"DOS 3 required."
A few interrupts are used which need DOS 3.0 or higher. I don't expect to ever see this message, since 80386 machines were introduced after DOS 3.0 and that check is made first.
"CWSDPMI V0.90+ (r1) Copyright (C) 1995 CW Sandmann ABSOLUTELY NO WARRANTY"
An informational message displayed if the program is not run in one-pass mode.
"Protected mode not accessible."
This message should only be displayed if running CWSDPMI in a protected environment with no access to protected mode. In this case, DPMI should already be available and CWSDPMI would not be needed. I would like to know if you see this message and DPMI is not available!
"Warning: cannot open swap file c:\cwsdpmi.swp"
Maybe you are out of file handles, or the swap file name is incorrectly specified in the image (change the name with paramset).
"No swap space!"
This message means you tried to use more paging file than CWSDPMI is compiled to handle (typically 128Mb worth). Since this is protected against in the memory allocation code, you should never see this message.
"Swap disk full!"
This means the paging file could not be expanded when trying to page memory out to disk. This would normally not be seen, unless you are writing output to the same disk which holds the paging file. Decrease the2 amount of memory your DPMI application is using or free up disk space.
"Interrupt 0x??"
Your application tried to call an interrupt from protected mode which normally shouldn't be called (something like a data pointer). If the request was allowed to continue it would likely hang your machine. If you see this message and think the interrupt should be allowed to continue, let me know.
"Error: Using XMS switched the CPU into V86 mode."
This message might be seen if you have your memory manager in AUTO mode. The only workaround in this case is to stop using AUTO mode.
"Error: could not allocate page table memory"
The page table memory (a minimum of 16Kb) is allocated from conventional memory (either in the 640Kb region or UMBs). If CWSDPMI cannot allocate the minimum necessary memory, you would see this message. Free up some conventional memory. You may also see this message if a page directory needs to be faulted in, and there are no available pages. This means too many pages have been locked for the allocated page tables available. While CWSDPMI tries to dynamically allocate these if needed, this effort failed. You need to increase the number of page tables with CWSPARAM, or increase the amount of free conventional memory if it is low.
"Can't handle 16 bit apps, sorry!"
CWSDPMI is a 32-bit only DPMI server. Ideally, on the request to enter DPMI's PM with a 16-bit request, we would just fail the call setting the carry bit like the DPMI specification describes. Some buggy 16-bit compiler tools don't check the return status and will hang the machine in this case. So, I issue an error message and exit the image instead.
"CWSDPMI not removed"
When the -u parameter is specified, if DPMI is not detected this message is printed informational.
Edited by: klaempfl@haegar.cip.mw.uni-muenchen.de
Copyright (C) 1995 Charles W Sandmann sandmann@clio.rice.edu