Date: Wed, 5 Jan 2000 10:43:25 +0200 (IST) From: Eli Zaretskii X-Sender: eliz AT is To: Martin Str|mberg cc: djgpp AT delorie DOT com Subject: Re: The endless int31 hooking debugging continued In-Reply-To: <84sife$ral$1@news.luth.se> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Reply-To: djgpp AT delorie DOT com X-Mailing-List: djgpp AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk On 4 Jan 2000, Martin Str|mberg wrote: > When I run the program last in this mail in plain DOZE I get this > crash dump (yes, it's all of it, only three lines): > F:\HACKERY\DPMI_SEL>simple6 > got interrupt vector > General Protection Fault at eip=2407; flags=3016 > eax=0000000d ebx=000000af ecx=0001465e edx=00014418 esi=00002548 edi=00002540 > ebp=0000000d esp=0001ae14 cs=a7 ds=af es=af fs=8f gs=bf ss=af error=0000 This message comes from CWSDPMI (see the telltale flags= string?), in which case it is normal to have only 3 lines. > When I disassemble the code around EIP 2407 (with "objdump -D > simple6.exe") I find this: > 000023cb : > 23cb: 66 8e c0 movw %ax,%es This crash is inside the DJGPP exception-processing code (you can find it in exceptn.S). It is quite normal to have the EIP point here when the crash message comes from CWSDPMI: both indicate that you have severely botched the execution environment, and the DPMI server is bailing out by the skin of its teeth... > __asm__ (".globl _handler > _handler: > > /* Jump to previous handler. */ > chain: > pushl %eax > pushl %ecx > pushl %edx > pushl $_chain_str > call _cputs > addl $4, %esp > popl %edx > popl %ecx > popl %eax > > ljmp _old_addr I see two immediate problems with this hook: 1) it calls a library function `cputs' without setting up the run-time environment expected by code generated by GCC (a valid DJGPP selector in DS, DS=ES=SS); 2) it calls _old_addr without the CS: override, which won't work because DS is not guaranteed to be loaded with DJGPP's data selector (if you set up the registers as `cputs' requires, this problem will go away as well). Btw, whenever you have such problems, it is useful to browse library sources that do similar tricks, looking for ideas. For example, dbgcom.c hooks Int 31h, so you can compare your code with what's there. > /* > Local Variables: > compile-command: "gcc -g -O2 -Wall -o simple6 simple6.c" > End: > */ Oh, we have an Emacs user here ;-)