[ros-kernel] Patch to VGA miniport - Please review
Hervé Poussineau
poussine at freesurf.fr
Sat Jul 31 02:37:40 CEST 2004
Hi!
I made a patch to vga miniport:
Here is the changelog:
* Implement IOCTL_VIDEO_QUERY_AVAIL_MODES,
IOCTL_VIDEO_QUERY_CURRENT_MODE, IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
* Add checks to input/output structure sizes
* Move prototypes to new file vgamp.h
Can someone please review it (Filip?) ?
If I have no answer in some days, I'll create a bug in BZ an attach it.
Hervé
-------------- next part --------------
/*
* ReactOS VGA miniport video driver
*
* Copyright (C) 2004 Filip Navara
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef VGAMP_H
#define VGAMP_H
/* INCLUDES *******************************************************************/
#include <ddk/miniport.h>
#include <ddk/video.h>
#include <ddk/ntddvdeo.h>
#ifdef DBG
#define DPRINT(arg) DbgPrint arg;
#else
#define DPRINT(arg)
#endif
#define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
void
InitVGAMode();
static VP_STATUS STDCALL
VGAFindAdapter(
PVOID DeviceExtension,
PVOID Context,
PWSTR ArgumentString,
PVIDEO_PORT_CONFIG_INFO ConfigInfo,
PUCHAR Again);
static BOOLEAN STDCALL
VGAInitialize(
PVOID DeviceExtension);
static BOOLEAN STDCALL
VGAStartIO(
PVOID DeviceExtension,
PVIDEO_REQUEST_PACKET RequestPacket);
/*static BOOLEAN STDCALL
VGAInterrupt(PVOID DeviceExtension);*/
static BOOLEAN STDCALL
VGAResetHw(
PVOID DeviceExtension,
ULONG Columns,
ULONG Rows);
/*static VOID STDCALL
VGATimer(PVOID DeviceExtension);*/
/* Mandatory IoControl routines */
BOOL
VGAMapVideoMemory(
IN PVOID DeviceExtension,
IN PVIDEO_MEMORY RequestedAddress,
OUT PVIDEO_MEMORY_INFORMATION MapInformation,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGAQueryAvailModes(
OUT PVIDEO_MODE_INFORMATION ReturnedModes,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGAQueryCurrentMode(
OUT PVIDEO_MODE_INFORMATION CurrentMode,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGAQueryNumAvailModes(
OUT PVIDEO_NUM_MODES NumberOfModes,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGASetColorRegisters(
IN PVIDEO_CLUT ColorLookUpTable,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGASetPaletteRegisters(
IN PWORD PaletteRegisters,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGASetCurrentMode(
IN PVIDEO_MODE RequestedMode,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGAShareVideoMemory(
IN PVIDEO_SHARE_MEMORY RequestedMemory,
OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGAUnmapVideoMemory(
IN PVOID DeviceExtension,
IN PVIDEO_MEMORY MemoryToUnmap,
OUT PSTATUS_BLOCK StatusBlock);
BOOL
VGAUnshareVideoMemory(
IN PVIDEO_MEMORY MemoryToUnshare,
OUT PSTATUS_BLOCK StatusBlock);
#endif /* VGAMP_H */
-------------- next part --------------
Index: drivers/video/miniport/vga/vgamp.c
===================================================================
RCS file: /CVS/ReactOS/reactos/drivers/video/miniport/vga/vgamp.c,v
retrieving revision 1.4
diff -u -r1.4 vgamp.c
--- drivers/video/miniport/vga/vgamp.c 22 Mar 2004 16:00:38 -0000 1.4
+++ drivers/video/miniport/vga/vgamp.c 30 Jul 2004 23:19:40 -0000
@@ -3,63 +3,9 @@
*
*/
-#include <ddk/miniport.h>
-#include <ddk/video.h>
-#include <ddk/ntddvdeo.h>
-
-#define UNIMPLEMENTED do {DbgPrint("%s:%d: Function not implemented", __FILE__, __LINE__); for(;;);} while (0)
-
-#define VERSION "0.0.0"
-void InitVGAMode();
-// ---------------------------------------------------- Forward Declarations
-static VP_STATUS STDCALL
-VGAFindAdapter(PVOID DeviceExtension,
- PVOID Context,
- PWSTR ArgumentString,
- PVIDEO_PORT_CONFIG_INFO ConfigInfo,
- PUCHAR Again);
-static BOOLEAN STDCALL
-VGAInitialize(PVOID DeviceExtension);
-static BOOLEAN STDCALL
-VGAStartIO(PVOID DeviceExtension,
- PVIDEO_REQUEST_PACKET RequestPacket);
-/*
-static BOOLEAN STDCALL
-VGAInterrupt(PVOID DeviceExtension);*/
-static BOOLEAN STDCALL
-VGAResetHw(PVOID DeviceExtension,
- ULONG Columns,
- ULONG Rows);
-/*static VOID STDCALL
-VGATimer(PVOID DeviceExtension);
-*/
+// ------------------------------------------------------- Includes
-/* Mandatory IoControl routines */
-VOID VGAMapVideoMemory(IN PVOID DeviceExtension,
- IN PVIDEO_MEMORY RequestedAddress,
- OUT PVIDEO_MEMORY_INFORMATION MapInformation,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGAResetDevice(OUT PSTATUS_BLOCK StatusBlock);
-VOID VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGASetPaletteRegisters(IN PWORD PaletteRegisters,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGASetCurrentMode(IN PVIDEO_MODE RequestedMode,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory,
- OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGAUnmapVideoMemory(IN PVOID DeviceExtension,
- IN PVIDEO_MEMORY MemoryToUnmap,
- OUT PSTATUS_BLOCK StatusBlock);
-VOID VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare,
- OUT PSTATUS_BLOCK StatusBlock);
+#include "vgamp.h"
// ------------------------------------------------------- Public Interface
@@ -219,63 +165,117 @@
VGAStartIO(PVOID DeviceExtension,
PVIDEO_REQUEST_PACKET RequestPacket)
{
+ BOOL Result;
+
+ RequestPacket->StatusBlock->Status = STATUS_UNSUCCESSFUL;
+
switch (RequestPacket->IoControlCode)
{
case IOCTL_VIDEO_MAP_VIDEO_MEMORY:
- VGAMapVideoMemory(DeviceExtension,
+ if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MEMORY_INFORMATION) ||
+ RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGAMapVideoMemory(DeviceExtension,
(PVIDEO_MEMORY) RequestPacket->InputBuffer,
- (PVIDEO_MEMORY_INFORMATION)
- RequestPacket->OutputBuffer,
- RequestPacket->StatusBlock);
+ (PVIDEO_MEMORY_INFORMATION)
+ RequestPacket->OutputBuffer,
+ RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_QUERY_AVAIL_MODES:
- VGAQueryAvailModes((PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
+ if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGAQueryAvailModes((PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_QUERY_CURRENT_MODE:
- VGAQueryCurrentMode((PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
+ if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGAQueryCurrentMode((PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES:
- VGAQueryNumAvailModes((PVIDEO_NUM_MODES) RequestPacket->OutputBuffer,
+ if (RequestPacket->OutputBufferLength < sizeof(VIDEO_NUM_MODES))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGAQueryNumAvailModes((PVIDEO_NUM_MODES) RequestPacket->OutputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_RESET_DEVICE:
- VGAResetDevice(RequestPacket->StatusBlock);
+ Result = VGAResetDevice(RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_SET_COLOR_REGISTERS:
- VGASetColorRegisters((PVIDEO_CLUT) RequestPacket->InputBuffer,
+ if (RequestPacket->InputBufferLength < sizeof(VIDEO_CLUT) ||
+ RequestPacket->InputBufferLength <
+ (((PVIDEO_CLUT)RequestPacket->InputBuffer)->NumEntries * sizeof(ULONG)) +
+ sizeof(VIDEO_CLUT))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGASetColorRegisters((PVIDEO_CLUT) RequestPacket->InputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_SET_CURRENT_MODE:
- VGASetCurrentMode((PVIDEO_MODE) RequestPacket->InputBuffer,
+ if (RequestPacket->InputBufferLength < sizeof(VIDEO_MODE))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGASetCurrentMode((PVIDEO_MODE) RequestPacket->InputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_SHARE_VIDEO_MEMORY:
- VGAShareVideoMemory((PVIDEO_SHARE_MEMORY) RequestPacket->InputBuffer,
+ if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MEMORY_INFORMATION) ||
+ RequestPacket->InputBufferLength < sizeof(VIDEO_SHARE_MEMORY))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGAShareVideoMemory((PVIDEO_SHARE_MEMORY) RequestPacket->InputBuffer,
(PVIDEO_MEMORY_INFORMATION) RequestPacket->OutputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY:
- VGAUnmapVideoMemory(DeviceExtension,
+ if (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGAUnmapVideoMemory(DeviceExtension,
(PVIDEO_MEMORY) RequestPacket->InputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY:
- VGAUnshareVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer,
+ if (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY))
+ {
+ RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
+ return TRUE;
+ }
+ Result = VGAUnshareVideoMemory((PVIDEO_MEMORY) RequestPacket->InputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_SET_PALETTE_REGISTERS:
- VGASetPaletteRegisters((PWORD) RequestPacket->InputBuffer,
+ Result = VGASetPaletteRegisters((PWORD) RequestPacket->InputBuffer,
RequestPacket->StatusBlock);
break;
@@ -319,8 +319,11 @@
default:
RequestPacket->StatusBlock->Status = STATUS_NOT_IMPLEMENTED;
- break;
+ return FALSE;
}
+
+ if (Result)
+ RequestPacket->StatusBlock->Status = STATUS_SUCCESS;
return TRUE;
}
@@ -362,7 +365,7 @@
// ULONG Rows to reset to.
// RETURNS:
// BOOLEAN TRUE if no further action is necessary, FALSE if the system
-// needs to still do a BOIS int 10 reset.
+// needs to still do a BIOS int 10 reset.
static BOOLEAN STDCALL
VGAResetHw(PVOID DeviceExtension,
@@ -394,7 +397,7 @@
#endif
-VOID VGAMapVideoMemory(IN PVOID DeviceExtension,
+BOOL VGAMapVideoMemory(IN PVOID DeviceExtension,
IN PVIDEO_MEMORY RequestedAddress,
OUT PVIDEO_MEMORY_INFORMATION MapInformation,
OUT PSTATUS_BLOCK StatusBlock)
@@ -415,34 +418,62 @@
if (StatusBlock->Status != 0)
{
StatusBlock->Information = 0;
- return;
+ return TRUE;
}
MapInformation->VideoRamBase = MapInformation->FrameBufferBase =
ReturnedAddress;
MapInformation->VideoRamLength = MapInformation->FrameBufferLength =
ReturnedLength;
StatusBlock->Information = sizeof(VIDEO_MEMORY_INFORMATION);
+ return TRUE;
}
-VOID VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes,
+BOOL VGAQueryAvailModes(OUT PVIDEO_MODE_INFORMATION ReturnedModes,
OUT PSTATUS_BLOCK StatusBlock)
{
- UNIMPLEMENTED;
+ /* Only one mode exists in VGA (640x480), so use VGAQueryCurrentMode */
+ return VGAQueryCurrentMode(ReturnedModes, StatusBlock);
}
-VOID VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode,
+BOOL VGAQueryCurrentMode(OUT PVIDEO_MODE_INFORMATION CurrentMode,
OUT PSTATUS_BLOCK StatusBlock)
{
- UNIMPLEMENTED;
+ CurrentMode->Length = sizeof(VIDEO_MODE_INFORMATION);
+ CurrentMode->ModeIndex = 12;
+ CurrentMode->VisScreenWidth = 640;
+ CurrentMode->VisScreenHeight = 480;
+ CurrentMode->ScreenStride = 0; /* FIXME */
+ CurrentMode->NumberOfPlanes = 1;
+ CurrentMode->BitsPerPlane = 0; /* FIXME */
+ CurrentMode->Frequency = 60;
+ CurrentMode->XMillimeter = 0; /* FIXME */
+ CurrentMode->YMillimeter = 0; /* FIXME */
+ CurrentMode->NumberRedBits =
+ CurrentMode->NumberGreenBits =
+ CurrentMode->NumberBlueBits = 0; /* FIXME */
+ CurrentMode->RedMask =
+ CurrentMode->GreenMask =
+ CurrentMode->BlueMask = 0; /* FIXME */
+ CurrentMode->VideoMemoryBitmapWidth = 640;
+ CurrentMode->VideoMemoryBitmapHeight = 480;
+ CurrentMode->AttributeFlags = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR |
+ VIDEO_MODE_NO_OFF_SCREEN;
+ CurrentMode->DriverSpecificAttributeFlags = 0;
+
+ StatusBlock->Information = sizeof(VIDEO_MODE_INFORMATION);
+ return TRUE;
}
-VOID VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes,
+BOOL VGAQueryNumAvailModes(OUT PVIDEO_NUM_MODES NumberOfModes,
OUT PSTATUS_BLOCK StatusBlock)
{
- UNIMPLEMENTED;
+ NumberOfModes->NumModes = 1;
+ NumberOfModes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION);
+ StatusBlock->Information = sizeof(VIDEO_NUM_MODES);
+ return TRUE;
}
-VOID VGASetPaletteRegisters(IN PWORD PaletteRegisters,
+BOOL VGASetPaletteRegisters(IN PWORD PaletteRegisters,
OUT PSTATUS_BLOCK StatusBlock)
{
;
@@ -468,9 +499,10 @@
tmp = VideoPortReadPortUchar(0x03da);
VideoPortWritePortUchar(0x03d0, v | 0x20);
*/
+ return TRUE;
}
-VOID VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable,
+BOOL VGASetColorRegisters(IN PVIDEO_CLUT ColorLookUpTable,
OUT PSTATUS_BLOCK StatusBlock)
{
int i;
@@ -482,37 +514,50 @@
VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[i].RgbArray.Green);
VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[i].RgbArray.Blue);
}
+
+ return TRUE;
}
-VOID VGASetCurrentMode(IN PVIDEO_MODE RequestedMode,
+BOOL VGASetCurrentMode(IN PVIDEO_MODE RequestedMode,
OUT PSTATUS_BLOCK StatusBlock)
{
if(RequestedMode->RequestedMode == 12)
{
InitVGAMode();
+ return TRUE;
} else {
DbgPrint("Unrecognised mode for VGASetCurrentMode\n");
+ return FALSE;
}
}
-VOID VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory,
+BOOL VGAShareVideoMemory(IN PVIDEO_SHARE_MEMORY RequestedMemory,
OUT PVIDEO_MEMORY_INFORMATION ReturnedMemory,
OUT PSTATUS_BLOCK StatusBlock)
{
UNIMPLEMENTED;
+
+ StatusBlock->Status = STATUS_NOT_IMPLEMENTED;
+ return FALSE;
}
-VOID VGAUnmapVideoMemory(IN PVOID DeviceExtension,
+BOOL VGAUnmapVideoMemory(IN PVOID DeviceExtension,
IN PVIDEO_MEMORY MemoryToUnmap,
OUT PSTATUS_BLOCK StatusBlock)
{
- VideoPortUnmapMemory(DeviceExtension,
+ if (VideoPortUnmapMemory(DeviceExtension,
MemoryToUnmap->RequestedVirtualAddress,
- 0);
+ 0) == NO_ERROR)
+ return TRUE;
+ else
+ return FALSE;
}
-VOID VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare,
+BOOL VGAUnshareVideoMemory(IN PVIDEO_MEMORY MemoryToUnshare,
OUT PSTATUS_BLOCK StatusBlock)
{
UNIMPLEMENTED;
+
+ StatusBlock->Status = STATUS_NOT_IMPLEMENTED;
+ return FALSE;
}
More information about the Ros-kernel
mailing list