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;
216 BOOLEAN NeedPhysicalAddresses;
218 ULONG MaximumTransferLength;
219 ULONG NumberOfPhysicalBreaks;
220 BOOLEAN ScatterGather;
221 ULONG MaximumScatterGatherChunkSize;
222 } VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO;
224 typedef VP_STATUS STDCALL
225 (*PVIDEO_HW_FIND_ADAPTER)(PVOID HwDeviceExtension,
227 PWSTR ArgumentString,
228 PVIDEO_PORT_CONFIG_INFO ConfigInfo,
231 typedef BOOLEAN STDCALL
232 (*PVIDEO_HW_INITIALIZE)(PVOID HwDeviceExtension);
234 typedef BOOLEAN STDCALL
235 (*PVIDEO_HW_INTERRUPT)(PVOID HwDeviceExtension);
237 typedef BOOLEAN STDCALL
238 (*PVIDEO_HW_START_IO)(PVOID HwDeviceExtension,
239 PVIDEO_REQUEST_PACKET RequestPacket);
241 typedef BOOLEAN STDCALL
242 (*PVIDEO_HW_RESET_HW)(PVOID HwDeviceExtension,
247 (*PVIDEO_HW_TIMER)(PVOID HwDeviceExtension);
249 typedef struct _VIDEO_HW_INITIALIZATION_DATA
251 ULONG HwInitDataSize;
252 INTERFACE_TYPE AdapterInterfaceType;
253 PVIDEO_HW_FIND_ADAPTER HwFindAdapter;
254 PVIDEO_HW_INITIALIZE HwInitialize;
255 PVIDEO_HW_INTERRUPT HwInterrupt;
256 PVIDEO_HW_START_IO HwStartIO;
257 ULONG HwDeviceExtensionSize;
258 ULONG StartingDeviceNumber;
259 PVIDEO_HW_RESET_HW HwResetHw;
260 PVIDEO_HW_TIMER HwTimer;
261 } VIDEO_HW_INITIALIZATION_DATA, *PVIDEO_HW_INITIALIZATION_DATA;
263 typedef VP_STATUS STDCALL
264 (*PMINIPORT_GET_REGISTRY_ROUTINE)(PVOID HwDeviceExtension,
270 typedef VP_STATUS STDCALL
271 (*PMINIPORT_QUERY_DEVICE_ROUTINE)(PVOID HwDeviceExtension,
273 VIDEO_DEVICE_DATA_TYPE DeviceDataType,
275 ULONG IdentiferLength,
276 PVOID ConfigurationData,
277 ULONG ConfigurationDataLength,
278 PVOID ComponentInformation,
279 ULONG ComponentInformationLength);
281 typedef BOOLEAN STDCALL
282 (*PMINIPORT_SYNCHRONIZE_ROUTINE)(PVOID Context);
284 typedef struct _VIDEO_ACCESS_RANGE
286 PHYSICAL_ADDRESS RangeStart;
288 UCHAR RangeInIoSpace;
290 UCHAR RangeShareable;
291 } VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
293 typedef struct _VIDEO_X86_BIOS_ARGUMENTS
302 } VIDEO_X86_BIOS_ARGUMENTS, *PVIDEO_X86_BIOS_ARGUMENTS;
305 (*PBANKED_SECTION_ROUTINE)(IN ULONG ReadBank,
315 VIDEO_CLUTDATA RgbArray;
318 } VIDEO_CLUT, *PVIDEO_CLUT;
320 typedef struct _VIDEO_MEMORY
322 PVOID RequestedVirtualAddress;
323 } VIDEO_MEMORY, *PVIDEO_MEMORY;
325 typedef struct _VIDEO_MEMORY_INFORMATION
328 ULONG VideoRamLength;
329 PVOID FrameBufferBase;
330 ULONG FrameBufferLength;
331 } VIDEO_MEMORY_INFORMATION, *PVIDEO_MEMORY_INFORMATION;
333 typedef struct _VIDEO_MODE
336 } VIDEO_MODE, *PVIDEO_MODE;
338 typedef struct _VIDEO_SHARE_MEMORY
340 HANDLE ProcessHandle;
343 PVOID RequestedVirtualAddress;
344 } VIDEO_SHARE_MEMORY, *PVIDEO_SHARE_MEMORY;
346 ULONG STDCALL VideoPortCompareMemory(IN PVOID Source1, IN PVOID Source2, IN ULONG Length);
347 VOID VideoPortDebugPrint(IN ULONG DebugPrintLevel, IN PCHAR DebugMessage, ...);
348 VP_STATUS STDCALL VideoPortDisableInterrupt(IN PVOID HwDeviceExtension);
349 VP_STATUS STDCALL VideoPortEnableInterrupt(IN PVOID HwDeviceExtension);
350 VOID STDCALL VideoPortFreeDeviceBase(IN PVOID HwDeviceExtension, IN PVOID MappedAddress);
351 ULONG STDCALL VideoPortGetBusData(IN PVOID HwDeviceExtension,
352 IN BUS_DATA_TYPE BusDataType,
357 UCHAR STDCALL VideoPortGetCurrentIrql(VOID);
358 PVOID STDCALL VideoPortGetDeviceBase(IN PVOID HwDeviceExtension,
359 IN PHYSICAL_ADDRESS IoAddress,
360 IN ULONG NumberOfUchars,
362 VP_STATUS STDCALL VideoPortGetDeviceData(IN PVOID HwDeviceExtension,
363 IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
364 IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine,
366 VP_STATUS STDCALL VideoPortGetAccessRanges(IN PVOID HwDeviceExtension,
367 IN ULONG NumRequestedResources,
368 IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL,
369 IN ULONG NumAccessRanges,
370 IN PVIDEO_ACCESS_RANGE AccessRanges,
374 VP_STATUS STDCALL VideoPortGetRegistryParameters(IN PVOID HwDeviceExtension,
375 IN PWSTR ParameterName,
376 IN UCHAR IsParameterFileName,
377 IN PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine,
379 ULONG STDCALL VideoPortInitialize(IN PVOID Context1,
381 IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData,
383 VP_STATUS STDCALL VideoPortInt10(IN PVOID HwDeviceExtension,
384 IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments);
385 VOID STDCALL VideoPortLogError(IN PVOID HwDeviceExtension,
386 IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL,
387 IN VP_STATUS ErrorCode,
389 VP_STATUS STDCALL VideoPortMapBankedMemory(IN PVOID HwDeviceExtension,
390 IN PHYSICAL_ADDRESS PhysicalAddress,
393 OUT PVOID *VirtualAddress,
395 IN UCHAR ReadWriteBank,
396 IN PBANKED_SECTION_ROUTINE BankRoutine,
398 VP_STATUS STDCALL VideoPortMapMemory(IN PVOID HwDeviceExtension,
399 IN PHYSICAL_ADDRESS PhysicalAddress,
402 OUT PVOID *VirtualAddress);
403 VOID STDCALL VideoPortMoveMemory(OUT PVOID Destination,
406 UCHAR STDCALL VideoPortReadPortUchar(IN PUCHAR Port);
407 USHORT STDCALL VideoPortReadPortUshort(IN PUSHORT Port);
408 ULONG STDCALL VideoPortReadPortUlong(IN PULONG Port);
409 VOID STDCALL VideoPortReadPortBufferUchar(IN PUCHAR Port, OUT PUCHAR Buffer, IN ULONG Count);
410 VOID STDCALL VideoPortReadPortBufferUshort(IN PUSHORT Port, OUT PUSHORT Buffer, IN ULONG Count);
411 VOID STDCALL VideoPortReadPortBufferUlong(IN PULONG Port, OUT PULONG Buffer, IN ULONG Count);
412 UCHAR STDCALL VideoPortReadRegisterUchar(IN PUCHAR Register);
413 USHORT STDCALL VideoPortReadRegisterUshort(IN PUSHORT Register);
414 ULONG STDCALL VideoPortReadRegisterUlong(IN PULONG Register);
415 VOID STDCALL VideoPortReadRegisterBufferUchar(IN PUCHAR Register, OUT PUCHAR Buffer, IN ULONG Count);
416 VOID STDCALL VideoPortReadRegisterBufferUshort(IN PUSHORT Register, OUT PUSHORT Buffer, IN ULONG Count);
417 VOID STDCALL VideoPortReadRegisterBufferUlong(IN PULONG Register, OUT PULONG Buffer, IN ULONG Count);
418 BOOLEAN STDCALL VideoPortScanRom(IN PVOID HwDeviceExtension,
422 ULONG STDCALL VideoPortSetBusData(IN PVOID HwDeviceExtension,
423 IN BUS_DATA_TYPE BusDataType,
428 VP_STATUS STDCALL VideoPortSetRegistryParameters(IN PVOID HwDeviceExtension,
431 IN ULONG ValueLength);
432 VP_STATUS STDCALL VideoPortSetTrappedEmulatorPorts(IN PVOID HwDeviceExtension,
433 IN ULONG NumAccessRanges,
434 IN PVIDEO_ACCESS_RANGE AccessRange);
435 VOID STDCALL VideoPortStallExecution(IN ULONG Microseconds);
436 VOID STDCALL VideoPortStartTimer(IN PVOID HwDeviceExtension);
437 VOID STDCALL VideoPortStopTimer(IN PVOID HwDeviceExtension);
438 BOOLEAN STDCALL VideoPortSynchronizeExecution(IN PVOID HwDeviceExtension,
439 IN VIDEO_SYNCHRONIZE_PRIORITY Priority,
440 IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine,
442 VP_STATUS STDCALL VideoPortUnmapMemory(IN PVOID HwDeviceExtension,
443 IN PVOID VirtualAddress,
444 IN HANDLE ProcessHandle);
445 VP_STATUS STDCALL VideoPortVerifyAccessRanges(IN PVOID HwDeviceExtension,
446 IN ULONG NumAccessRanges,
447 IN PVIDEO_ACCESS_RANGE AccessRanges);
448 VOID STDCALL VideoPortWritePortUchar(IN PUCHAR Port, IN UCHAR Value);
449 VOID STDCALL VideoPortWritePortUshort(IN PUSHORT Port, IN USHORT Value);
450 VOID STDCALL VideoPortWritePortUlong(IN PULONG Port, IN ULONG Value);
451 VOID STDCALL VideoPortWritePortBufferUchar(IN PUCHAR Port, IN PUCHAR Buffer, IN ULONG Count);
452 VOID STDCALL VideoPortWritePortBufferUshort(IN PUSHORT Port, IN PUSHORT Buffer, IN ULONG Count);
453 VOID STDCALL VideoPortWritePortBufferUlong(IN PULONG Port, IN PULONG Buffer, IN ULONG Count);
454 VOID STDCALL VideoPortWriteRegisterUchar(IN PUCHAR Register, IN UCHAR Value);
455 VOID STDCALL VideoPortWriteRegisterUshort(IN PUSHORT Register, IN USHORT Value);
456 VOID STDCALL VideoPortWriteRegisterUlong(IN PULONG Register, IN ULONG Value);
457 VOID STDCALL VideoPortWriteRegisterBufferUchar(IN PUCHAR Register, IN PUCHAR Buffer, IN ULONG Count);
458 VOID STDCALL VideoPortWriteRegisterBufferUshort(IN PUSHORT Register, IN PUSHORT Buffer, IN ULONG Count);
459 VOID STDCALL VideoPortWriteRegisterBufferUlong(IN PULONG Register, IN PULONG Buffer, IN ULONG Count);
460 VOID STDCALL VideoPortZeroMemory(OUT PVOID Destination, IN ULONG Length);
461 VOID STDCALL VideoPortZeroDeviceMemory(OUT PVOID Destination, IN ULONG Length);