winedos / Fix BIOS segment address under Win16

kd6qog40m at comcast.net kd6qog40m at comcast.net
Sun Sep 28 02:07:15 CDT 2003


the wine routine works but int 10 is only on amd prossesors
> BIOS data area is not necessarily at a fixed location.
> Win16 programs that do not jump into real mode code
> may have NULL pointer catching block at low linear memory
> and BIOS data area has been moved elsewhere. This patch
> should make sure that correct linear pointer is used
> for accessing BIOS data area.
> 
> This should fix bug 1732 and I have also seen this bug with
> some Win16 programs.
> 
> Pending stuff that I should be fixing when I have more time:
> 
> - DPMI async event handling is subject to stalls and deadlocks
>   because instruction emulation is no longer protected
>   from signals.
> - DPMI/RM performance is poor because the number of exceptions has
>   dramatically increased. This is due to send_debug_event
>   calling server during each exception.
> - Fixes to mouse driver (hide/show, virtual size, mouse range).
>   These are ready but require cleaning and synchronizing with CVS.
> - RMCB calls. Working thing exists but it uses interrupt hooks.
>   Perhaps fixing WOWCallback16Ex return path to support more
>   registers would be better...
> 
> 
> 
> 
> Changelog:
>     Use correct linear pointer when accessing BIOS data area.
> 
> 
> 
> 
> Index: dlls/winedos/devices.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/winedos/devices.c,v
> retrieving revision 1.9
> diff -u -r1.9 devices.c
> --- dlls/winedos/devices.c	25 Aug 2003 01:01:01 -0000	1.9
> +++ dlls/winedos/devices.c	27 Sep 2003 19:22:16 -0000
> @@ -219,7 +219,7 @@
>  {
>    int *scan;
>    REQUEST_HEADER *hdr = get_hdr(SYSTEM_STRATEGY_CON,(void **)&scan);
> -  BIOSDATA *bios = BIOS_DATA;
> +  BIOSDATA *bios = DOSVM_BiosData();
>    WORD CurOfs = bios->NextKbdCharPtr;
>    DOS_LISTOFLISTS *lol = DOSMEM_LOL();
>    DOS_DATASEG *dataseg = (DOS_DATASEG *)lol;
> 
> 
> 
> 
> Index: dlls/winedos/dosexe.h
> ===================================================================
> RCS file: /home/wine/wine/dlls/winedos/dosexe.h,v
> retrieving revision 1.32
> diff -u -r1.32 dosexe.h
> --- dlls/winedos/dosexe.h	17 Sep 2003 22:45:46 -0000	1.32
> +++ dlls/winedos/dosexe.h	27 Sep 2003 19:33:42 -0000
> @@ -100,8 +100,6 @@
>  #define VIF_MASK 0x00080000
>  #define VIP_MASK 0x00100000
>  
> -#define BIOS_DATA ((void *)0x400)
> -
>  #define ADD_LOWORD(dw,val)  ((dw) = ((dw) & 0xffff0000) | 
> LOWORD((DWORD)(dw)+(val)))
>  
>  /* module.c */
> @@ -123,6 +121,7 @@
>  extern void WINAPI DOSVM_PIC_ioport_out( WORD port, BYTE val );
>  extern void WINAPI DOSVM_SetTimer( UINT ticks );
>  extern UINT WINAPI DOSVM_GetTimer( void );
> +extern BIOSDATA   *DOSVM_BiosData( void );
>  
>  /* devices.c */
>  extern void DOSDEV_InstallDOSDevices(void);
> 
> 
> 
> 
> Index: dlls/winedos/dosvm.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/winedos/dosvm.c,v
> retrieving revision 1.52
> diff -u -r1.52 dosvm.c
> --- dlls/winedos/dosvm.c	17 Sep 2003 20:23:33 -0000	1.52
> +++ dlls/winedos/dosvm.c	27 Sep 2003 19:22:28 -0000
> @@ -707,6 +707,26 @@
>  
>  
>  /**********************************************************************
> + *         DOSVM_BiosData
> + *
> + * Get pointer to BIOS data area. This is not at fixed location
> + * because those Win16 programs that do not use any real mode code have
> + * protected NULL pointer catching block at low linear memory and
> + * BIOS data has been moved to another location.
> + */
> +BIOSDATA *DOSVM_BiosData( void )
> +{
> +    LDT_ENTRY entry;
> +    FARPROC16 proc;
> +
> +    proc = GetProcAddress16( GetModuleHandle16( "KERNEL" ), 
> +                             (LPCSTR)(ULONG_PTR)193 );
> +    wine_ldt_get_entry( LOWORD(proc), &entry );
> +    return (BIOSDATA *)wine_ldt_get_base( &entry );
> +}
> +
> +
> +/**********************************************************************
>   *	    DllMain  (DOSVM.Init)
>   */
>  BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
> 
> 
> 
> 
> Index: dlls/winedos/int09.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/winedos/int09.c,v
> retrieving revision 1.8
> diff -u -r1.8 int09.c
> --- dlls/winedos/int09.c	5 Sep 2003 23:08:28 -0000	1.8
> +++ dlls/winedos/int09.c	27 Sep 2003 19:22:32 -0000
> @@ -150,7 +150,7 @@
>   */
>  void WINAPI DOSVM_Int09Handler( CONTEXT86 *context )
>  {
> -  BIOSDATA *data = BIOS_DATA;
> +  BIOSDATA *data = DOSVM_BiosData();
>    BYTE ascii, scan = DOSVM_Int09ReadScan(&ascii);
>    BYTE realscan = scan & 0x7f; /* remove 0x80 make/break flag */
>    BOOL modifier = FALSE;
> 
> 
> 
> 
> Index: dlls/winedos/int10.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/winedos/int10.c,v
> retrieving revision 1.31
> diff -u -r1.31 int10.c
> --- dlls/winedos/int10.c	8 Apr 2003 19:41:03 -0000	1.31
> +++ dlls/winedos/int10.c	27 Sep 2003 19:22:37 -0000
> @@ -789,7 +789,7 @@
>   */
>  static void INT10_HandleVESA( CONTEXT86 *context )
>  {
> -    BIOSDATA *data = BIOS_DATA;
> +    BIOSDATA *data = DOSVM_BiosData();
>  
>      switch(AL_reg(context)) {
>  
> @@ -954,7 +954,7 @@
>   */
>  void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
>  {
> -    BIOSDATA *data = BIOS_DATA;
> +    BIOSDATA *data = DOSVM_BiosData();
>  
>      INT10_InitializeVideoMode( data );
>  
> @@ -1403,7 +1403,7 @@
>   */
>  void WINAPI DOSVM_PutChar( BYTE ascii )
>  {
> -  BIOSDATA *data = BIOS_DATA;
> +  BIOSDATA *data = DOSVM_BiosData();
>    unsigned  xpos, ypos;
>  
>    TRACE("char: 0x%02x(%c)\n", ascii, ascii);
> 
> 
> 
> 
> Index: dlls/winedos/int16.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/winedos/int16.c,v
> retrieving revision 1.11
> diff -u -r1.11 int16.c
> --- dlls/winedos/int16.c	2 May 2003 20:12:52 -0000	1.11
> +++ dlls/winedos/int16.c	27 Sep 2003 19:22:40 -0000
> @@ -87,7 +87,7 @@
>     case 0x02: /* Get Shift Flags */
>  
>        /* read value from BIOS data segment's keyboard status flags field */
> -      data = BIOS_DATA;
> +      data = DOSVM_BiosData();
>        SET_AL( context, data->KbdFlags1 );
>  
>        TRACE("Get Shift Flags: returning 0x%02x\n", AL_reg(context));
> @@ -159,7 +159,7 @@
>   */
>  int WINAPI DOSVM_Int16ReadChar(BYTE *ascii, BYTE *scan, CONTEXT86 *waitctx)
>  {
> -    BIOSDATA *data = BIOS_DATA;
> +    BIOSDATA *data = DOSVM_BiosData();
>      WORD CurOfs = data->NextKbdCharPtr;
>  
>      /* check if there's data in buffer */
> @@ -194,7 +194,7 @@
>  
>  int WINAPI DOSVM_Int16AddChar(BYTE ascii,BYTE scan)
>  {
> -  BIOSDATA *data = BIOS_DATA;
> +  BIOSDATA *data = DOSVM_BiosData();
>    WORD CurOfs = data->FirstKbdCharPtr;
>    WORD NextOfs = CurOfs + 2;
>  
> 
> 
> 
> 
> Index: dlls/winedos/int1a.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/winedos/int1a.c,v
> retrieving revision 1.3
> diff -u -r1.3 int1a.c
> --- dlls/winedos/int1a.c	15 Jul 2003 20:50:34 -0000	1.3
> +++ dlls/winedos/int1a.c	27 Sep 2003 19:22:44 -0000
> @@ -40,7 +40,7 @@
>      {
>      case 0x00: /* GET SYSTEM TIME */
>          {
> -            BIOSDATA *data = BIOS_DATA;
> +            BIOSDATA *data = DOSVM_BiosData();
>              SET_CX( context, HIWORD(data->Ticks) );
>              SET_DX( context, LOWORD(data->Ticks) );
>              SET_AL( context, 0 ); /* FIXME: midnight flag is unsupported */
> 
> 
> 
> 
> Index: dlls/winedos/timer.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/winedos/timer.c,v
> retrieving revision 1.3
> diff -u -r1.3 timer.c
> --- dlls/winedos/timer.c	17 Sep 2003 22:45:46 -0000	1.3
> +++ dlls/winedos/timer.c	27 Sep 2003 19:22:48 -0000
> @@ -131,7 +131,7 @@
>   */
>  void WINAPI DOSVM_Int08Handler( CONTEXT86 *context )
>  {
> -    BIOSDATA *bios_data      = BIOS_DATA;
> +    BIOSDATA *bios_data      = DOSVM_BiosData();
>      CONTEXT86 nested_context = *context;
>      FARPROC16 int1c_proc     = DOSVM_GetRMHandler( 0x1c );
>      
> 
> 
> 
> -- 
> Jukka Heinonen <http://www.iki.fi/jhei/>
> 



More information about the wine-devel mailing list