From 2893d3c4add6adb87e6222087e07529e07c1911f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 14 Jun 2015 16:40:45 +0000 Subject: [PATCH] [NTVDM]: Allocate a dedicated block of memory for the mouse driver, in which we write all the needed info (instead of putting them in the BIOS space). The INT32 stubs go in this region, too. svn path=/trunk/; revision=68138 --- reactos/subsystems/mvdm/ntvdm/dos/mouse32.c | 55 ++++++++++++++------- reactos/subsystems/mvdm/ntvdm/int32.c | 2 +- reactos/subsystems/mvdm/ntvdm/int32.h | 3 +- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/reactos/subsystems/mvdm/ntvdm/dos/mouse32.c b/reactos/subsystems/mvdm/ntvdm/dos/mouse32.c index 0a116f753ac..61a50e74fe9 100644 --- a/reactos/subsystems/mvdm/ntvdm/dos/mouse32.c +++ b/reactos/subsystems/mvdm/ntvdm/dos/mouse32.c @@ -27,18 +27,27 @@ #include "memory.h" #include "io.h" #include "dos32krnl/dos.h" +#include "dos32krnl/memory.h" /* PRIVATE VARIABLES **********************************************************/ -// FIXME: Because I don't know a better place to store the string -// I temporarily put it in BIOS space. This need to be moved to a -// proper place when this driver is interfaced correctly with DOS. -#define COPYRIGHT_POINTER MAKELONG(0xE100, 0xF000) -static const CHAR MouseCopyright[] = "ROS PS/2 16/32-bit Mouse Driver Compatible MS-MOUSE 6.26 Copyright (C) ReactOS Team 1996-2015"; +static const CHAR MouseCopyright[] = "ROS PS/2 16/32-bit Mouse Driver Compatible MS-MOUSE 6.26 Copyright (C) ReactOS Team 1996-2015\0"; -// See FIXME from above. -#define VERSION_POINTER MAKELONG(0xE160, 0xF000) -static PWORD Version; +#pragma pack(push, 1) + +typedef struct _MOUSE_DRIVER +{ + CHAR Copyright[sizeof(MouseCopyright)]; + WORD Version; + BYTE MouseDosInt16Stub[Int16To32StubSize]; + BYTE MouseIrqInt16Stub[Int16To32StubSize]; +} MOUSE_DRIVER, *PMOUSE_DRIVER; + +#pragma pack(pop) + +/* Global data contained in guest memory */ +WORD MouseDataSegment; +PMOUSE_DRIVER MouseData; #define MICKEYS_PER_CELL_HORIZ 8 #define MICKEYS_PER_CELL_VERT 16 @@ -876,8 +885,8 @@ static VOID WINAPI DosMouseService(LPWORD Stack) /* Return Pointer to Copyright String */ case 0x4D: { - setES(HIWORD(COPYRIGHT_POINTER)); - setDI(LOWORD(COPYRIGHT_POINTER)); + setES(MouseDataSegment); + setDI(FIELD_OFFSET(MOUSE_DRIVER, Copyright)); break; } @@ -890,8 +899,8 @@ static VOID WINAPI DosMouseService(LPWORD Stack) * 00h BYTE major version * 01h BYTE minor version (BCD) */ - setES(HIWORD(VERSION_POINTER)); - setDI(LOWORD(VERSION_POINTER)); + setES(MouseDataSegment); + setDI(FIELD_OFFSET(MOUSE_DRIVER, Version)); break; } @@ -914,7 +923,8 @@ VOID DosMouseEnable(VOID) OldIrqHandler = ((PDWORD)BaseAddress)[MOUSE_IRQ_INT]; /* Set the IRQ handler */ - RegisterDosInt32(MOUSE_IRQ_INT, DosMouseIrq); + RegisterInt32(MAKELONG(FIELD_OFFSET(MOUSE_DRIVER, MouseIrqInt16Stub), MouseDataSegment), + MOUSE_IRQ_INT, DosMouseIrq, NULL); } } @@ -986,21 +996,26 @@ VOID DosMouseUpdateButtons(WORD ButtonState) BOOLEAN DosMouseInitialize(VOID) { + /* Initialize some memory for storing our data that should be available to DOS */ + MouseDataSegment = DosAllocateMemory(sizeof(MOUSE_DRIVER), NULL); + if (MouseDataSegment == 0) return FALSE; + MouseData = (PMOUSE_DRIVER)SEG_OFF_TO_PTR(MouseDataSegment, 0x0000); + /* Clear the state */ RtlZeroMemory(&DriverState, sizeof(DriverState)); - /* Setup the version variable in BCD format, compatible MS-MOUSE */ - Version = (PWORD)FAR_POINTER(VERSION_POINTER); - *Version = MAKEWORD(MOUSE_VERSION/0x0100, MOUSE_VERSION%0x0100); - /* Mouse Driver Copyright */ - RtlCopyMemory(FAR_POINTER(COPYRIGHT_POINTER), MouseCopyright, sizeof(MouseCopyright)-1); + RtlCopyMemory(MouseData->Copyright, MouseCopyright, sizeof(MouseCopyright)-1); + + /* Mouse Driver Version in BCD format, compatible MS-MOUSE */ + MouseData->Version = MAKEWORD(MOUSE_VERSION/0x0100, MOUSE_VERSION%0x0100); /* Get the old mouse service interrupt handler */ OldIntHandler = ((PDWORD)BaseAddress)[DOS_MOUSE_INTERRUPT]; /* Initialize the interrupt handler */ - RegisterDosInt32(DOS_MOUSE_INTERRUPT, DosMouseService); + RegisterInt32(MAKELONG(FIELD_OFFSET(MOUSE_DRIVER, MouseDosInt16Stub), MouseDataSegment), + DOS_MOUSE_INTERRUPT, DosMouseService, NULL); DosMouseEnable(); return TRUE; @@ -1014,3 +1029,5 @@ VOID DosMouseCleanup(VOID) if (DriverState.ShowCount > 0) EraseMouseCursor(); DosMouseDisable(); } + +/* EOF */ diff --git a/reactos/subsystems/mvdm/ntvdm/int32.c b/reactos/subsystems/mvdm/ntvdm/int32.c index 79c122a9024..6767119ac4a 100644 --- a/reactos/subsystems/mvdm/ntvdm/int32.c +++ b/reactos/subsystems/mvdm/ntvdm/int32.c @@ -59,7 +59,7 @@ static BYTE Int16To32[] = 0x44, 0x44, // inc sp, inc sp 0xCF, // iret }; -const ULONG Int16To32StubSize = sizeof(Int16To32); +C_ASSERT(sizeof(Int16To32) == Int16To32StubSize); /* PUBLIC FUNCTIONS ***********************************************************/ diff --git a/reactos/subsystems/mvdm/ntvdm/int32.h b/reactos/subsystems/mvdm/ntvdm/int32.h index 552d9107a36..5837cfb5b13 100644 --- a/reactos/subsystems/mvdm/ntvdm/int32.h +++ b/reactos/subsystems/mvdm/ntvdm/int32.h @@ -34,7 +34,8 @@ #define STACK_CS 2 #define STACK_FLAGS 3 -extern const ULONG Int16To32StubSize; +// To be adjusted with the Int16To32 handler code in int32.c +#define Int16To32StubSize 17 /* FUNCTIONS ******************************************************************/