diff options
authorH. Peter Anvin <>2008-09-30 22:08:32 -0700
committerH. Peter Anvin <>2008-09-30 22:08:32 -0700
commit12dd5b734efd1902bef5949efad7b76007fe2fd9 (patch)
parent8a66d38e407220d9685c5508353a5a6f321e7c38 (diff)
Add cwsdpmi to version control
cwsdpmi is included with the MS-DOS build, to provide DPMI services for DJGPP.
-rw-r--r--cwsdpmi/bin/cwsdpmi.exebin0 -> 20125 bytes
-rw-r--r--cwsdpmi/bin/cwsdpr0.exebin0 -> 19335 bytes
-rw-r--r--cwsdpmi/bin/cwsdstub.exebin0 -> 21504 bytes
-rw-r--r--cwsdpmi/bin/cwsparam.exebin0 -> 13124 bytes
-rw-r--r--cwsdpmi/csdpmi5b.zipbin0 -> 54550 bytes
9 files changed, 284 insertions, 0 deletions
diff --git a/cwsdpmi/bin/cwsdpmi.doc b/cwsdpmi/bin/cwsdpmi.doc
new file mode 100644
index 0000000..14b09c4
--- /dev/null
+++ b/cwsdpmi/bin/cwsdpmi.doc
@@ -0,0 +1,173 @@
+CWSDPMI is Copyright (C) 1995-2000 Charles W Sandmann (
+ 1206 Braelinn, Sugar Land, TX 77479
+This is release 5. The files in this binary distribution may be redistributed
+under the GPL (with source) or without the source code provided:
+* CWSDPMI.EXE or CWSDPR0.EXE are not modified in any way except via CWSPARAM.
+* CWSDSTUB.EXE internal contents are not modified in any way except via
+ CWSPARAM or STUBEDIT. It may have a COFF image plus data appended to it.
+* Notice to users that they have the right to receive the source code and/or
+ binary updates for CWSDPMI. Distributors should indicate a site for the
+ source in their documentation.
+CWSDPMI was written to provide DPMI services for V2 of DJGPP. It currently
+does not support 16-bit DPMI applications, or DPMI applications requiring a
+built in extender. 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).
+CWSDSTUB.EXE is a stub loader image for DJGPP which includes CWSDPMI. This
+allows single executable image distributions. You can use the EXE2COFF
+program and COPY /B CWSDSTUB.EXE+yourimage yourimage.exe to create a
+standalone executable image.
+Some of the internal tuning and configuration parameters may be modified
+in the image using CWSPARAM.EXE (see CWSPARAM.DOC).
+If you want to use CWSDPMI with DJGPP, you expand the distribution into the
+DJGPP directory tree. CWSDPMI.EXE will be put in the BIN directory with your
+DJGPP images and it will automatically be loaded when they run.
+Directions for use (server can be used in either of two different ways):
+1) "cwsdpmi" alone with no parameters will terminate and stay resident
+ FOR A SINGLE DPMI PROCESS. This means it unloads itself when your
+ DPMI application exits. This mode is useful in software which needs
+ DPMI services, since CWSDPMI can be exec'ed and then will unload on exit.
+2) "cwsdpmi -p" will terminate and stay resident until you remove it.
+ It can be loaded into UMBs with LH. "cwsdpmi -u" will unload the TSR.
+3) The file used for virtual memory swapping, if desired, is controlled
+ by the "-sc:\cwsdpmi.swp" syntax on the command line. You must specify
+ either a file with full disk/directory syntax, or "-s-" which disables
+ virtual memory.
+4) The default swap file name is c:\cwsdpmi.swp, but this can be changed
+ with the CWSPARAM image, as can some other parameters.
+5) You can disable the DPMI 1.0 extensions by starting the image with the
+ "cwsdpmi -x" syntax. This feature allows you to run programs developed
+ under other DPMI providers which do not behave properly with these
+ extensions enabled (typically use of NULL pointers).
+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" -
+ 1) an illegal page fault happens in a RMCB or HW interrupt, (lock all pages!)
+ 2) all available pages have been locked,
+ 3) the application is using non-committed pages for null pointer protection.
+"Double Fault" - multiple exceptions occurred
+"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+ (r5) Copyright (C) 2000 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. This might happen if
+a 16-bit DPMI client is loaded and a DJGPP image attempts to load CWSDPMI
+to provide 32-bit DPMI services under Windows.
+"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 cwsparam).
+"No swap space!"
+This message means you tried to use more paging file than CWSDPMI was
+configured to handle. 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
+the 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 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. If the application which calls
+CWSDPMI internally manages all the DOS memory, the page tables may need to
+be pre-allocated at DPMI startup time (if this is needed, try using the
+run option flag 2 in cwsparam).
+"16-bit DPMI unsupported."
+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.
+"Descriptors exhausted."
+An attempt to nest a DPMI client failed in the setup phase due to insufficient
+free selectors in the LDT.
+"CWSDPMI not removed"
+When the -u parameter is specified, if DPMI is not detected this message is
+printed. Informational.
diff --git a/cwsdpmi/bin/cwsdpmi.exe b/cwsdpmi/bin/cwsdpmi.exe
new file mode 100644
index 0000000..17e3220
--- /dev/null
+++ b/cwsdpmi/bin/cwsdpmi.exe
Binary files differ
diff --git a/cwsdpmi/bin/cwsdpr0.exe b/cwsdpmi/bin/cwsdpr0.exe
new file mode 100644
index 0000000..1bbac32
--- /dev/null
+++ b/cwsdpmi/bin/cwsdpr0.exe
Binary files differ
diff --git a/cwsdpmi/bin/cwsdstub.exe b/cwsdpmi/bin/cwsdstub.exe
new file mode 100644
index 0000000..fabaf3b
--- /dev/null
+++ b/cwsdpmi/bin/cwsdstub.exe
Binary files differ
diff --git a/cwsdpmi/bin/cwsparam.doc b/cwsdpmi/bin/cwsparam.doc
new file mode 100644
index 0000000..92d4c98
--- /dev/null
+++ b/cwsdpmi/bin/cwsparam.doc
@@ -0,0 +1,102 @@
+CWSPARAM provided by Charles W Sandmann (
+ 1206 Braelinn, Sugar Land, TX 77479
+There are certain parameters built into the CWSDPMI.EXE, CWSDPR0.EXE, and
+CWSDSTUB.EXE images which might need to be modified for distributing some
+programs for better performance. The modified image could be renamed, and
+then the DPMI server name in a DJGPP V2 image may be stubedited to use the
+new name. CWSPARAM can also be run directly on images created by appending
+COFF images to CWSDSTUB.EXE. The parameters which can be modified are
+discussed below:
+Full name of paging file ("" to disable) ? [c:\cwsdpmi.swp]
+ This is where the file which provides virtual memory should be located. It
+ may be desirable to change the default to a faster disk or one with more
+ free space. To disable paging, enter two double quotes. The file name
+ MUST contain the disk, full path, and file name. Anything less may cause
+ unpredictable behavior. The maximum length of the name is 48 characters,
+ and it must be a DOS 8.3 style name. Press return to keep the current value.
+Number of page tables to initially allocate (0=auto) ? [0]
+ Page tables are stored in the DOS memory area and consume this precious
+ resource. The default value of 0 chooses automatic allocation of enough
+ page tables to hold all of the physical memory without paging (with the
+ minimum enough to hold 20Mb without paging and a maximum to hold 128Mb).
+ If your program is a fixed size (and does not spawn any other DPMI images)
+ you can specify one page table for each 4Mb of your program's size. If
+ your program is small, this can save a small amount of DOS memory, which
+ might be needed for other purposes. If your program is large (typically
+ larger than the physical memory) specifying a number will consume more DOS
+ memory but improve performance since the page tables themselves will not
+ page. CWSDPMI will attempt to dynamically allocate additional page tables
+ at run time to prevent paging, but if all of the DOS memory is free,
+ performance would be degraded. Remember to add an extra page table if
+ mapping physical devices. As of r5, you must also allocate additional
+ space for the bitmaps for physical and virtual memory (one bit for each
+ 4K page). Add one page for each 128Mb of total address space
+ (physical+virtual). Be generous, since someone may run the image on a
+ 512Mb machine (or larger) and require 4 pages for the physical bitmap
+ even if you disable virtual memory.
+Minimum application memory desired before 640K paging ? [512Kb]
+ Typically, CWSDPMI only uses extended memory to return as DPMI memory, and
+ saves the DOS memory area for DOS requests. On small memory machines with
+ applications not needing much DOS memory (or poorly tuned memory management)
+ there may be very little extended memory left available, with up to 600K of
+ DOS memory unused. This parameter determines the threshold which CWSDPMI
+ should start using DOS memory as DPMI memory. If an application is known to
+ not need much DOS memory, this value could be set to the size of the memory
+ required for the image, which provides roughly 0.5Mb additional memory before
+ paging happens. This parameter is one I would expect might be adjusted when
+ distributing an application for maximum performance on a wide variety of
+ machines.
+Paragraphs of DOS memory to reserve when 640K paging ? [3840]
+ If the image needs to page in the DOS memory area (triggered by the parameter
+ value above), this parameter tells how much DOS memory to save for DOS
+ allocation requests. The value is in paragraphs (16 byte increments), so the
+ default is 60Kbytes. You will actually end up with a bit more probably, since
+ the page tables are allocated on 4Kbyte rounded boundaries. Some amount of
+ DOS memory needs to be saved for potentially expanding the file table, the
+ sbrk() algorithm, DMA buffers, etc. This amount can be tuned on an image
+ by image basis, and may be as little as 0.
+Paragraphs of memory for extra CWSDPMI internal heap ? [256]
+ CWSDPMI is built with an internal 4K heap. Each nested task consumes around
+ 300 bytes, each memory zone takes 12 bytes, and each HW interrupt (nested)
+ takes around 850 bytes. If extra DOS memory is available, the additional
+ paragraphs specified here are added to the heap at execution time by DOS.
+ The 8K default should be good for up to 40Mb in small requests. If you
+ compile very large C++ programs or allocate lots of memory in small pieces,
+ you might need to bump this parameter. If you are very tight on memory,
+ you could decrease it to zero and pick up another 4K of DOS memory. Each
+ paragraph allows a little more than one more memory zone (or in the worse
+ case around 85Kb of DPMI memory).
+Maximum size of swap file ? [128Mb]
+ CWSDPMI dynamically allocates memory at run time for up to 2044Mb of swap file
+ space. The bitmap for the swap usage requires 32 bytes of memory per 1Mb of
+ swap usage. The default will provide up to 128Mb of swap space with a run
+ time memory requirement of 4Kb DOS memory. The dynamic allocation is limited
+ by the free space on the drive, so if you don't have much space on your hard
+ drive, you don't need to worry about this. If you run small programs and want
+ to save memory (maybe to stuff the allocation in a UMB) you can decrease this
+ value. If you want to run monster programs needing 2Gb of address space you
+ can increase this value (but this would increase the DOS memory usage). This
+ value is ignored by CWSDPR0.
+Value of run option flags ? [0]
+ There are a few run-time options in CWSDPMI which should not be needed by most
+ users which can be activated by this field of bit flags:
+ Bit 0 (1): Disable allocation of run time page tables in UMBs (low only)
+ Bit 1 (2): Pre-allocate page table memory (in DPMI memory request)
+ Bit 2 (4): Disable DPMI 1.0 extensions (Null page protection, mapping)
+ Other values should be zero for future compatibility but are currently ignored.
diff --git a/cwsdpmi/bin/cwsparam.exe b/cwsdpmi/bin/cwsparam.exe
new file mode 100644
index 0000000..181b3f0
--- /dev/null
+++ b/cwsdpmi/bin/cwsparam.exe
Binary files differ
diff --git a/cwsdpmi/ b/cwsdpmi/
new file mode 100644
index 0000000..12876fb
--- /dev/null
+++ b/cwsdpmi/
Binary files differ
diff --git a/cwsdpmi/manifest/csdpmi5b.mft b/cwsdpmi/manifest/csdpmi5b.mft
new file mode 100644
index 0000000..ae143fe
--- /dev/null
+++ b/cwsdpmi/manifest/csdpmi5b.mft
@@ -0,0 +1,8 @@
diff --git a/cwsdpmi/manifest/csdpmi5b.ver b/cwsdpmi/manifest/csdpmi5b.ver
new file mode 100644
index 0000000..9340dd8
--- /dev/null
+++ b/cwsdpmi/manifest/csdpmi5b.ver
@@ -0,0 +1 @@
+csdpmi5b CWSDPMI binary distribution (release 5)