delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2002/03/05/11:15:14

X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-bounces using -f
From: "Joel Saunders" <jbs30000 AT aol DOT com>
Newsgroups: comp.os.msdos.djgpp
Subject: Easy question about pseudo registers
Date: Tue, 5 Mar 2002 16:07:56 +0000 (UTC)
Organization: Mailgate.ORG Server - http://www.Mailgate.ORG
Lines: 63
Message-ID: <5331cfdd479ed421f470c47fd11207f4.62691@mygate.mailgate.org>
NNTP-Posting-Host: spider-ntc-ta053.proxy.aol.com
X-Trace: news.mailgate.org 1015333447 25792 198.81.16.43 (Tue Mar 5 17:07:56 2002)
X-Complaints-To: abuse AT mailgate DOT org
NNTP-Posting-Date: Tue, 5 Mar 2002 16:07:56 +0000 (UTC)
Injector-Info: news.mailgate.org; posting-host=spider-ntc-ta053.proxy.aol.com; posting-account=62691; posting-date=1015333447
User-Agent: Mailgate Web Server
X-URL: http://mygate.mailgate.org/mynews/comp/comp.os.msdos.djgpp/5331cfdd479ed421f470c47fd11207f4.62691%40mygate.mailgate.org
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Ok, I made this real mode int 0xD exception handler.
I test it with a program that makes EBX equal 0x10000 and then does a
(using intel syntax here) mov [ebx], eax which in real mode causes int
0xD to be called.
Now the first thing I have my handler do is print a message...so far so
good.  Now the problem.  IP points to the opcode that caused int 0xD to
be called.  I want to increase IP by 4 so that it'll skip the mov[ebx],
eax.  The way I tried doesn't work.
If someone would look at the "Print_Error_Message" routine at the end of
this message, and tell me what I'm doing wrong and what I need to do,
I'd greatly appreciate it.  Thanks.

#include <sys/farptr.h>
#include <stdio.h>
#include <crt0.h>
#include <dpmi.h>
#include <go32.h>
unsigned char SChar;
int _crt0_startup_flags = _CRT0_FLAG_LOCK_MEMORY;
static __dpmi_regs callback_regs;
static _go32_dpmi_seginfo info;
void Print_Error_Message(_go32_dpmi_registers *r);
main()
{
        unsigned short Offset, Segment;
        Offset = _farpeekw(_dos_ds, 0x34);
        Segment = _farpeekw(_dos_ds, 0x36);
        printf("\nOld 0DH Segment%X\nOld 0DH Offset%X\n", Segment,
Offset);
        __dpmi_regs r;
        info.pm_offset = (long)Print_Error_Message;
        _go32_dpmi_allocate_real_mode_callback_iret(&info,
&callback_regs);
        _go32_dpmi_set_real_mode_interrupt_vector(0xD, &info);
        /* This is needed for my 486 */
        r.x.ax = 0x250D;
        r.x.ds = info.rm_segment;
        r.x.dx = info.rm_offset;
        __dpmi_int(0x21, &r);
        /*****************************/
        Offset = _farpeekw(_dos_ds, 0x34);
        Segment = _farpeekw(_dos_ds, 0x36);
        printf("\nNew 0DH Segment%X\nNew 0DH Offset%X\n", Segment,
Offset);

        /*   __djgpp_exception_toggle(); */     /* Only needed if
exceptions linked */
        r.x.ax = 0x3100;
        r.x.dx = 16;
        __dpmi_int(0x21, &r);
}
void Print_Error_Message(_go32_dpmi_registers *r)
{
        __dpmi_regs reg;
        printf("You Have Caused A General Protection Fault.\n");
        r->x.ip+= 4;
        //reg.x.ax = 0x4c00;
        //__dpmi_int(0x21, &reg);
}


-- 
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

- Raw text -


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