| delorie.com/archives/browse.cgi | search |
| From: | locke AT mcs DOT net (Peter Johnson) |
| Newsgroups: | comp.os.msdos.djgpp |
| Subject: | DPMI bug test for Win2000 |
| Message-ID: | <MPG.12e9581fb41ce9149896e8@news-proxy.cso.uiuc.edu> |
| X-Newsreader: | MicroPlanet Gravity v2.12 |
| X-Proxy-Client: | pljohnsn AT uiuc DOT edu from 207-229-150-156.d.enteract.com |
| Lines: | 104 |
| Date: | Fri, 14 Jan 2000 15:59:08 -0600 |
| NNTP-Posting-Host: | 128.174.5.27 |
| X-Complaints-To: | abuse AT uiuc DOT edu |
| X-Trace: | vixen.cso.uiuc.edu 947887114 128.174.5.27 (Fri, 14 Jan 2000 15:58:34 CST) |
| NNTP-Posting-Date: | Fri, 14 Jan 2000 15:58:34 CST |
| Organization: | University of Illinois at Urbana-Champaign |
| To: | djgpp AT delorie DOT com |
| DJ-Gateway: | from newsgroup comp.os.msdos.djgpp |
| Reply-To: | djgpp AT delorie DOT com |
Would people out there with Win2000 beta please compile and run the
following program to see if it crashes? It tests to see if the DPMI
Real- Mode callback bug I discovered in NT 4.0 is present in 2000.
The code uses sbrk() to put the registers structure in question well over
the 64K mark and installs a mouse callback. In my testing it crashes in
NT 4 and doesn't crash in Win98. I want to find out if the bug still
exists in Win2000, so please try it and post here whether it crashes or
not. Thanks!
Compile with "gcc -o testrmcb.exe testrmcb.c".
-- Cut Here - testrmcb.c --
/* RMCB test program for >64K regs structure compliance
Based (somewhat) on Allegro's mouse routines */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <go32.h>
#include <dpmi.h>
volatile int test = 0;
static _go32_dpmi_seginfo dpmi_seginfo;
int install_mouse();
void remove_mouse();
int main()
{
if(install_mouse())
{
printf("Can't find mouse driver!");
return 1;
}
while(!kbhit())
{
if(test)
{
printf("got one.\n");
test = 0;
}
}
getch();
remove_mouse();
return 0;
}
void mouseint(_go32_dpmi_registers *r)
{
test = 1;
}
int install_mouse()
{
__dpmi_regs r;
_go32_dpmi_registers *dpmi_regs;
sbrk(1000000);
dpmi_regs = sbrk(sizeof(_go32_dpmi_registers));
r.x.ax = 0;
__dpmi_int(0x33, &r); /* initialise mouse driver */
if (r.x.ax == 0) {
return -1;
}
/* create real mode callback for the int33 driver */
dpmi_seginfo.pm_offset = (int)mouseint;
dpmi_seginfo.pm_selector = _my_cs();
_go32_dpmi_allocate_real_mode_callback_retf(&dpmi_seginfo, dpmi_regs);
r.x.ax = 0x0C;
r.x.cx = 0x7F;
r.x.dx = dpmi_seginfo.rm_offset;
r.x.es = dpmi_seginfo.rm_segment;
__dpmi_int(0x33, &r); /* install callback */
return 0;
}
void remove_mouse()
{
__dpmi_regs r;
r.x.ax = 0x0C;
r.x.cx = 0;
r.x.dx = 0;
r.x.es = 0;
__dpmi_int(0x33, &r); /* install NULL callback */
_go32_dpmi_free_real_mode_callback(&dpmi_seginfo);
}
--
Peter Johnson locke AT mcs DOT net
:Windows: Where do you want to go today?
:Linux: Where do you want to go tomorrow?
:FreeBSD: Are you guys coming or what?
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |