📄 vgamp.c
字号:
/*
* VGA.C - a generic VGA miniport driver
*
*/
// ------------------------------------------------------- Includes
#include "vgamp.h"
// ------------------------------------------------------- Public Interface
// DriverEntry
//
// DESCRIPTION:
// This function initializes the driver.
//
// RUN LEVEL:
// PASSIVE_LEVEL
//
// ARGUMENTS:
// IN PVOID Context1 Context parameter to pass to VidPortInitialize
// IN PVOID Context2 Context parameter to pass to VidPortInitialize
// RETURNS:
// VP_STATUS
VP_STATUS STDCALL
DriverEntry(IN PVOID Context1,
IN PVOID Context2)
{
VIDEO_HW_INITIALIZATION_DATA InitData;
VideoPortZeroMemory(&InitData, sizeof InitData);
InitData.HwInitDataSize = sizeof(InitData);
/* FIXME: Fill in InitData members */
InitData.StartingDeviceNumber = 0;
/* Export driver entry points... */
InitData.HwFindAdapter = VGAFindAdapter;
InitData.HwInitialize = VGAInitialize;
InitData.HwStartIO = VGAStartIO;
/* InitData.HwInterrupt = VGAInterrupt; */
InitData.HwResetHw = VGAResetHw;
/* InitData.HwTimer = VGATimer; */
return VideoPortInitialize(Context1, Context2, &InitData, NULL);
}
// VGAFindAdapter
//
// DESCRIPTION:
// This routine is called by the videoport driver to find and allocate
// the adapter for a given bus. The miniport driver needs to do the
// following in this routine:
// - Determine if the adapter is present
// - Claim any necessary memory/IO resources for the adapter
// - Map resources into system memory for the adapter
// - fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer
// - update registry settings for adapter specifics.
// - Set 'Again' based on whether the function should be called again
// another adapter on the same bus.
//
// RUN LEVEL:
// PASSIVE_LEVEL
//
// ARGUMENTS:
// PVOID DeviceExtension
// PVOID Context
// PWSTR ArgumentString
// PVIDEO_PORT_CONFIG_INFO ConfigInfo
// PUCHAR Again
// RETURNS:
// VP_STATUS
VP_STATUS STDCALL
VGAFindAdapter(PVOID DeviceExtension,
PVOID Context,
PWSTR ArgumentString,
PVIDEO_PORT_CONFIG_INFO ConfigInfo,
PUCHAR Again)
{
/* FIXME: Determine if the adapter is present */
*Again = FALSE;
return NO_ERROR;
/* FIXME: Claim any necessary memory/IO resources for the adapter */
/* FIXME: Map resources into system memory for the adapter */
/* FIXME: Fill in relevant information in the VIDEO_PORT_CONFIG_INFO buffer */
/* FIXME: Update registry settings for adapter specifics. */
// return NO_ERROR;
}
// VGAInitialize
//
// DESCRIPTION:
// Perform initialization tasks, but leave the adapter in the same
// user visible state
//
// RUN LEVEL:
// PASSIVE_LEVEL
//
// ARGUMENTS:
// PVOID DeviceExtension
// RETURNS:
// BOOLEAN Success or failure
BOOLEAN STDCALL
VGAInitialize(PVOID DeviceExtension)
{
return TRUE;
}
// VGAStartIO
//
// DESCRIPTION:
// This function gets called in responce to GDI EngDeviceIoControl
// calls. Device requests are passed in VRPs.
// Required VRPs:
// IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
// IOCTL_VIDEO_QUERY_AVAIL_MODES
// IOCTL_VIDEO_QUERY_CURRENT_MODE
// IOCTL_VIDEO_SET_CURRENT_MODE
// IOCTL_VIDEO_RESET_DEVICE
// IOCTL_VIDEO_MAP_VIDEO_MEMORY
// IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
// IOCTL_VIDEO_SHARE_VIDEO_MEMORY
// IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY
// Optional VRPs:
// IOCTL_VIDEO_GET_PUBLIC_ACCESS_RANGES
// IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES
// IOCTL_VIDEO_GET_POWER_MANAGEMENT
// IOCTL_VIDEO_SET_POWER_MANAGEMENT
// IOCTL_QUERY_COLOR_CAPABILITIES
// IOCTL_VIDEO_SET_COLOR_REGISTERS (required if the device has a palette)
// IOCTL_VIDEO_DISABLE_POINTER
// IOCTL_VIDEO_ENABLE_POINTER
// IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES
// IOCTL_VIDEO_QUERY_POINTER_ATTR
// IOCTL_VIDEO_SET_POINTER_ATTR
// IOCTL_VIDEO_QUERY_POINTER_POSITION
// IOCTL_VIDEO_SET_POINTER_POSITION
// IOCTL_VIDEO_SAVE_HARDWARE_STATE
// IOCTL_VIDEO_RESTORE_HARDWARE_STATE
// IOCTL_VIDEO_DISABLE_CURSOR
// IOCTL_VIDEO_ENABLE_CURSOR
// IOCTL_VIDEO_QUERY_CURSOR_ATTR
// IOCTL_VIDEO_SET_CURSOR_ATTR
// IOCTL_VIDEO_QUERY_CURSOR_POSITION
// IOCTL_VIDEO_SET_CURSOR_POSITION
// IOCTL_VIDEO_GET_BANK_SELECT_CODE
// IOCTL_VIDEO_SET_PALETTE_REGISTERS
// IOCTL_VIDEO_LOAD_AND_SET_FONT
//
// RUN LEVEL:
// PASSIVE_LEVEL
//
// ARGUMENTS:
// PVOID DeviceExtension
// PVIDEO_REQUEST_PACKET RequestPacket
// RETURNS:
// BOOLEAN This function must return TRUE, and complete the work or
// set an error status in the VRP.
BOOLEAN STDCALL
VGAStartIO(PVOID DeviceExtension,
PVIDEO_REQUEST_PACKET RequestPacket)
{
BOOLEAN Result;
RequestPacket->StatusBlock->Status = ERROR_INVALID_FUNCTION;
switch (RequestPacket->IoControlCode)
{
case IOCTL_VIDEO_MAP_VIDEO_MEMORY:
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);
break;
case IOCTL_VIDEO_QUERY_AVAIL_MODES:
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:
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:
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 = TRUE;
break;
case IOCTL_VIDEO_SET_COLOR_REGISTERS:
if (RequestPacket->InputBufferLength < sizeof(VIDEO_CLUT) ||
RequestPacket->InputBufferLength <
(((PVIDEO_CLUT)RequestPacket->InputBuffer)->NumEntries * sizeof(ULONG)) +
FIELD_OFFSET(VIDEO_CLUT, LookupTable))
{
RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
return TRUE;
}
Result = VGASetColorRegisters((PVIDEO_CLUT) RequestPacket->InputBuffer,
RequestPacket->StatusBlock);
break;
case IOCTL_VIDEO_SET_CURRENT_MODE:
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:
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:
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:
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:
Result = VGASetPaletteRegisters((PUSHORT) RequestPacket->InputBuffer,
RequestPacket->StatusBlock);
break;
#if 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -