41 if (DeviceExtension->AvailableModeInfo)
44 DeviceExtension->AvailableModeInfo =
NULL;
55 if (DeviceExtension->IoPorts.RangeInIoSpace)
72 if (DeviceExtension->IoPorts.RangeInIoSpace)
119 DeviceExtension->AvailableModeCount = ModeCount;
153 DeviceExtension->MaxXResolution = 1024;
154 DeviceExtension->MaxYResolution = 768;
163 if (DeviceExtension->MaxXResolution == 0 && DeviceExtension->MaxYResolution == 0)
165 DeviceExtension->MaxXResolution = 1024;
166 DeviceExtension->MaxYResolution = 768;
171 DeviceExtension->VramSize64K = 4 * 1024 / 64;
175 DeviceExtension->VramSize64K = 8 * 1024 / 64;
182 DeviceExtension->MaxXResolution,
183 DeviceExtension->MaxYResolution,
184 DeviceExtension->VramSize64K * 64 / 1024));
187#define HEX(c) (((c) >= 0 && (c) <= 9) ? (c) + L'0' : (c) - 10 + L'A')
194 SizeInBytes = DeviceExtension->VramSize64K * 64 * 1024;
208 ModeInfo->Length =
sizeof(*ModeInfo);
209 ModeInfo->ModeIndex =
Index;
210 ModeInfo->VisScreenWidth = AvailableModeInfo->XResolution;
211 ModeInfo->VisScreenHeight = AvailableModeInfo->YResolution;
212 ModeInfo->ScreenStride = AvailableModeInfo->XResolution * 4;
213 ModeInfo->NumberOfPlanes = 1;
214 ModeInfo->BitsPerPlane = 32;
215 ModeInfo->Frequency = 60;
218 ModeInfo->XMillimeter = AvailableModeInfo->XResolution * 254 / 960;
219 ModeInfo->YMillimeter = AvailableModeInfo->YResolution * 254 / 960;
220 ModeInfo->NumberRedBits = 8;
221 ModeInfo->NumberGreenBits = 8;
222 ModeInfo->NumberBlueBits = 8;
223 ModeInfo->RedMask = 0xff0000;
224 ModeInfo->GreenMask = 0x00ff00;
225 ModeInfo->BlueMask = 0x0000ff;
228 ModeInfo->VideoMemoryBitmapWidth = AvailableModeInfo->XResolution;
229 ModeInfo->VideoMemoryBitmapHeight = AvailableModeInfo->YResolution;
246 VideoMemory = DeviceExtension->FrameBuffer.RangeStart;
247 MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress;
248 MapInformation->VideoRamLength = 4 *
249 DeviceExtension->AvailableModeInfo[DeviceExtension->CurrentMode].XResolution *
250 DeviceExtension->AvailableModeInfo[DeviceExtension->CurrentMode].YResolution;
254 &MapInformation->VideoRamLength,
256 &MapInformation->VideoRamBase);
260 StatusBlock->Status =
Status;
264 MapInformation->FrameBufferBase = MapInformation->VideoRamBase;
265 MapInformation->FrameBufferLength = MapInformation->VideoRamLength;
266 StatusBlock->Information =
sizeof(*MapInformation);
269 VideoDebugPrint((
Info,
"Bochs:BochsMapVideoMemory Exit VideoRamBase: %p VideoRamLength: 0x%x PhysBasePtr: 0x%x\n",
270 MapInformation->VideoRamBase, MapInformation->VideoRamLength, (
ULONG)VideoMemory.
QuadPart));
283 VideoDebugPrint((
Info,
"Bochs: BochsUnmapVideoMemory Entry VideoRamBase:%p\n", VideoMemory->RequestedVirtualAddress));
289 VideoMemory->RequestedVirtualAddress,
293 StatusBlock->Status =
Status;
306 AvailableModes->NumModes = DeviceExtension->AvailableModeCount;
309 StatusBlock->Information =
sizeof(*AvailableModes);
325 for (
Count = 0, AvailableModeInfo = DeviceExtension->AvailableModeInfo, ModeInfo = ReturnedModes;
326 Count < DeviceExtension->AvailableModeCount;
327 Count++, AvailableModeInfo++, ModeInfo++)
348 ULONG ModeRequested = RequestedMode->RequestedMode & 0x3fffffff;
353 if (ModeRequested >= DeviceExtension->AvailableModeCount)
360 AvailableModeInfo = &DeviceExtension->AvailableModeInfo[ModeRequested];
376 if (!DeviceExtension->IoPorts.RangeInIoSpace)
384 DeviceExtension->CurrentMode = (
USHORT)ModeRequested;
400 if (DeviceExtension->CurrentMode > DeviceExtension->AvailableModeCount)
406 AvailableModeInfo = &DeviceExtension->AvailableModeInfo[DeviceExtension->CurrentMode];
408 BochsGetModeInfo(AvailableModeInfo, VideoModeInfo, DeviceExtension->CurrentMode);
410 StatusBlock->Information =
sizeof(*VideoModeInfo);
438 StatusBlock->Information =
sizeof(*pChildState);
455 if (ConfigInfo->Length <
sizeof(*ConfigInfo))
470 if (AccessRanges[1].RangeLength == 0)
484 else if (AccessRanges[1].RangeLength != 0x1000)
486 VideoDebugPrint((
Error,
"Bochs: invalid access ranges (size 0x%x)\n", AccessRanges[1].RangeLength));
516 ULONG PotentialModeCount = 0;
559 switch (RequestPacket->IoControlCode)
564 if (RequestPacket->InputBufferLength <
sizeof(
VIDEO_MEMORY))
579 RequestPacket->StatusBlock);
585 if (RequestPacket->InputBufferLength <
sizeof(
VIDEO_MEMORY))
592 RequestPacket->StatusBlock);
605 RequestPacket->StatusBlock);
618 RequestPacket->StatusBlock);
624 if (RequestPacket->InputBufferLength <
sizeof(
VIDEO_MODE))
632 RequestPacket->StatusBlock);
645 RequestPacket->StatusBlock);
652 RequestPacket->StatusBlock);
658 if (RequestPacket->OutputBufferLength <
sizeof(
ULONG))
664 (
PULONG)RequestPacket->OutputBuffer,
665 RequestPacket->StatusBlock);
671 RequestPacket->IoControlCode));
713 if (ChildEnumInfo->Size <
sizeof(*VideoChildType))
716 if (ChildEnumInfo->ChildIndex == 0)
729 if (ChildEnumInfo->ChildIndex != 1)
735 if (pChildDescriptor &&
744 VideoDebugPrint((
Info,
"Bochs: BochsGetVideoChildDescriptor Exit Uid:%d\n", ChildEnumInfo->ChildIndex));
BOOLEAN NTAPI BochsInitialize(_In_ PVOID HwDeviceExtension)
static VOID BochsGetModeInfo(_In_ PBOCHS_SIZE AvailableModeInfo, _Out_ PVIDEO_MODE_INFORMATION ModeInfo, _In_ ULONG Index)
static BOOLEAN BochsMapVideoMemory(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _In_ PVIDEO_MEMORY RequestedAddress, _Out_ PVIDEO_MEMORY_INFORMATION MapInformation, _Out_ PSTATUS_BLOCK StatusBlock)
static BOOLEAN NTAPI BochsUnmapVideoMemory(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _In_ PVIDEO_MEMORY VideoMemory, _Out_ PSTATUS_BLOCK StatusBlock)
static BOOLEAN BochsWriteDispIAndCheck(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _In_ ULONG Index, _In_ USHORT Value)
VP_STATUS NTAPI BochsFindAdapter(_In_ PVOID HwDeviceExtension, _In_ PVOID HwContext, _In_ PWSTR ArgumentString, _In_ PVIDEO_PORT_CONFIG_INFO ConfigInfo, _In_ PUCHAR Again)
static BOOLEAN BochsQueryCurrentMode(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _Out_ PVIDEO_MODE_INFORMATION VideoModeInfo, _Out_ PSTATUS_BLOCK StatusBlock)
VP_STATUS NTAPI BochsGetPowerState(_In_ PVOID HwDeviceExtension, _In_ ULONG HwId, _Out_ PVIDEO_POWER_MANAGEMENT VideoPowerControl)
static BOOLEAN BochsGetChildState(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _Out_ PULONG pChildState, _Out_ PSTATUS_BLOCK StatusBlock)
static const BOCHS_SIZE BochsAvailableResolutions[]
BOOLEAN NTAPI BochsStartIO(_In_ PVOID HwDeviceExtension, _Inout_ PVIDEO_REQUEST_PACKET RequestPacket)
static VOID BochsFreeResources(_Inout_ PBOCHS_DEVICE_EXTENSION DeviceExtension)
VP_STATUS NTAPI BochsSetPowerState(_In_ PVOID HwDeviceExtension, _In_ ULONG HwId, _In_ PVIDEO_POWER_MANAGEMENT VideoPowerControl)
VP_STATUS NTAPI BochsGetVideoChildDescriptor(_In_ PVOID HwDeviceExtension, _In_ PVIDEO_CHILD_ENUM_INFO ChildEnumInfo, _Out_ PVIDEO_CHILD_TYPE VideoChildType, _Out_ PUCHAR pChildDescriptor, _Out_ PULONG UId, _Out_ PULONG pUnused)
static BOOLEAN BochsQueryNumAvailableModes(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _Out_ PVIDEO_NUM_MODES AvailableModes, _Out_ PSTATUS_BLOCK StatusBlock)
static BOOLEAN BochsInitializeSuitableModeInfo(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _In_ ULONG PotentialModeCount)
static BOOLEAN BochsSetCurrentMode(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _In_ PVIDEO_MODE RequestedMode, _Out_ PSTATUS_BLOCK StatusBlock)
static USHORT BochsReadDispI(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _In_ ULONG Index)
static BOOLEAN BochsQueryAvailableModes(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _Out_ PVIDEO_MODE_INFORMATION ReturnedModes, _Out_ PSTATUS_BLOCK StatusBlock)
static BOOLEAN BochsResetDevice(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _Out_ PSTATUS_BLOCK StatusBlock)
static VOID BochsWriteDispI(_In_ PBOCHS_DEVICE_EXTENSION DeviceExtension, _In_ ULONG Index, _In_ USHORT Value)
static BOOLEAN BochsGetControllerInfo(_Inout_ PBOCHS_DEVICE_EXTENSION DeviceExtension)
#define VBE_DISPI_INDEX_BPP
#define VBE_DISPI_GETCAPS
#define VBE_DISPI_IOPORT_INDEX
#define VBE_DISPI_ENABLED
#define VBE_DISPI_INDEX_ID
#define VBE_DISPI_IOPORT_DATA
#define VBE_DISPI_INDEX_XRES
#define VBE_DISPI_DISABLED
#define VBE_DISPI_INDEX_YRES
#define VBE_DISPI_INDEX_ENABLE
#define VBE_DISPI_INDEX_VIDEO_MEMORY_64K
#define VBE_DISPI_LFB_ENABLED
#define ERROR_DEV_NOT_EXIST
#define ERROR_DEVICE_REINITIALIZATION_NEEDED
#define ERROR_INSUFFICIENT_BUFFER
#define ERROR_INVALID_FUNCTION
#define ERROR_INVALID_PARAMETER
DRIVER_INITIALIZE DriverEntry
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define memcpy(s1, s2, n)
#define IOCTL_VIDEO_MAP_VIDEO_MEMORY
#define VIDEO_MODE_GRAPHICS
#define IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
#define IOCTL_VIDEO_QUERY_CURRENT_MODE
#define IOCTL_VIDEO_GET_CHILD_STATE
#define IOCTL_VIDEO_SET_CURRENT_MODE
#define IOCTL_VIDEO_RESET_DEVICE
#define VIDEO_CHILD_ACTIVE
#define VIDEO_MODE_NO_OFF_SCREEN
struct _VIDEO_MODE_INFORMATION VIDEO_MODE_INFORMATION
#define IOCTL_VIDEO_QUERY_AVAIL_MODES
#define IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA _In_ PVOID HwContext
VPAPI USHORT NTAPI VideoPortReadRegisterUshort(IN PUSHORT Register)
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
#define VIDEO_ENUM_INVALID_DEVICE
VPAPI VP_STATUS NTAPI VideoPortVerifyAccessRanges(_In_ PVOID HwDeviceExtension, _In_opt_ ULONG NumAccessRanges, _In_reads_opt_(NumAccessRanges) PVIDEO_ACCESS_RANGE AccessRanges)
Claims or releases a range of hardware resources and checks for conflicts.
VPAPI VOID NTAPI VideoPortWriteRegisterUshort(IN PUSHORT Register, IN USHORT Value)
VPAPI VP_STATUS NTAPI VideoPortUnmapMemory(IN PVOID HwDeviceExtension, IN OUT PVOID VirtualAddress, IN HANDLE ProcessHandle)
VPAPI PVOID NTAPI VideoPortGetDeviceBase(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS IoAddress, IN ULONG NumberOfUchars, IN UCHAR InIoSpace)
#define VIDEO_ENUM_NO_MORE_DEVICES
VPAPI VOID NTAPI VideoPortFreePool(IN PVOID HwDeviceExtension, IN PVOID Ptr)
VPAPI ULONG NTAPI VideoPortInitialize(IN PVOID Argument1, IN PVOID Argument2, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext)
VPAPI VP_STATUS NTAPI VideoPortMapMemory(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS PhysicalAddress, IN OUT PULONG Length, IN PULONG InIoSpace, IN OUT PVOID *VirtualAddress)
VPAPI USHORT NTAPI VideoPortReadPortUshort(IN PUSHORT Port)
#define DISPLAY_ADAPTER_HW_ID
enum _VIDEO_CHILD_TYPE * PVIDEO_CHILD_TYPE
VPAPI PVOID NTAPI VideoPortAllocatePool(IN PVOID HwDeviceExtension, IN VP_POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
#define VIDEO_MEMORY_SPACE_MEMORY
VPAPI VP_STATUS NTAPI VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension, IN PWSTR ValueName, IN PVOID ValueData, IN ULONG ValueLength)
#define VIDEO_ENUM_MORE_DEVICES
#define VideoDebugPrint(x)
VPAPI VP_STATUS NTAPI VideoPortGetAccessRanges(_In_ PVOID HwDeviceExtension, _In_opt_ ULONG NumRequestedResources, _In_reads_opt_(NumRequestedResources) PIO_RESOURCE_DESCRIPTOR RequestedResources, _In_ ULONG NumAccessRanges, _Out_writes_(NumAccessRanges) PVIDEO_ACCESS_RANGE AccessRanges, _In_ PVOID VendorId, _In_ PVOID DeviceId, _Out_ PULONG Slot)
Retrieves bus-relative (mainly PCI) hardware resources access ranges and, if possible,...
VPAPI VOID NTAPI VideoPortWritePortUshort(IN PUSHORT Port, IN USHORT Value)
#define VIDEO_MEMORY_SPACE_IO
PHYSICAL_ADDRESS RangeStart
PBOCHS_SIZE AvailableModeInfo
BOCHS_ADDRESS_RANGE FrameBuffer
BOCHS_ADDRESS_RANGE IoPorts
PHYSICAL_ADDRESS RangeStart
ULONG HwDeviceExtensionSize
PVIDEO_HW_FIND_ADAPTER HwFindAdapter
PVIDEO_HW_START_IO HwStartIO
PVIDEO_HW_POWER_SET HwSetPowerState
PVIDEO_HW_POWER_GET HwGetPowerState
PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor
PVIDEO_HW_INITIALIZE HwInitialize
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT Context1
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT _In_ PTDI_PNP_CONTEXT Context2
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value