2 * NTDDVID.H - Video Port and MiniPort driver interface
5 #include <ddk/miniport.h>
10 * miniport driver defines entrypoint thusly:
11 * ULONG DriverEntry(PVOID Context1, PVOID Context2);
12 * miniport allocates and initializes a VIDEO_HW_INIT_DATA struct
13 * miniport calls VideoPortInitialize
14 * video port driver handles init of DriverObject (Context1)
15 * video port driver calls back into HwVidFindAdapter entry point
16 * video port driver finishes up and returns the status code that
17 * the miniport driver should return.
19 * video port driver reformats IRP into VRP
20 * video port driver calls back into HwVidStartIO entry point
21 * minimum IoControlCodes that must be handles by the miniport:
22 * IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
23 * IOCTL_VIDEO_QUERY_AVAIL_MODES
24 * IOCTL_VIDEO_SET_CURRENT_MODE
25 * IOCTL_VIDEO_MAP_MEMORY
26 * IOCTL_VIDEO_RESET_DEVICE
27 * interrupts are handled the same as KM drivers.
30 typedef LONG VP_STATUS, *PVP_STATUS;
32 // Bit definitions for Attribute Flags
33 #define VIDEO_MODE_COLOR 0x0001
34 #define VIDEO_MODE_GRAPHICS 0x0002
35 #define VIDEO_MODE_PALETTE_DRIVEN 0x0004
37 #define VIDEO_MEMORY_SPACE_MEMORY 0x00
38 #define VIDEO_MEMORY_SPACE_IO 0x01
39 #define VIDEO_MEMORY_SPACE_USER_MODE 0x02
40 #define VIDEO_MEMORY_SPACE_DENSE 0x04
41 #define VIDEO_MEMORY_SPACE_P6CACHE 0x08
43 typedef struct _VIDEO_POINTER_CAPABILITIES
48 ULONG HWPtrBitmapStart;
50 } VIDEO_POINTER_CAPABILITIES, *PVIDEO_POINTER_CAPABILITIES;
52 typedef struct _VIDEO_POINTER_ATTRIBUTES
62 } VIDEO_POINTER_ATTRIBUTES, *PVIDEO_POINTER_ATTRIBUTES;
64 typedef enum _VIDEO_BANK_TYPE
71 } VIDEO_BANK_TYPE, *PVIDEO_BANK_TYPE;
73 typedef struct _VIDEO_BANK_SELECT
79 ULONG PlanarHCBankingType;
80 ULONG BitmapWidthInBytes;
83 ULONG PlanarHCGranularity;
85 ULONG PlanarHCBankCodeOffset;
86 ULONG PlanarHCEnableCodeOffset;
87 ULONG PlanarHCDisableCodeOffset;
88 } VIDEO_BANK_SELECT, *PVIDEO_BANK_SELECT;
90 typedef struct _VIDEO_CLUTDATA
96 } VIDEO_CLUTDATA, *PVIDEO_CLUTDATA;
98 typedef struct _VIDEO_NUM_MODES
101 ULONG ModeInformationLength;
102 } VIDEO_NUM_MODES, *PVIDEO_NUM_MODES;
104 typedef struct _VIDEO_MODE_INFORMATION
108 ULONG VisScreenWidth;
109 ULONG VisScreenHeight;
111 ULONG NumberOfPlanes;
117 ULONG NumberGreenBits;
118 ULONG NumberBlueBits;
122 ULONG AttributeFlags;
123 ULONG VideoMemoryBitmapWidth;
124 ULONG VideoMemoryBitmapHeight;
125 ULONG DriverSpecificAttributeFlags;
126 } VIDEO_MODE_INFORMATION, *PVIDEO_MODE_INFORMATION;
128 typedef enum _VIDEO_DEVICE_DATA_TYPE
135 } VIDEO_DEVICE_DATA_TYPE, *PVIDEO_DEVICE_DATA_TYPE;
137 typedef enum _VIDEO_SYNCHRONIZE_PRIORITY
142 } VIDEO_SYNCHRONIZE_PRIORITY, *PVIDEO_SYNCHRONIZE_PRIORITY;
144 typedef struct _STATUS_BLOCK
148 } STATUS_BLOCK, *PSTATUS_BLOCK;
150 typedef struct _VIDEO_REQUEST_PACKET
153 PSTATUS_BLOCK StatusBlock;
155 ULONG InputBufferLength;
157 ULONG OutputBufferLength;
158 } VIDEO_REQUEST_PACKET, *PVIDEO_REQUEST_PACKET;
160 #define IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES CTL_CODE(FILE_DEVICE_VIDEO, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
161 #define IOCTL_VIDEO_QUERY_AVAIL_MODES CTL_CODE(FILE_DEVICE_VIDEO, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
162 #define IOCTL_VIDEO_QUERY_CURRENT_MODE CTL_CODE(FILE_DEVICE_VIDEO, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
163 #define IOCTL_VIDEO_SET_CURRENT_MODE CTL_CODE(FILE_DEVICE_VIDEO, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
164 #define IOCTL_VIDEO_RESET_DEVICE CTL_CODE(FILE_DEVICE_VIDEO, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
165 #define IOCTL_VIDEO_MAP_VIDEO_MEMORY CTL_CODE(FILE_DEVICE_VIDEO, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
166 #define IOCTL_VIDEO_UNMAP_VIDEO_MEMORY CTL_CODE(FILE_DEVICE_VIDEO, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
167 #define IOCTL_VIDEO_SHARE_VIDEO_MEMORY CTL_CODE(FILE_DEVICE_VIDEO, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
168 #define IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY CTL_CODE(FILE_DEVICE_VIDEO, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
169 #define IOCTL_VIDEO_GET_PUBLIC_ACCESS_RANGES CTL_CODE(FILE_DEVICE_VIDEO, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
170 #define IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES CTL_CODE(FILE_DEVICE_VIDEO, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
171 #define IOCTL_VIDEO_GET_POWER_MANAGEMENT CTL_CODE(FILE_DEVICE_VIDEO, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
172 #define IOCTL_VIDEO_SET_POWER_MANAGEMENT CTL_CODE(FILE_DEVICE_VIDEO, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
173 #define IOCTL_VIDEO_COLOR_CAPABILITIES CTL_CODE(FILE_DEVICE_VIDEO, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
174 #define IOCTL_VIDEO_SET_COLOR_REGISTERS CTL_CODE(FILE_DEVICE_VIDEO, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
175 #define IOCTL_VIDEO_DISABLE_POINTER CTL_CODE(FILE_DEVICE_VIDEO, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
176 #define IOCTL_VIDEO_ENABLE_POINTER CTL_CODE(FILE_DEVICE_VIDEO, 16, METHOD_BUFFERED, FILE_ANY_ACCESS)
177 #define IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES CTL_CODE(FILE_DEVICE_VIDEO, 17, METHOD_BUFFERED, FILE_ANY_ACCESS)
178 #define IOCTL_VIDEO_QUERY_POINTER_ATTR CTL_CODE(FILE_DEVICE_VIDEO, 18, METHOD_BUFFERED, FILE_ANY_ACCESS)
179 #define IOCTL_VIDEO_SET_POINTER_ATTR CTL_CODE(FILE_DEVICE_VIDEO, 19, METHOD_BUFFERED, FILE_ANY_ACCESS)
180 #define IOCTL_VIDEO_QUERY_POINTER_POSITION CTL_CODE(FILE_DEVICE_VIDEO, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
181 #define IOCTL_VIDEO_SET_POINTER_POSITION CTL_CODE(FILE_DEVICE_VIDEO, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
182 #define IOCTL_VIDEO_SAVE_HARDWARE_STATE CTL_CODE(FILE_DEVICE_VIDEO, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
183 #define IOCTL_VIDEO_RESTORE_HARDWARE_STATE CTL_CODE(FILE_DEVICE_VIDEO, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
184 #define IOCTL_VIDEO_DISABLE_CURSOR CTL_CODE(FILE_DEVICE_VIDEO, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
185 #define IOCTL_VIDEO_ENABLE_CURSOR CTL_CODE(FILE_DEVICE_VIDEO, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
186 #define IOCTL_VIDEO_QUERY_CURSOR_ATTR CTL_CODE(FILE_DEVICE_VIDEO, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
187 #define IOCTL_VIDEO_SET_CURSOR_ATTR CTL_CODE(FILE_DEVICE_VIDEO, 27, METHOD_BUFFERED, FILE_ANY_ACCESS)
188 #define IOCTL_VIDEO_QUERY_CURSOR_POSITION CTL_CODE(FILE_DEVICE_VIDEO, 28, METHOD_BUFFERED, FILE_ANY_ACCESS)
189 #define IOCTL_VIDEO_SET_CURSOR_POSITION CTL_CODE(FILE_DEVICE_VIDEO, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
190 #define IOCTL_VIDEO_GET_BANK_SELECT_CODE CTL_CODE(FILE_DEVICE_VIDEO, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
191 #define IOCTL_VIDEO_SET_PALETTE_REGISTERS CTL_CODE(FILE_DEVICE_VIDEO, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
192 #define IOCTL_VIDEO_LOAD_AND_SET_FONT CTL_CODE(FILE_DEVICE_VIDEO, 32, METHOD_BUFFERED, FILE_ANY_ACCESS)
194 typedef struct _VIDEO_PORT_CONFIG_INFO
197 ULONG SystemIoBusNumber;
198 INTERFACE_TYPE AdapterInterfaceType;
199 ULONG BusInterruptLevel;
200 ULONG BusInterruptVector;
201 KINTERRUPT_MODE InterruptMode;
202 ULONG NumEmulatorAccessEntries;
203 PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries;
204 ULONG EmulatorAccessEntriesContext;
205 PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress;
206 ULONG VdmPhysicalVideoMemoryLength;
207 ULONG HardwareStateSize;
211 UCHAR InterruptShareable;
212 } VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO;
214 typedef VP_STATUS STDCALL
215 (*PVIDEO_HW_FIND_ADAPTER)(PVOID HwDeviceExtension,
217 PWSTR ArgumentString,
218 PVIDEO_PORT_CONFIG_INFO ConfigInfo,
221 typedef BOOLEAN STDCALL
222 (*PVIDEO_HW_INITIALIZE)(PVOID HwDeviceExtension);
224 typedef BOOLEAN STDCALL
225 (*PVIDEO_HW_INTERRUPT)(PVOID HwDeviceExtension);
227 typedef BOOLEAN STDCALL
228 (*PVIDEO_HW_START_IO)(PVOID HwDeviceExtension,
229 PVIDEO_REQUEST_PACKET RequestPacket);
231 typedef BOOLEAN STDCALL
232 (*PVIDEO_HW_RESET_HW)(PVOID HwDeviceExtension,
237 (*PVIDEO_HW_TIMER)(PVOID HwDeviceExtension);
239 typedef struct _VIDEO_HW_INITIALIZATION_DATA
241 ULONG HwInitDataSize;
242 INTERFACE_TYPE AdapterInterfaceType;
243 PVIDEO_HW_FIND_ADAPTER HwFindAdapter;
244 PVIDEO_HW_INITIALIZE HwInitialize;
245 PVIDEO_HW_INTERRUPT HwInterrupt;
246 PVIDEO_HW_START_IO HwStartIO;
247 ULONG HwDeviceExtensionSize;
248 ULONG StartingDeviceNumber;
249 PVIDEO_HW_RESET_HW HwResetHw;
250 PVIDEO_HW_TIMER HwTimer;
251 } VIDEO_HW_INITIALIZATION_DATA, *PVIDEO_HW_INITIALIZATION_DATA;
253 typedef VP_STATUS STDCALL
254 (*PMINIPORT_GET_REGISTRY_ROUTINE)(PVOID HwDeviceExtension,
260 typedef VP_STATUS STDCALL
261 (*PMINIPORT_QUERY_DEVICE_ROUTINE)(PVOID HwDeviceExtension,
263 VIDEO_DEVICE_DATA_TYPE DeviceDataType,
265 ULONG IdentiferLength,
266 PVOID ConfigurationData,
267 ULONG ConfigurationDataLength,
268 PVOID ComponentInformation,
269 ULONG ComponentInformationLength);
271 typedef BOOLEAN STDCALL
272 (*PMINIPORT_SYNCHRONIZE_ROUTINE)(PVOID Context);
274 typedef struct _VIDEO_ACCESS_RANGE
276 PHYSICAL_ADDRESS RangeStart;
278 UCHAR RangeInIoSpace;
280 UCHAR RangeShareable;
281 } VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
283 typedef struct _VIDEO_X86_BIOS_ARGUMENTS
292 } VIDEO_X86_BIOS_ARGUMENTS, *PVIDEO_X86_BIOS_ARGUMENTS;
295 (*PBANKED_SECTION_ROUTINE)(IN ULONG ReadBank,
305 VIDEO_CLUTDATA RgbArray;
308 } VIDEO_CLUT, *PVIDEO_CLUT;
310 typedef struct _VIDEO_MEMORY
312 PVOID RequestedVirtualAddress;
313 } VIDEO_MEMORY, *PVIDEO_MEMORY;
315 typedef struct _VIDEO_MEMORY_INFORMATION
318 ULONG VideoRamLength;
319 PVOID FrameBufferBase;
320 ULONG FrameBufferLength;
321 } VIDEO_MEMORY_INFORMATION, *PVIDEO_MEMORY_INFORMATION;
323 typedef struct _VIDEO_MODE
326 } VIDEO_MODE, *PVIDEO_MODE;
328 typedef struct _VIDEO_SHARE_MEMORY
330 HANDLE ProcessHandle;
333 PVOID RequestedVirtualAddress;
334 } VIDEO_SHARE_MEMORY, *PVIDEO_SHARE_MEMORY;
336 ULONG STDCALL VideoPortCompareMemory(IN PVOID Source1, IN PVOID Source2, IN ULONG Length);
337 VOID VideoPortDebugPrint(IN ULONG DebugPrintLevel, IN PCHAR DebugMessage, ...);
338 VP_STATUS STDCALL VideoPortDisableInterrupt(IN PVOID HwDeviceExtension);
339 VP_STATUS STDCALL VideoPortEnableInterrupt(IN PVOID HwDeviceExtension);
340 VOID STDCALL VideoPortFreeDeviceBase(IN PVOID HwDeviceExtension, IN PVOID MappedAddress);
341 ULONG STDCALL VideoPortGetBusData(IN PVOID HwDeviceExtension,
342 IN BUS_DATA_TYPE BusDataType,
347 UCHAR STDCALL VideoPortGetCurrentIrql(VOID);
348 PVOID STDCALL VideoPortGetDeviceBase(IN PVOID HwDeviceExtension,
349 IN PHYSICAL_ADDRESS IoAddress,
350 IN ULONG NumberOfUchars,
352 VP_STATUS STDCALL VideoPortGetDeviceData(IN PVOID HwDeviceExtension,
353 IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
354 IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine,
356 VP_STATUS STDCALL VideoPortGetAccessRanges(IN PVOID HwDeviceExtension,
357 IN ULONG NumRequestedResources,
358 IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL,
359 IN ULONG NumAccessRanges,
360 IN PVIDEO_ACCESS_RANGE AccessRanges,
364 VP_STATUS STDCALL VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension,
365 IN PWSTR ParameterName,
366 IN UCHAR IsParameterFileName,
367 IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine,
369 ULONG STDCALL VideoPortInitialize(IN PVOID Context1,
371 IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData,
373 VP_STATUS STDCALL VideoPortInt10(IN PVOID HwDeviceExtension,
374 IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments);
375 VOID STDCALL VideoPortLogError(IN PVOID HwDeviceExtension,
376 IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL,
377 IN VP_STATUS ErrorCode,
379 VP_STATUS STDCALL VideoPortMapBankedMemory(IN PVOID HwDeviceExtension,
380 IN PHYSICAL_ADDRESS PhysicalAddress,
383 OUT PVOID *VirtualAddress,
385 IN UCHAR ReadWriteBank,
386 IN PBANKED_SECTION_ROUTINE BankRoutine,
388 VP_STATUS STDCALL VideoPortMapMemory(IN PVOID HwDeviceExtension,
389 IN PHYSICAL_ADDRESS PhysicalAddress,
392 OUT PVOID *VirtualAddress);
393 VOID STDCALL VideoPortMoveMemory(OUT PVOID Destination,
396 UCHAR STDCALL VideoPortReadPortUchar(IN PUCHAR Port);
397 USHORT STDCALL VideoPortReadPortUshort(IN PUSHORT Port);
398 ULONG STDCALL VideoPortReadPortUlong(IN PULONG Port);
399 VOID STDCALL VideoPortReadPortBufferUchar(IN PUCHAR Port, OUT PUCHAR Buffer, IN ULONG Count);
400 VOID STDCALL VideoPortReadPortBufferUshort(IN PUSHORT Port, OUT PUSHORT Buffer, IN ULONG Count);
401 VOID STDCALL VideoPortReadPortBufferUlong(IN PULONG Port, OUT PULONG Buffer, IN ULONG Count);
402 UCHAR STDCALL VideoPortReadRegisterUchar(IN PUCHAR Register);
403 USHORT STDCALL VideoPortReadRegisterUshort(IN PUSHORT Register);
404 ULONG STDCALL VideoPortReadRegisterUlong(IN PULONG Register);
405 VOID STDCALL VideoPortReadRegisterBufferUchar(IN PUCHAR Register, OUT PUCHAR Buffer, IN ULONG Count);
406 VOID STDCALL VideoPortReadRegisterBufferUshort(IN PUSHORT Register, OUT PUSHORT Buffer, IN ULONG Count);
407 VOID STDCALL VideoPortReadRegisterBufferUlong(IN PULONG Register, OUT PULONG Buffer, IN ULONG Count);
408 BOOLEAN STDCALL VideoPortScanRom(IN PVOID HwDeviceExtension,
412 ULONG STDCALL VideoPortSetBusData(IN PVOID HwDeviceExtension,
413 IN BUS_DATA_TYPE BusDataType,
418 VP_STATUS STDCALL VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension,
421 IN ULONG ValueLength);
422 VP_STATUS STDCALL VideoPortSetTrappedEmulatorPorts(IN PVOID HwDeviceExtension,
423 IN ULONG NumAccessRanges,
424 IN PVIDEO_ACCESS_RANGE AccessRange);
425 VOID STDCALL VideoPortStallExecution(IN ULONG Microseconds);
426 VOID STDCALL VideoPortStartTimer(IN PVOID HwDeviceExtension);
427 VOID STDCALL VideoPortStopTimer(IN PVOID HwDeviceExtension);
428 BOOLEAN STDCALL VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension,
429 IN VIDEO_SYNCHRONIZE_PRIORITY Priority,
430 IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine,
432 VP_STATUS STDCALL VideoPortUnmapMemory(IN PVOID HwDeviceExtension,
433 IN PVOID VirtualAddress,
434 IN HANDLE ProcessHandle);
435 VP_STATUS STDCALL VideoPortVerifyAccessRanges(IN PVOID HwDeviceExtension,
436 IN ULONG NumAccessRanges,
437 IN PVIDEO_ACCESS_RANGE AccessRanges);
438 VOID STDCALL VideoPortWritePortUchar(IN PUCHAR Port, IN UCHAR Value);
439 VOID STDCALL VideoPortWritePortUshort(IN PUSHORT Port, IN USHORT Value);
440 VOID STDCALL VideoPortWritePortUlong(IN PULONG Port, IN ULONG Value);
441 VOID STDCALL VideoPortWritePortBufferUchar(IN PUCHAR Port, IN PUCHAR Buffer, IN ULONG Count);
442 VOID STDCALL VideoPortWritePortBufferUshort(IN PUSHORT Port, IN PUSHORT Buffer, IN ULONG Count);
443 VOID STDCALL VideoPortWritePortBufferUlong(IN PULONG Port, IN PULONG Buffer, IN ULONG Count);
444 VOID STDCALL VideoPortWriteRegisterUchar(IN PUCHAR Register, IN UCHAR Value);
445 VOID STDCALL VideoPortWriteRegisterUshort(IN PUSHORT Register, IN USHORT Value);
446 VOID STDCALL VideoPortWriteRegisterUlong(IN PULONG Register, IN ULONG Value);
447 VOID STDCALL VideoPortWriteRegisterBufferUchar(IN PUCHAR Register, IN PUCHAR Buffer, IN ULONG Count);
448 VOID STDCALL VideoPortWriteRegisterBufferUshort(IN PUSHORT Register, IN PUSHORT Buffer, IN ULONG Count);
449 VOID STDCALL VideoPortWriteRegisterBufferUlong(IN PULONG Register, IN PULONG Buffer, IN ULONG Count);
450 VOID STDCALL VideoPortZeroMemory(OUT PVOID Destination, IN ULONG Length);
451 VOID STDCALL VideoPortZeroDeviceMemory(OUT PVOID Destination, IN ULONG Length);