
  History DPMILD16/DPMILD32

  DPMILD32

 24.03.2025: version 3.12

  regression in v3.10-v3.11: stub version with HDPMI causes a crash.

 28.01.2023: version 3.11

  bugfix: the last few bytes of DPMILD32's exit code was executed as 32-bit,
   although the code was actually 16-bit; as a result, a wrong DOS exit
   code was returned.
  ensure the alias descriptor has a limit of -1 when accessing an MCB.
  bugfix: terminating in NTVDM caused fault if DPMILDR=2 wasn't set.
  cleaned debug displays.
  switch DPMILDR=1 removed. Instead, the loader detects if a debugger
   is present via Int 41h and runs an Int 3 before program entry.
  bugfix: changing value of DPMILDR=8 by API int 21h, ax=4b94h may have
   caused the loader not to release the PSP and environment of a task.
  switch DPMILDR=256 removed (loading NE dll DEBUGO32.DLL).

 30.03.2022: version 3.10
 
  bugfix: in nested execution, PSP may have become invalid, if DPMILDR=8
   wasn't set.
 
 13.10.2018: version 3.9

  bugfix: if option DPMILDR=8 was set, nested execution failed.
  bugfix: when terminating, segment register SS was temporarily connected
   to a 16-bit data descriptor, which may have caused problems if the ring
   0 stackpointer was >= 0x10000.
  bugfix: if option DPMILDR=8 wasn't set and nested execution occured, 
   a GPF may have occured after an application has terminated.
  linking the loader statically to a binary as a stub ( DPMILD32.BIN )
   didn't work.

 27.05.2011: version 3.8

  minor size reduction.
  failure of DllMain is now assumed if EAX == 0. Previously it was
   EAX != 1.

 16.11.2009: version 3.7

  bugfix: int 21h, ax=4B81h (GetProcAddress32) didn't check if RVA of
   export directory is NULL.
  WLink is used as linker.

 20.01.2009: version 3.6

  assembler switched to JWasm.
  int 21h, ax=4B82h (GetModuleHandle) now checks the full path if
   a full path is given.

 01.03.2008: version 3.5

  bugfix: the stub version (HDLD32.BIN) did release too much DOS
   memory, resulting in corruption of the DPMI host's memory image.
  bugfix: the bottom stack page was not always discarded (when running
   on a DPMI v1.0 host).
  the reserved stack space of PE binaries is still increased by 64 kB,
   but this is now uncommitted space (on a DPMI v1.0 host).
  for PE applications, it's ensured that ESI points to module base on
   entry (makes DPMILD32 compatible with HX's LOADPE.BIN stub).
  int 21h, ax=4B82h, edx=0 API returns more info.

 11.01.2008: version 3.4

  environment variable switch DPMILDR=512 isn't used anymore.
  if DPMILDR=128 is set and an "unresolved import" is called, there
   will be a message displayed before exiting.
  there is now another MZ stub supported (HDLD32.BIN), which includes HDPMI.

 15.07.2007: version 3.3.0

  FS is no longer used/modified by DPMILD32. 
  DPMILD32 does no longer allocate and initialize a TIB for DKRNL32. 
   This is now handled entirely by DKRNL32.

 15.03.2007: version 3.2.0

  bugfix: slashs ('/') in a path weren't handled like backslashs.
  loader initialization simplified.
  DPMILD32 now available as DOS MZ stub (DPMILD32.BIN).
  export GlobalDOSFree added.
  hack removed which made DPMILD32 set a field in the MZ header used
   by DKRNL32 (to end the application load phase). Now this is done
   by a Int 41h callout.
  int 21h, ax=4B95h added to support a "system directory", which some
   applications rely upon.

 14.12.2006: version 3.1.8

  bugfix: there was a chance that the loader allocated too large an
   environment (or even caused a GPF) when a new program was launched
   due to a bug in the routine which get the length of the program name.
  bugfix: exports _AHINCR and _AHSHIFT had wrong ordinals (should be
   a minor issue for DPMILD32 since these exports are used by 16-bit
   binaries only).
  NE dlls reference counter wasn't always updated correctly under some
   circumstances.

 15.10.2006: version 3.1.7

  bugfix: calling WEP of a 16-bit NE dll didn't set DS to DGROUP.

 14.09.2006: version 3.1.6

  GetMuduleFileName may have caused a GPF if an invalid hModule parameter
   was given. 16-bit dlls only.
  bugfix: GlobalFree modified ES. This should only happen if ES contains
   the selector of the block which was released (then ES should be set to 0).
   16-bit dlls only.
  in GlobalRealloc interrupts were disabled by "pushf cli" and restored
   by testing the pushed flags. Now DPMI functions 0900h and 0901h are used.
   16-bit dlls only.

 15.07.2006: version 3.1.5

  switch DPMILDR=8 no longer tries to "hide" the DPMI host. This was a
   hack which caused a HX or Win32 program launched by the current app
   to load a new instance of HDPMI, thus running in a separate address
   space. Since HDPMI 3.07 there is support for multiple address contexts
   natively, so hiding the host is no longer required (which had some
   disadvantages and most likely worked with HDPMI only). However, 
   setting DPMILDR=8 is still usefull when running Win32 applications,
   since it prevents the loader from trying to load the app into the current
   client.
  if DPMILDR=8 is set, the loader will no longer create a child PSP
   for the application to launch (since there will be just one application).
  int 2F, ax=168Eh (to set the console title in win9x) is now only called
   if system *is* win9x.

 14.06.2006: version 3.1.4

  bugfix: loader has lost values of ECX and EBX for 32-bit NE application
   entry points.

 15.05.2006: version 3.1.3

  command line option -g to load a console application as GUI app.

 02.05.2006: version 3.1.2

  bugfix: loading a dll standalone (without an application) didn't work
   in previous version.
  bugfix: if a dll launched a PE app (in dll initialization), it
   never returned.

 30.03.2006: version 3.1.1

  EBX saved/restored when trying to open a file. Some DOSes trash
   HIWORD(EBX) on this call.
  additional security check that FS is valid when unloading dlls.

 27.02.2006: version 3.1

  bugfix: lpvReserved parameter when calling DllMain was always 0.
   Now it is 0 only if dlls are loaded dynamically.
  test for invalid relocations and skip them (SDL_net.dll)
  200h bytes at stack top no longer reserved and no longer needed.
   TLS array and context save area are handled entirely by DKRNL32.

 05.02.2006: version 3.0.9

  200h bytes at stack top reserved for DKRNL32 thread context saving.
  Int 21h, AX=4B81h (GetProcAddress) may have caused a GPF if
   module handle was invalid.
  error "invalid module handle" no longer displayed if flag
   SEM_NOOPENFILEBOX is set.

 20.12.2005: version 3.0.8

  don't execute an application if it is loaded as dll.

 06.12.2005: version 3.0.7

  DPMILD32 displays to stderr now (because stdout output may be
   lost after HXGUIHLP has been loaded)
  HXGUIHLP.DLL now loaded *before* other dll initialization code
   is called (required for OPENGL32.DLL).
  bugfix: cross references in PE dlls caused a GPF
  bugfix LFN version: there was one place with still 65 byte
   size limit for filenames.

 24.11.2005: version 3.0.6

  implemented a version of DPMILD32 with LFN support enabled
  bugfix: bounds check didn't work when importing a function by number

 18.11.2005: version 3.0.5

  loader now will try loading GUI apps on true DOS without
   having to set DPMILDR=8192. 

 01.11.2005: version 3.0.4

  bugfix: int 21h, ax=4b80h (free module) returned 0 on success

 21.10.2005: version 3.0.3

  new DPMILDR setting (8192) to allow loading GUI apps.

 28.09.2005: version 3.0.2

  module name translation GDI32.DLL -> DGDI32.DLL added
 
 19.09.2005: version 3.0.1

  bugfix: memory for image wasn't freed if stack couldn't be allocated.
  DPMILDR switch 4096 added to restrict stack size to 128 kB.

 05.09.2005: version 3.0.0

  bugfix: launching a real-mode app may have failed just because
   MZ-Hdr contained a "big" value at offset 3Ch.

 28.08.2005: version 2.9.9

  error code 000Bh returned if a PE load error occured.
   Previously it was "undefined".

 14.08.2005: version 2.9.8

  bugfix: support for going resident with int 21h, ah=31h lost
   returncode in AL.
  DPMILDR switch 2048 added to protect address range 0-3FFh.
  bugfix: 32bit NE app didn't work in previous release if app wasn't
   the first one. 

 06.08.2005: version 2.9.7

  bugfix: program name in environment was ok for first task only.
  bugfix: first page of stack was uncommitted, but FS:[8]
   (stack bottom) was not adjusted accordingly.
  DOS4G "support" added. This is for PE binaries only, the loader
   doesn't know how to load LE/LX binaries. But it will allow
   to use Open Watcom's CRT modules for DOS extenders to create
   HX PE binaries.

 01.08.2005: version 2.9.6

  field FileHeader.Machine now checked for i386. This will
   prevent the loader from trying to load some old MS binaries
   which must use their own loader (MS32KRNL).
  bugfix: 32bit NE apps trying to load a PE dll caused a GPF.
  bugfix: there was always the last module name displayed on errors.
  new DPMILDR setting (1024) to load dlls at their prefered
   load address. This option is meant mainly for debugging
   purposes, usually dlls can be loaded anywhere in the user address space.

 20.07.2005: version 2.9.5

  bugfix: some messages weren't suppressed despite
   SEM_NOOPENFILEERRORBOX was active.
  bugfix: there was a problem with dynamically loaded dlls,
   which the app doesn't unload itself. DPMILD32 had problems
   to determine the correct unload order, which may have
   resulted in an access violation.

 15.07.2005: version 2.9.4

  first page of stack is now uncommitted to avoid stack 
   overflows to overwrite other memory regions. Works only
   if DPMI host supports int 31h, ax=0507h (V1.0).

 13.07.2005: version 2.9.3

  new DPMILDR setting (512) to exclude DKRNL32 from module list reset.
  bugfix: setting DPMILDR=4 worked, but then if a 32bit NE
   app was started, this caused a loop.

 06.07.2005: version 2.9.2

  bugfix: the 32bit loader may have tried to load 16bit NE
   applications - with bad results. Now this is refused.
  bugfix: int 21h, ax=4b81h expected ES to be a flat selector
  bugfix: if an error occured while resolving imports of a
   starting app, the application exited with errorcode 0FFh.
   Should have been 0FEh instead. And the error message may
   have been suppressed.
  Int 21h, ax=4B81h (GetProcAddress32) now accepts a number
   instead of a string (HIWORD(edx) == 0). This feature was
   required to fully support delay loading.
  bugfix: loader always assumed OptionalHeader has maximum size
   and ignored field FileHeader.SizeOfOptionalHeader.

 27.06.2005: version 2.9.1

  bugfix: an internal function to set the console title
   assumed a wrong DS, thus corrupting DOS memory! It was just
   one bit set to 0, that's why there was a good chance that the
   bug had no consequence - and that's why it remained undeteced
   for quite some time :(.
  bugfix: changing the order of FreeDynLoadedModules
   /FreeReferencedModules calls in the last version was a bug!
  try to load DEBUGO32.DLL now only if switch in DPMILDR is set
  support for 16-bit exports Get-/WritePrivateProfileString deleted.
  search order for dlls:
   - directory of application binary. didn't work previously! 
   - current directory
   - directories of PATH

 23.06.2005: version 2.9

  exchanged calls FreeDynLoadedModules/FreeReferencedModules in FreeModule32
  D bit of stack selector for calling 16-bit procs is now set
   (again). As long as HIWORD(ebp) is cleared before a 16-bit
   proc is called, this should be no problem. On the other hand
   SS with D bit cleared is something that most software doesn't
   expect in a 32-bit host.
  bugfix: error mode set to 8000h as default before app start
   (this means SEM_NOOPENFILEERRORBOX)
  bugfix: export _AHINCR/_AHSHIFT when using DM linker
  bugfix: process termination didn't work if a dll caused
   an error in DLL_DETACH_PROCESS routine.

 14.06.2005: version 2.8.9

  workaround for DPMIONE implemented
  display correct error if memory reallocation failed

 22.05.2005: version 2.8.8

  bugfix: version 2.8.7 introduced a bug so a module was
   searched in PATH even if a directory was included in path!

 20.05.2005: version 2.8.7

  bugfix: loading a dll with a relative path didn't work
  bugfix: the loader assumed that word at PSP:[7Eh] was
   zero-initialized. For OpenDOS (DR-DOS) this is not true and is
   the reason why the loader may have caused a crash by launching 
   a real-mode app. 
  64kB are added to the reserved stack as it is done in win9x
   systems. Wlink by default defines a 64kB reserved stack region
   only, and, on the other hand, the OW stack checking code
   requires a stack of at least 76 kB on win9x systems!
  stack bottom now set in THREAD_INFORMATION_BLOCK.
   Used by VirtualQuery of DKRNL32.DLL (OW stack check)
             
 09.01.2005: version 2.8.7 preliminary

  stack for PE applications is now allocated as a separate
   memory block with unspecified address. Thus it will run
   much better on DOSEMU.

 03.12.2004: version 2.8.6

  loader moving in extended memory now supported for dosemu.
   termination code simplified.
  switched to Digital Mars C++ linker to link DPMILDxx.EXE
  bugfix: on int 21h, ah=4Ch don't modify AL

 31.10.2004: version 2.8.5

  error messages modified:
   "memory allocation error #2" -> "out of memory"
   "init failed" -> "dll init failed"

 08.10.2004: version 2.8.4

  always ignore relocation directory entry if relocations are
   stripped (ldw.exe)

 06.10.2004: version 2.8.3

  bugfix: GetModuleHandle32 didn't find modules if extension
   ".dll" wasn't specified

 11.09.2004: version 2.8.2

  bugfix: don't launch HDPMIxx with command line of DPMILDxx
  loader automatically increases file handles if file open
   fails with error 4

 21.08.2004: version 2.8.1

  new API int 21h, AX=4B94 (set DPMILDR value)
  ESI now holds module handle when a PE module starts
  when receiving an int 41h, AX=F003 (set break), CX:EBX
   may be modified, so it is no longer necessary to set a break

 21.08.2004: version 2.8

  DPMILDR=128 switch added (ignore unresolved import errors).
  bugfix: use current PSP to copy environment selector from
   when creating a child PSP. This is for FreeDOS mainly.

 27.07.2004: version 2.7.9

  DPMILD32, int 21h, ax=4B00h now compatible with DOSEMU 
  Load dlls at their base address if relocs are stripped

 14.06.2004: version 2.7.8

  bugfix: setting DTA (12.05.2004) destroyed HIWORD(ebx) in 
   DPMILD32 (EBX is pointer to EXEC parameter block)

 09.06.2004: version 2.7.7 (released in DEBXXF)

  bugfix: dpmi error display may have caused an exception
  disable 16bit flag now only valid for apps (and DPMILD32)
  SetErrorMode(0) called for PE apps just before app starts
  free 16-bit stack mem only if 16-bit stack selector is valid
  set NE flag 4000h if libentry has been called for dlls
  Loader now always sets parent in PSP as selector, since
   this is required not only by NT platforms, but by win31 as well

 26.05.2004: version 2.7.6

  DPMILD32: NE LibEntry now called with 16-bit stack
  vector int 31h now saved at startup and used in dpmicall.
   this helps for terminating code when client has left interrupts
   in a bad state
  bugfix: DPMILD32: before calling LoadlibIntern clear HIWORD(esi)
  DPMILD32: NE Wep now called with 16-bit stack
  dta saved and restored for each task
  bugfix: WritePrivateProfileString works now!?
  bugfix: user loader psp selector as parent for NT/2K/XP again
   (bugfix from 03.03.2004)
  DPMILD16.EXE and DPMILD32.EXE now patched as DPMI executable
  functions ax=4b91h and ax=4b93h for 16 bit loader as well.
   4b91h will totally disable/enable loader now
  use switch DPMILDR=8 for NE files as well (TLINK.EXE!)

 28.04.2004: version 2.7.5

  if pointer to raw data is zero, dont try to load from file
  use raw data size to determine if anything to load from
   the file (previous just checked uninitialized data flag)
  win16api.asm cleaned, OutputDebugString now for 16bit only
  bugfix: dont check for 0 as dpmi memory handle. this may be valid
  dont free psp with int 31h, ax=102h if dos kill function worked

 22.04.2004: version 2.7.4

  no changes in DPMILDXX, but in DKRNL32

 20.04.2004: version 2.7.3

  freeing 32-bit segment notifications added
  DPMILDR=64 switch added (ignore SEM_NOOPENFILEERRORBOX).
   Also added new API ax=4B93h (SetErrorMode)

 10.04.2004: version 2.7.2

  release memory of discardable sections
  to clear a section use phys size if virt size is smaller
  function int 21h, ax=4b83h now returns dpmi handle in edx

 30.03.2004: version 2.7.1

  no changes in DPMILDXX, but in DKRNL32

 14.03.2004: version 2.7.0

  no more special loader version for DOSEMU needed
  notification int 41h, ax=164h (loading 32bit dll)
  set parent PSP as segment, not selector
  loader now DOSEMU compatible (special version)

 02.02.2004: version 2.6.6

  in FreeModule32 check value of popped fs first (may be invalid)
  copy env ptr to child psp if it is NULL (FreeDOS)

 24.01.2004: version 2.6.5

  another bugfix (the last?) in command line preparation 
  call SetCmdLine for PE apps as well

 19.01.2004: version 2.6.4

  no changes in DPMILDXX, but in DKRNL32

 01.01.2004: version 2.6.3

  write-protect read/only sections (optionally, see DPMILDR=16)
  heap no longer allocated. is done by dkrnl32 now

 20.12.2003: version 2.6.2

  32bit segment load notifications added (int 41h, AX=150)
  bug fixed in command line parser if DPMILDR was executed
   directly (not as overlay from stub)            
  loading continues after first import hasnt been found
   so all missing imports will be reported.
  some changes for CallProc16 (switch to 16-bit stack)
  Dlls now called with stack and PSP of application
   TIB now located behind MZ (each 40h bytes in size)
  FS points to a full TIB now, TLS slots now located on stack

 11.12.2003: version 2.5.3

  import resolves now works with borland PEs (missing ILT)
  dont try to load PE GUI apps

 07.12.2003: version 2.5.2

  new switch DPMILDR=8 (disable loader and server)

 30.11.2003: version 2.5.1

  Versions < 2.5.1:

  The loader was created mainly in 1993 to execute protected mode
  NE executables as 16-bit DPMI clients. This version was able to
  run on 80286 processors as well. Some time later a version for
  32-bit DPMI clients was added, still supporting NE executables
  only and thus unable to provide a true flat memory model. This
  changed in 1995, when the 32-bit version was extended to support
  PE file format. Another major extension was the win32 emulation dll
  DKRNL32.DLL, which allowed to create dual-mode (or bimodal) 
  applications. This happened mainly in 1995 and 1996.

  In 2003 some support for DPMI V1.0 features were added to the DPMI
  server HDPMI. The most remarkable extension was support for function
  0x0504, which allows a client to allocate memory at a specified address.
  This feature allowed the PE loader to load and execute (console) 
  programs even if relocation infos are missing.

 ----------------------------------------------------------------------

  DPMILD16

  Since DPMILD16 and DPMILD32 share the same code base and many changes
 affect DPMILD32 only, there exist versions of DPMILD16 without any
 functional difference compared to the previous version.

 24.03.2025: version 3.12

  fix: garbage error msg if 32-bit host installed, but 16-bit host
   failed to load.
  fix: the loader always assumed that the stack is in the automatic data
   segment.

 28.01.2023: version 3.11

  ensure the alias descriptor has a limit of -1 before accessing an MCB.
  fixed: under rare conditions, the NE segment table was increased by 2
   instead of just 1. It's increased if there's no auto data segment but
   a stack/heap or if the auto data segment is marked as 'CODE' ( true
   if the memory model is "tiny" ).
  cleaned debug displays.
  fixed: alias segments (occur if model is tiny) - when located in DOS
   memory - may have caused the DOS block to shrink by 1 paragraph.
  switch DPMILDR=1 removed. Instead, the loader detects if a debugger
   is present via Int 41h and execs a breakpoint instruction at program entry.
  dgroup alias segments now have the "preload" flag set to support tiny
   model.
  bugfix: changing value of DPMILDR=8 by API int 21h, ax=4b94h may have
   caused the loader not to release the PSP and environment of a task.
  DPMILD16 will now load HDPMI16 if the initial switch to protected-mode
   failed and the current host was HDPMI32.
  bugfix: GlobalAlloc() emulation caused a crash if size was > 1 MB and
   couldn't be divided by 4096 without remainder.
 
 01.03.2008: version 3.5

  bugfix: SI was destroyed if a 16bit dll was loaded.
 
 15.03.2007: version 3.2.0

  bugfix: loading iterated segments may have caused a GPF.
  bugfix: GlobalFree didn't return 0 on success.
  GlobalAlloc no longer limited to sizes < 1 MB if cpu is 80386+. New limit
   is 512 MB, which comes from the 8192 LDT descriptor limit (64 kB * 8192).
  loader initialization simplified.
  loader available as MZ stub.
  export GlobalDOSFree added.
  GlobalCompact(-1) will remove all discardable segments from memory.

 14.12.2006: version 3.1.8

  bugfix: exports _AHINCR and _AHSHIFT did have wrong ordinals (_AHINCR
   had the intended _AHSHIFT value and vice versa).
  bugfix: int 21h, ax=4b93h was not handled by DPMILD16 and routed to
   real-mode (caused problems in DosBox).
  NE dlls reference counter wasn't always updated correctly under some
   circumstances.
  if a binary to load is linked as OS/2 NE application the loader will call
   it with a register set expected by OS/2 applications (thanks to ChowGuy
   who supplied the patch!).
  export GlobalCompact added.
  support for compatibility with Borland's RTM added ("PATCHNE -r").
  implemented support for loading "iterated" segments.

 15.10.2006: version 3.1.7

  exports GetFreeSpace, __C000H, __F000H added.

 05.09.2006: version 3.1.6

  GetMuduleFileName may have caused a GPF if an invalid hModule parameter
   was given.
  bugfix: GlobalFree modified ES. This should only happen if ES contains
   the selector of the block which was released (then ES should be set to 0)
  in GlobalRealloc interrupts were disabled by "pushf cli" and restored
   by testing the pushed flags. Now DPMI functions 0900h and 0901h are used.

 15.07.2006: version 3.1.5

  switch DPMILDR=8 no longer tries to "hide" the DPMI host.
  if DPMILDR=8 is set, the loader will no longer create a child PSP
   for the application to launch (since there will be just one application).
  int 2F, ax=168Eh (to set the console title in win9x) is now only called
   if system *is* win9x.

 14.06.2006: version 3.1.4
 15.05.2006: version 3.1.3
 02.05.2006: version 3.1.2
 30.03.2006: version 3.1.1
 27.02.2006: version 3.1.0
 05.02.2006: version 3.0.9

  error "invalid module handle" no longer displayed if flag
   SEM_NOOPENFILEBOX is set.

 20.12.2005: version 3.0.8
 06.12.2005: version 3.0.7

  DPMILD16 displays to stderr now.

 24.11.2005: version 3.0.6
 18.11.2005: version 3.0.5
 01.11.2005: version 3.0.4
 21.10.2005: version 3.0.3
 28.09.2005: version 3.0.2
 19.09.2005: version 3.0.1
 05.09.2005: version 3.0.0

  bugfix: launching a real-mode app may have failed just because
   MZ-Hdr contained a "big" value at offset 3Ch.
  bugfix: if an image contained no preloaded segments, it
   may have caused a crash if it wasn't loaded as the first
   app.

 28.08.2005: version 2.9.9

  int 21h, ax=4B86h and ax=4B88h implemented
  bugfix: GetModuleFilename didn't work with a HINSTANCE
  check for SS == codesegment extended to DPMILD16. This
   allows the tiny model (code and data in one group) with
   DPMILD16 as well.

 14.08.2005: version 2.9.8
 06.08.2005: version 2.9.7
 01.08.2005: version 2.9.6
 20.07.2005: version 2.9.5
 15.07.2005: version 2.9.4
 13.07.2005: version 2.9.3

  if OS type = OS/2, hold env selector in AX on startup.

 06.07.2005: version 2.9.2

  bugfix: DPMILD16 will now refuse to load a NE app marked as
   Windows app. This check was implemented long ago, but somehow
   had disappeared. Now implemented again.
  bugfix: DPMILD16 will now refuse to load a NE app marked as
   32bit. These are special HX modules loadable by DPMILD32 only.
  module count now updated earlier, so on task entry it should
   have the correct value already
  if binary type is OS/2, InitTask is called internally before
   control will be given to the application. This allows OS/2
   16bit apps to be run with DPMILD16 (if emulation dlls
   DOSCALLS/VIOCALLS/KBDCALLS exist).

 27.06.2005: version 2.9.1

  bugfix: load error in segment not present exception caused a
   fatal loader error (loader terminates)
  directory of .EXE added to dll search order (1. place)

 23.06.2005: version 2.9

  bugfix: export LoadModule crashed on return
  bugfix: _AHINRC/_AHSHIFT weren't exported with DM linker


