To: djgpp AT delorie DOT com Subject: Re: Detecting win95: the hard way References: <8D53104ECD0CD211AF4000A0C9D60AE35C4BCB AT probe-2 DOT acclaim-euro DOT net> From: Michael Bukin Date: 01 Mar 1999 22:37:43 +0600 In-Reply-To: Shawn Hargreaves's message of "Mon, 1 Mar 1999 12:57:57 -0000" Message-ID: <20btidb1yg.fsf@Sky.inp.nsk.su> Lines: 71 X-Mailer: Gnus v5.5/Emacs 19.34 Reply-To: djgpp AT delorie DOT com Shawn Hargreaves writes: > I need a way to detect when a djgpp program (Allegro) is being run > under win95. At the moment I do this using the documented detection > function, int 0x2F with ax=0x1600. The problem is that in the > properties for the win95 dosbox, there is an option to specifically > stop this function from working, ie. to make win95 lie and pretend > it isn't there. For some reason, it seems that significant numbers > of people have this option enabled, with the result that Allegro > mis-diagnoses the current environment, uses the wrong version of > the timer module, and everything falls to pieces. It seems that both "Get Application Title" and "Get Virtual Machine Title" work with and without this flag set and don't work in MS-DOS mode. I can not say if there is a situation when they work in non Windows environment or might fail in Windows environment. I only tested them in Windows-95 and MS-DOS 7.0. Short example program #include #include #include #include int main (void) { int size; char *title; __dpmi_regs r; size = _go32_info_block.size_of_transfer_buffer; title = malloc (size); if (title == 0) { fprintf (stderr, "Not enough memory\n"); exit (EXIT_FAILURE); } r.x.ax = 0x168E; r.x.es = (__tb >> 4) & 0xFFFF; /* Is this masking really needed? */ r.x.di = (__tb & 0x0F); r.x.cx = size - 1; r.x.dx = 2; __dpmi_int (0x2F, &r); if (r.x.ax != 1) { fprintf (stderr, "Failed to get application title!\n"); exit (EXIT_FAILURE); } dosmemget (__tb, size, title); printf ("Application title: %s\n", title); r.x.ax = 0x168E; r.x.es = (__tb >> 4) & 0xFFFF; r.x.di = (__tb & 0x0F); r.x.cx = size - 1; r.x.dx = 3; __dpmi_int (0x2F, &r); if (r.x.ax != 1) { fprintf (stderr, "Failed to get virtual machine title!\n"); exit (EXIT_FAILURE); } dosmemget (__tb, size, title); printf ("Virtual machine title: %s\n", title); return EXIT_SUCCESS; } -- Michael Bukin