www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1998/09/03/10:31:29

From: eddie AT lvp DOT nl (Eddie Penninkhof)
Newsgroups: comp.os.msdos.djgpp
Subject: Problem with DPMI / NT4.0
Date: Thu, 03 Sep 1998 14:14:01 GMT
Organization: L.V.P. b.v.
Lines: 78
Message-ID: <35eea126.699595@news.worldonline.nl>
NNTP-Posting-Host: vp233-2.worldonline.nl
Mime-Version: 1.0
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

I'm trying to access a 32 bit 'TSR' djgpp program from a 16 bits DOS
program. I'm using a ('software') interrupt to achieve this. This
works fine in a OS/2 or Windows 95 DOS-box, but crashes in a Windows
NT 4.0 (SP3) DOS-box. It gives a SIGSEGV in the djgpp-program and a
'16 bit MS-DOS Subsystem' popup: 'X#=0D, CS=00C7 IP=00004989. The
NTVDM CPU has encountered an unhandled exception.'

Is this a bug in NT (probably) or in DJGPP? Does anybody have a way to
circumvent it?

Tnx, Eddie.

This is the (sample) program (note: for brevity I removed the checking
of returncodes, but none of the dpmi-functions gives an errorcode...).
------8<------8<------8<------8<------8<------8<
#include <stdio.h>
#include <process.h>
#include <dpmi.h>
#include <go32.h>

typedef struct
{
   _go32_dpmi_registers   regs;
   _go32_dpmi_seginfo   orgaddr;
   _go32_dpmi_seginfo   newaddr;
} TData;

TData data;

void inthandler(void)
{
}
static void inthandler_lock(void)
{
}

unsigned char rgCode[7] =
{
   0xCD, 0x64,     /* INT 64H */
   0xB8, 0x00, 0x4C,   /* MOV AX,4C00 */
   0xCD, 0x21      /* INT 21H */
};

int main(void)
{
   int      ret = 0;
   FILE      *f;
   int      intno   = 100;

   /* Create a small .com-file that calls interrupt 100 */
   f = fopen("int100.com", "wb");
   fwrite(rgCode, 7, 1, f);
   fclose(f);

   /* Lock the code/data of the interrupt-handler */
   _go32_dpmi_lock_data(&data, sizeof(TData));
   _go32_dpmi_lock_code(inthandler, (unsigned long)(inthandler_lock -
      inthandler));
   
   /* Save the previous interrupt-handler */
   _go32_dpmi_get_real_mode_interrupt_vector(intno, &data.orgaddr);
   
   /* Set the new handler for interrupt 100. */
   data.newaddr.pm_selector = _go32_my_cs();
   data.newaddr.pm_offset = (int) inthandler;
   _go32_dpmi_allocate_real_mode_callback_iret(&data.newaddr,
      &data.regs);
   _go32_dpmi_set_real_mode_interrupt_vector(intno, &data.newaddr);

   /* Call a 16 bit program that calls interrupt 100 */
   ret = spawnl(P_WAIT, "int100.com", "int100.com", NULL);

   /* Restore the original interrupt handler. */
   _go32_dpmi_set_real_mode_interrupt_vector(intno, &data.orgaddr);
   _go32_dpmi_free_real_mode_callback(&data.newaddr);
   return (0);
}
------8<------8<------8<------8<------8<------8<------8<------8<

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019