From f4f6809d67d9c7ebedb9d252ead3f8f5bb3a911e Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Sat, 9 Nov 2013 17:16:04 +0000 Subject: [PATCH] [NTVDM] Make the emulator callbacks non-static. In BiosPrintCallback, use EmulatorWriteMemory instead of VgaWriteMemory, because VgaWriteMemory does not do any input validation. Improve EmulatorWriteMemory input validation and bound checking. svn path=/branches/ntvdm/; revision=60903 --- subsystems/ntvdm/bios.c | 13 ++++++----- subsystems/ntvdm/emulator.c | 20 ++++++++++------- subsystems/ntvdm/emulator.h | 45 +++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 13 deletions(-) diff --git a/subsystems/ntvdm/bios.c b/subsystems/ntvdm/bios.c index ca3f0a7c2fc..b4f202bc3b1 100644 --- a/subsystems/ntvdm/bios.c +++ b/subsystems/ntvdm/bios.c @@ -760,11 +760,12 @@ VOID BiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page) /* Default character */ /* Write the character */ - VgaWriteMemory(TO_LINEAR(TEXT_VIDEO_SEG, - Page * Bda->VideoPageSize - + (Row * Bda->ScreenColumns + Column) * sizeof(WORD)), - (LPVOID)&CharData, - sizeof(WORD)); + EmulatorWriteMemory(&EmulatorContext, + TO_LINEAR(TEXT_VIDEO_SEG, + Page * Bda->VideoPageSize + + (Row * Bda->ScreenColumns + Column) * sizeof(WORD)), + (LPVOID)&CharData, + sizeof(WORD)); /* Advance the cursor */ Column++; @@ -789,6 +790,8 @@ VOID BiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page) Rectangle, Page, DEFAULT_ATTRIBUTE); + + Row--; } /* Set the cursor position */ diff --git a/subsystems/ntvdm/emulator.c b/subsystems/ntvdm/emulator.c index dbac362a8d4..42dc841f752 100644 --- a/subsystems/ntvdm/emulator.c +++ b/subsystems/ntvdm/emulator.c @@ -29,7 +29,7 @@ static BOOLEAN A20Line = FALSE; /* PRIVATE FUNCTIONS **********************************************************/ -static VOID WINAPI EmulatorReadMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size) +VOID WINAPI EmulatorReadMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size) { UNREFERENCED_PARAMETER(State); @@ -47,14 +47,16 @@ static VOID WINAPI EmulatorReadMemory(PFAST486_STATE State, ULONG Address, PVOID && (Address < VgaGetVideoLimitAddress())) { DWORD VgaAddress = max(Address, VgaGetVideoBaseAddress()); + DWORD ActualSize = min(Address + Size - 1, VgaGetVideoLimitAddress()) + - VgaAddress + 1; LPBYTE VgaBuffer = (LPBYTE)((ULONG_PTR)Buffer + VgaAddress - Address); /* Read from the VGA memory */ - VgaReadMemory(VgaAddress, VgaBuffer, Size); + VgaReadMemory(VgaAddress, VgaBuffer, ActualSize); } } -static VOID WINAPI EmulatorWriteMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size) +VOID WINAPI EmulatorWriteMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size) { UNREFERENCED_PARAMETER(State); @@ -75,14 +77,16 @@ static VOID WINAPI EmulatorWriteMemory(PFAST486_STATE State, ULONG Address, PVOI && (Address < VgaGetVideoLimitAddress())) { DWORD VgaAddress = max(Address, VgaGetVideoBaseAddress()); + DWORD ActualSize = min(Address + Size - 1, VgaGetVideoLimitAddress()) + - VgaAddress + 1; LPBYTE VgaBuffer = (LPBYTE)((ULONG_PTR)Buffer + VgaAddress - Address); /* Write to the VGA memory */ - VgaWriteMemory(VgaAddress, VgaBuffer, Size); + VgaWriteMemory(VgaAddress, VgaBuffer, ActualSize); } } -static VOID WINAPI EmulatorReadIo(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize) +VOID WINAPI EmulatorReadIo(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize) { INT i, j; LPBYTE Address = (LPBYTE)Buffer; @@ -169,7 +173,7 @@ static VOID WINAPI EmulatorReadIo(PFAST486_STATE State, ULONG Port, PVOID Buffer } } -static VOID WINAPI EmulatorWriteIo(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize) +VOID WINAPI EmulatorWriteIo(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize) { INT i, j; LPBYTE Address = (LPBYTE)Buffer; @@ -268,7 +272,7 @@ static VOID WINAPI EmulatorWriteIo(PFAST486_STATE State, ULONG Port, PVOID Buffe } } -static VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode) +VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode) { WORD StackSegment, StackPointer; LPWORD Stack; @@ -286,7 +290,7 @@ static VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode) DPRINT1("Invalid BOP code %u\n", BopCode); } -static UCHAR WINAPI EmulatorIntAcknowledge(PFAST486_STATE State) +UCHAR WINAPI EmulatorIntAcknowledge(PFAST486_STATE State) { UNREFERENCED_PARAMETER(State); diff --git a/subsystems/ntvdm/emulator.h b/subsystems/ntvdm/emulator.h index 53ced8f6f44..877f01e7ab4 100644 --- a/subsystems/ntvdm/emulator.h +++ b/subsystems/ntvdm/emulator.h @@ -86,6 +86,51 @@ extern FAST486_STATE EmulatorContext; /* FUNCTIONS ******************************************************************/ +VOID WINAPI EmulatorReadMemory +( + PFAST486_STATE State, + ULONG Address, + PVOID Buffer, + ULONG Size +); + +VOID WINAPI EmulatorWriteMemory +( + PFAST486_STATE State, + ULONG Address, + PVOID Buffer, + ULONG Size +); + +VOID WINAPI EmulatorReadIo +( + PFAST486_STATE State, + ULONG Port, + PVOID Buffer, + ULONG DataCount, + UCHAR DataSize +); + +VOID WINAPI EmulatorWriteIo +( + PFAST486_STATE State, + ULONG Port, + PVOID Buffer, + ULONG DataCount, + UCHAR DataSize +); + +VOID WINAPI EmulatorBiosOperation +( + PFAST486_STATE State, + UCHAR BopCode +); + +UCHAR WINAPI EmulatorIntAcknowledge +( + PFAST486_STATE State +); + BOOLEAN EmulatorInitialize(VOID); VOID EmulatorSetStack(WORD Segment, DWORD Offset); VOID EmulatorExecute(WORD Segment, WORD Offset); -- 2.17.1