|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1991-1993 Microsoft Corporation
4:
5: Module Name:
6:
7: video.h
8:
9: Abstract:
10:
11: Contains all structure and routine definitions common to the video port
12: driver and the video miniport drivers.
13:
14: Notes:
15:
16: Revision History:
17:
18: --*/
19:
20: //
21: // Define port driver status code.
22: // The values for these are the Win32 error codes
23: //
24:
25: typedef LONG VP_STATUS;
26: typedef VP_STATUS *PVP_STATUS;
27:
28: //
29: // Defines for registry information and synchronization.
30: //
31:
32: typedef enum _VIDEO_DEVICE_DATA_TYPE {
33: VpMachineData,
34: VpCmosData,
35: VpBusData,
36: VpControllerData,
37: VpMonitorData
38: } VIDEO_DEVICE_DATA_TYPE, *PVIDEO_DEVICE_DATA_TYPE;
39:
40: typedef enum VIDEO_SYNCHRONIZE_PRIORITY {
41: VpLowPriority,
42: VpMediumPriority,
43: VpHighPriority
44: } VIDEO_SYNCHRONIZE_PRIORITY, *PVIDEO_SYNCHRONIZE_PRIORITY;
45:
46: //
47: // Define structure used to call the BIOS int 10 function
48: //
49:
50: typedef struct _VIDEO_X86_BIOS_ARGUMENTS {
51: ULONG Eax;
52: ULONG Ebx;
53: ULONG Ecx;
54: ULONG Edx;
55: ULONG Esi;
56: ULONG Edi;
57: ULONG Ebp;
58: } VIDEO_X86_BIOS_ARGUMENTS, *PVIDEO_X86_BIOS_ARGUMENTS;
59:
60: //
61: // Debugging statements. This will remove all the debug information from the
62: // "free" version.
63: //
64:
65: #if DBG
66: #define VideoDebugPrint(arg) VideoPortDebugPrint arg
67: #else
68: #define VideoDebugPrint(arg)
69: #endif
70:
71:
72: #ifndef _NTOS_
73:
74: //
75: // These are the various function prototypes of the routines that are
76: // provided by the kernel driver to hook out access to io ports.
77: //
78:
79: typedef
80: VP_STATUS
81: (*PDRIVER_IO_PORT_UCHAR ) (
82: ULONG Context,
83: ULONG Port,
84: UCHAR AccessMode,
85: PUCHAR Data
86: );
87:
88: typedef
89: VP_STATUS
90: (*PDRIVER_IO_PORT_UCHAR_STRING ) (
91: ULONG Context,
92: ULONG Port,
93: UCHAR AccessMode,
94: PUCHAR Data,
95: ULONG DataLength
96: );
97:
98: typedef
99: VP_STATUS
100: (*PDRIVER_IO_PORT_USHORT ) (
101: ULONG Context,
102: ULONG Port,
103: UCHAR AccessMode,
104: PUSHORT Data
105: );
106:
107: typedef
108: VP_STATUS
109: (*PDRIVER_IO_PORT_USHORT_STRING ) (
110: ULONG Context,
111: ULONG Port,
112: UCHAR AccessMode,
113: PUSHORT Data,
114: ULONG DataLength // number of words
115: );
116:
117: typedef
118: VP_STATUS
119: (*PDRIVER_IO_PORT_ULONG ) (
120: ULONG Context,
121: ULONG Port,
122: UCHAR AccessMode,
123: PULONG Data
124: );
125:
126: typedef
127: VP_STATUS
128: (*PDRIVER_IO_PORT_ULONG_STRING ) (
129: ULONG Context,
130: ULONG Port,
131: UCHAR AccessMode,
132: PULONG Data,
133: ULONG DataLength // number of dwords
134: );
135:
136: #endif // _NTOS_
137:
138:
139: //
140: // Definition of the request packet sent from the port driver to the
141: // miniport driver. It reflects the parameters passed from the
142: // DeviceIOControl call made by the windows display driver.
143: //
144:
145: typedef struct _STATUS_BLOCK {
146:
147: //
148: // Contains the status code of the operation.
149: // This value in one of the Win32 error codes that are defined for use
150: // in the video miniport drivers.
151: //
152:
153: VP_STATUS Status;
154:
155: //
156: // Information returned to the callee.
157: // The meaning of the information varies from function to function. It
158: // is generally used to return the minimum size for the input buffer if
159: // the function takes an input buffer, or the amount of data transfered
160: // back to the caller if the operation returns output.
161: //
162:
163: ULONG Information;
164:
165: } STATUS_BLOCK, *PSTATUS_BLOCK;
166:
167: //
168: // BUGBUG
169: // What do we do about overlapping input and output buffers ?
170: // Do we want to create a separate output buffer or do we explain that there
171: // is a single buffer is used to perform the requests.
172: //
173:
174: typedef struct _VIDEO_REQUEST_PACKET {
175:
176: //
177: // The IO control code passed to the DeviceIoControl function by the
178: // caller.
179: //
180:
181: ULONG IoControlCode;
182:
183: //
184: // Pointer to a status block provided by the caller. This should be
185: // filled out by the callee with the appropriate information.
186: //
187:
188: PSTATUS_BLOCK StatusBlock;
189:
190: //
191: // Pointer to an input buffer which contains the information passed in
192: // by the caller.
193: //
194:
195: PVOID InputBuffer;
196:
197: //
198: // Size of the input buffer
199: //
200:
201: ULONG InputBufferLength;
202:
203: //
204: // Pointer to an output buffer into which the data returned to the caller
205: // should be stored.
206: //
207:
208: PVOID OutputBuffer;
209:
210: //
211: // Length of the output buffer. This buffer can not be grown by the
212: // callee.
213: //
214:
215: ULONG OutputBufferLength;
216:
217: } VIDEO_REQUEST_PACKET, *PVIDEO_REQUEST_PACKET;
218:
219:
220: //
221: // The following structure is used to define access ranges. The ranges are
222: // used to indicate which ports and memory adresses are being used by the
223: // card.
224: //
225:
226: typedef struct _VIDEO_ACCESS_RANGE {
227:
228: //
229: // Indicates the starting memory address or port number of the range.
230: // This values should be stored before being transformed by
231: // VideoPortGetDeviceBase() which returns the logical address that must
232: // be used by the miniport driver when referencing physical addresses.
233: //
234:
235: PHYSICAL_ADDRESS RangeStart;
236:
237: //
238: // Indicates the length in bytes, or number of ports in the range. This
239: // value should indicate the range actually decoded by the adapter. For
240: // example, if the adapter uses 7 registers but responds to eight, the
241: // RangeLength should be set to 8.
242:
243: ULONG RangeLength;
244:
245: //
246: // Indicates if the range is in IO space (TRUE) or in memory space (FALSE).
247: //
248:
249: UCHAR RangeInIoSpace;
250:
251: //
252: // Indicates if the range should be visible by the Windows display driver.
253: // This is done so that a Windows display driver can access certain
254: // video ports directly. This will only be allowed if the caller has the
255: // required privileges (is a trusted subsystem) to access the range.
256: //
257: // Synchronization of access to ports or memory in the range must be
258: // done explicitly by the miniport driver and the user mode process so
259: // that they both don't try to program the device simultaneously.
260: //
261: // Non visible ranges should include video memory, ROM addresses, etc.
262: // which are not required to program the device for output purposes.
263: //
264: //
265:
266: UCHAR RangeVisible;
267:
268: //
269: // This field determines if the range can be shared with another device.
270: // The rule should be applied as follow.
271: //
272: // - If the range of memory or IO ports should be "owned" by this driver,
273: // and that any other driver trying to access this range may cause
274: // a problem, FALSE should be returned.
275: //
276: // - If the range can be shared with another co-operating device driver,
277: // then the share field should be set to TRUE.
278: //
279: // As a guideline, the VGA miniport driver will claim all of its resources
280: // as shareable so that it can be used as a VGA compatible device with
281: // any other driver (such as an S3 or XGA.
282: //
283: // Super VGA miniport drivers that implement all the VGA functionality
284: // (declared in the Registry as VGACOMPATIBLE=1) should claim the range
285: // as non-shareable since they don't want the VGA to run at the same time.
286: //
287: // Miniports for cards such as an S3 or XGA that have an XGA on the board
288: // but do not implement the VGA functionality will run with the VGA
289: // miniport loaded and should therefore claim all the resources shared
290: // with the VGA as shareable.
291: //
292: // Miniports for cards that work with a pass-through and that can be
293: // connected to any VGA/SVGA card should not be using any VGA ports or
294: // memory ranges ! ... but if they do they should not claim those
295: // resources since they will cause a conflict in the system because the
296: // SVGA cards will have claimed them as non-shareable ...
297: //
298:
299: UCHAR RangeShareable;
300:
301: } VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
302:
303:
304: //
305: // This structure contains the specific configuration information about the
306: // device. The information is initialized by the port driver and it should
307: // be completed by the mniport driver.
308: // The information is used to setup the device, as weel as providing
309: // information to the port driver so it can perform some of the requests on
310: // behalf of the miniport driver.
311: //
312:
313: typedef struct _VIDEO_PORT_CONFIG_INFO {
314:
315: //
316: // Specifies the length of the PVIDEO_PORT_CONFIG_INFO structure as
317: // returned by sizeof(). Since this structure may grow in later
318: // releases, the miniport driver should check that the length of the
319: // structure is greater than or equal to the length it expects (since
320: // it is guaranteed that defined fields will not change).
321: //
322: // This field is always initialized by the port driver.
323: //
324:
325: ULONG Length;
326:
327: //
328: // Specifies which IO bus is tp be scanned. This field is used as a
329: // parameter to some VideoPortXXX calls.
330: //
331: // This field is always initialized by the port driver.
332: //
333:
334: ULONG SystemIoBusNumber;
335:
336: //
337: // Specifies the type of bus being scanned. This field is equal to the
338: // value being passed into VideoPortInitialize in the
339: // VIDEO_HW_INITIALIZATION_DATA structure.
340: //
341: // This field is always initialized by the port driver.
342: //
343:
344: INTERFACE_TYPE AdapterInterfaceType;
345:
346: //
347: // Specifies the bus interrupt request level. This level corresponds to
348: // the IRQL on ISA and MCA buses.
349: // This value is only used if the device supports interrupts, which is
350: // determined by the presence of an interrupt service routine in the
351: // VIDEO_HW_INITIALIZATION_DATA structure.
352: //
353: // The preset default value for this field is zero. Otherwise, it is the
354: // value found in the device configuration information.
355: //
356:
357: ULONG BusInterruptLevel;
358:
359: //
360: // Specifies the bus vector returned by the adapter. This is used for
361: // systems which have IO buses that use interrupt vectors. For ISA, MCA
362: // and EISA buses, this field is unused.
363: //
364: // The preset default value for this field is zero.
365: //
366:
367: ULONG BusInterruptVector;
368:
369: //
370: // Specifies whether this adapter uses latched or edge-triggered type
371: // interrupts.
372: //
373: // This field is always initialized by the port driver.
374: //
375:
376: KINTERRUPT_MODE InterruptMode;
377:
378: //
379: // NOTE:
380: // DMA information is not included since it is not yet supported by the
381: // video port driver.
382: //
383:
384: //
385: // Specifies the number of emulator access entries that the adapter
386: // uses. This value is the same as was passed into VideoPortInitialize()
387: // in the VIDEO_HW_INITIALIZATION_DATA structure. It indicates the
388: // number of array elements in the following field.
389: //
390: // This field can be reinitialized with the number of entries in the
391: // EmulatorAccessEntries structure if the structure is statically
392: // defined in the miniport driver. The EmulatorAccessEntries fields
393: // should also be updated.
394: //
395:
396: ULONG NumEmulatorAccessEntries;
397:
398: //
399: // Supplies a pointer to an array of EMULATOR_ACCESS_ENTRY structures.
400: // The number of elements in the array is indicated by the
401: // NumEmulatorAccessEntries field. The driver should fill out each entry
402: // for the adapter.
403: //
404: // The uninitialized value for the structure is NULL.
405: // EmulatorAccessEntries will be NULL if NumEmulatorAccessEntries is
406: // zero.
407: //
408: // A poiner to an array of emulator access entries can be passed back
409: // if such a structure is defined statically in the miniport driver. The
410: // NumEmulatorAccessEntries field should also be updated.
411: //
412:
413: PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries;
414:
415: //
416: // This is a context values that is passed with each call to the
417: // emulator/validator functions defined in the EmulatorAccessEntries
418: // defined above.
419: // This parameter should in general be a pointer to the miniports
420: // device extension or other such storage location.
421: //
422: // This pointer will allow the miniport to save some state temporarily
423: // to allow for the batching of IO requests.
424: //
425:
426: ULONG EmulatorAccessEntriesContext;
427:
428: //
429: // Physical address of the video memory that must be mapped into a VDM's
430: // address space for proper BIOS support
431: //
432:
433: PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress;
434:
435: //
436: // Length of the video memory that must be mapped into a VDM's addres
437: // space for proper BIOS support.
438: //
439:
440: ULONG VdmPhysicalVideoMemoryLength;
441:
442: //
443: // Determines the minimum size required to store the hardware state
444: // information returned by IOCTL_VIDEO_SAVE_HARDWARE_STATE.
445: //
446: // The uninitialized value for this field is zero.
447: //
448: // If the field is left to zero, SAVE_HARDWARE_STATE will return an
449: // ERROR_INVALID_FUNCTION status code.
450: //
451:
452: ULONG HardwareStateSize;
453:
454: } VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO;
455:
456:
457: //
458: // Video Adapter Dependent Routines.
459: //
460:
461: typedef
462: VP_STATUS
463: (*PVIDEO_HW_FIND_ADAPTER) (
464: PVOID HwDeviceExtension,
465: PVOID HwContext,
466: PWSTR ArgumentString,
467: PVIDEO_PORT_CONFIG_INFO ConfigInfo,
468: PUCHAR Again
469: );
470:
471: typedef
472: BOOLEAN
473: (*PVIDEO_HW_INITIALIZE) (
474: PVOID HwDeviceExtension
475: );
476:
477: typedef
478: BOOLEAN
479: (*PVIDEO_HW_INTERRUPT) (
480: PVOID HwDeviceExtension
481: );
482:
483: typedef
484: BOOLEAN
485: (*PVIDEO_HW_START_IO) (
486: PVOID HwDeviceExtension,
487: PVIDEO_REQUEST_PACKET RequestPacket
488: );
489:
490:
491: //
492: // Structure passed by the miniport entry point to the video port
493: // initialization routine.
494: //
495:
496: typedef struct _VIDEO_HW_INITIALIZATION_DATA {
497:
498: //
499: // Supplies the size of the structure in bytes as determined by sizeof().
500: //
501:
502: ULONG HwInitDataSize;
503:
504: //
505: // Indicates the bus type the adapter works with, such as Eisa, Isa, MCA.
506: //
507:
508: INTERFACE_TYPE AdapterInterfaceType;
509:
510: //
511: // Supplies a pointer to the miniport driver's find adapter routine.
512: //
513:
514: PVIDEO_HW_FIND_ADAPTER HwFindAdapter;
515:
516: //
517: // Supplies a pointer to the miniport driver's initialization routine.
518: //
519:
520: PVIDEO_HW_INITIALIZE HwInitialize;
521:
522: //
523: // Supplies a pointer to the miniport driver's interrupt service routine.
524: //
525:
526: PVIDEO_HW_INTERRUPT HwInterrupt;
527:
528: //
529: // Supplies a pointer to the miniport driver's start io routine.
530: //
531:
532: PVIDEO_HW_START_IO HwStartIO;
533:
534: //
535: // Supplies the size in bytes required for the miniport driver's private
536: // device extension. This storage is used by the miniport driver to hold
537: // per-adapter information. A pointer to this storage is provided with
538: // every call made to the miniport driver. This data storage is
539: // initialized to zero by the port driver.
540: //
541:
542: ULONG HwDeviceExtensionSize;
543:
544: //
545: // Supplies the number with which device numbering should be started.
546: // The device numbering is used to determine which \DeviceX entry under
547: // the \Parameters section in the registry should be used for parameters
548: // to the miniport driver.
549: // The number is *automatically* incremented when the miniport is called
550: // back in it's FindAdapter routine due to an appropriate _Again_
551: // parameter.
552: //
553:
554: ULONG StartingDeviceNumber;
555:
556: } VIDEO_HW_INITIALIZATION_DATA, *PVIDEO_HW_INITIALIZATION_DATA;
557:
558:
559: //
560: // Port driver routines called by miniport driver
561: //
562:
563: ULONG
564: VideoPortCompareMemory(
565: PVOID Source1,
566: PVOID Source2,
567: ULONG Length
568: );
569:
570: VOID
571: VideoPortDebugPrint(
572: ULONG DebugPrintLevel,
573: PCHAR DebugMessage,
574: ...
575: );
576:
577: VP_STATUS
578: VideoPortDisableInterrupt(
579: PVOID HwDeviceExtension
580: );
581:
582: VP_STATUS
583: VideoPortEnableInterrupt(
584: PVOID HwDeviceExtension
585: );
586:
587: VOID
588: VideoPortFreeDeviceBase(
589: PVOID HwDeviceExtension,
590: PVOID MappedAddress
591: );
592:
593: PVOID
594: VideoPortGetDeviceBase(
595: PVOID HwDeviceExtension,
596: PHYSICAL_ADDRESS IoAddress,
597: ULONG NumberOfUchars,
598: UCHAR InIoSpace
599: );
600:
601: typedef
602: VP_STATUS
603: (*PMINIPORT_QUERY_DEVICE_ROUTINE)(
604: PVOID HwDeviceExtension,
605: PVOID Context,
606: VIDEO_DEVICE_DATA_TYPE DeviceDataType,
607: PVOID Identifier,
608: ULONG IdentiferLength,
609: PVOID ConfigurationData,
610: ULONG ConfigurationDataLength,
611: PVOID ComponentInformation,
612: ULONG ComponentInformationLength
613: );
614:
615: VP_STATUS
616: VideoPortGetDeviceData(
617: PVOID HwDeviceExtension,
618: VIDEO_DEVICE_DATA_TYPE DeviceDataType,
619: PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine,
620: PVOID Context
621: );
622:
623: typedef
624: VP_STATUS
625: (*PMINIPORT_GET_REGISTRY_ROUTINE)(
626: PVOID HwDeviceExtension,
627: PVOID Context,
628: PWSTR ValueName,
629: PVOID ValueData,
630: ULONG ValueLength
631: );
632:
633: VP_STATUS
634: VideoPortGetRegistryParameters(
635: PVOID HwDeviceExtension,
636: PWSTR ParamterName,
637: UCHAR IsParameterFileName,
638: PMINIPORT_GET_REGISTRY_ROUTINE GetRegistryRoutine,
639: PVOID Context
640: );
641:
642: VP_STATUS
643: VideoPortInitialize(
644: PVOID Argument1,
645: PVOID Argument2,
646: PVIDEO_HW_INITIALIZATION_DATA HwInitializationData,
647: PVOID HwContext
648: );
649:
650: VP_STATUS
651: VideoPortInt10(
652: PVOID HwDeviceExtension,
653: PVIDEO_X86_BIOS_ARGUMENTS BiosArguments
654: );
655:
656: VOID
657: VideoPortLogError(
658: IN PVOID HwDeviceExtension,
659: IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL,
660: IN VP_STATUS ErrorCode,
661: IN ULONG UniqueId
662: );
663:
664: VP_STATUS
665: VideoPortMapMemory(
666: PVOID HwDeviceExtension,
667: PHYSICAL_ADDRESS PhysicalAddress,
668: PULONG Length,
669: PULONG InIoSpace,
670: PVOID *VirtualAddress
671: );
672:
673: VOID
674: VideoPortMoveMemory(
675: PVOID Destination,
676: PVOID Source,
677: ULONG Length
678: );
679:
680: UCHAR
681: VideoPortReadPortUchar(
682: PUCHAR Port
683: );
684:
685: USHORT
686: VideoPortReadPortUshort(
687: PUSHORT Port
688: );
689:
690: ULONG
691: VideoPortReadPortUlong(
692: PULONG Port
693: );
694:
695: VOID
696: VideoPortReadPortBufferUchar(
697: PUCHAR Port,
698: PUCHAR Buffer,
699: ULONG Count
700: );
701:
702: VOID
703: VideoPortReadPortBufferUshort(
704: PUSHORT Port,
705: PUSHORT Buffer,
706: ULONG Count
707: );
708:
709: VOID
710: VideoPortReadPortBufferUlong(
711: PULONG Port,
712: PULONG Buffer,
713: ULONG Count
714: );
715:
716: UCHAR
717: VideoPortReadRegisterUchar(
718: PUCHAR Register
719: );
720:
721: USHORT
722: VideoPortReadRegisterUshort(
723: PUSHORT Register
724: );
725:
726: ULONG
727: VideoPortReadRegisterUlong(
728: PULONG Register
729: );
730:
731: VOID
732: VideoPortReadRegisterBufferUchar(
733: PUCHAR Register,
734: PUCHAR Buffer,
735: ULONG Count
736: );
737:
738: VOID
739: VideoPortReadRegisterBufferUshort(
740: PUSHORT Register,
741: PUSHORT Buffer,
742: ULONG Count
743: );
744:
745: VOID
746: VideoPortReadRegisterBufferUlong(
747: PULONG Register,
748: PULONG Buffer,
749: ULONG Count
750: );
751:
752: BOOLEAN
753: VideoPortScanRom(
754: PVOID HwDeviceExtension,
755: PUCHAR RomBase,
756: ULONG RomLength,
757: PUCHAR String
758: );
759:
760: VP_STATUS
761: VideoPortSetRegistryParameters(
762: PVOID HwDeviceExtension,
763: PWSTR ValueName,
764: PVOID ValueData,
765: ULONG ValueLength
766: );
767:
768: VP_STATUS
769: VideoPortSetTrappedEmulatorPorts(
770: PVOID HwDeviceExtension,
771: ULONG NumAccessRanges,
772: PVIDEO_ACCESS_RANGE AccessRange
773: );
774:
775: VOID
776: VideoPortStallExecution(
777: ULONG Microseconds
778: );
779:
780: typedef
781: BOOLEAN
782: (*PMINIPORT_SYNCHRONIZE_ROUTINE)(
783: PVOID Context
784: );
785:
786: BOOLEAN
787: VideoPortSynchronizeExecution(
788: PVOID HwDeviceExtension,
789: VIDEO_SYNCHRONIZE_PRIORITY Priority,
790: PMINIPORT_SYNCHRONIZE_ROUTINE synchronizeRoutine,
791: PVOID Context
792: );
793:
794: VP_STATUS
795: VideoPortUnmapMemory(
796: PVOID HwDeviceExtension,
797: PVOID VirtualAddress,
798: ULONG InIoSpace
799: );
800:
801: VP_STATUS
802: VideoPortVerifyAccessRanges(
803: PVOID HwDeviceExtension,
804: ULONG NumAccessRanges,
805: PVIDEO_ACCESS_RANGE AccessRanges
806: );
807:
808: VOID
809: VideoPortWritePortUchar(
810: PUCHAR Port,
811: UCHAR Value
812: );
813:
814: VOID
815: VideoPortWritePortUshort(
816: PUSHORT Port,
817: USHORT Value
818: );
819:
820: VOID
821: VideoPortWritePortUlong(
822: PULONG Port,
823: ULONG Value
824: );
825:
826: VOID
827: VideoPortWritePortBufferUchar(
828: PUCHAR Port,
829: PUCHAR Buffer,
830: ULONG Count
831: );
832:
833: VOID
834: VideoPortWritePortBufferUshort(
835: PUSHORT Port,
836: PUSHORT Buffer,
837: ULONG Count
838: );
839:
840: VOID
841: VideoPortWritePortBufferUlong(
842: PULONG Port,
843: PULONG Buffer,
844: ULONG Count
845: );
846:
847: VOID
848: VideoPortWriteRegisterUchar(
849: PUCHAR Register,
850: UCHAR Value
851: );
852:
853: VOID
854: VideoPortWriteRegisterUshort(
855: PUSHORT Register,
856: USHORT Value
857: );
858:
859: VOID
860: VideoPortWriteRegisterUlong(
861: PULONG Register,
862: ULONG Value
863: );
864:
865: VOID
866: VideoPortWriteRegisterBufferUchar(
867: PUCHAR Register,
868: PUCHAR Buffer,
869: ULONG Count
870: );
871:
872: VOID
873: VideoPortWriteRegisterBufferUshort(
874: PUSHORT Register,
875: PUSHORT Buffer,
876: ULONG Count
877: );
878:
879: VOID
880: VideoPortWriteRegisterBufferUlong(
881: PULONG Register,
882: PULONG Buffer,
883: ULONG Count
884: );
885:
886: VOID
887: VideoPortZeroMemory(
888: PVOID Destination,
889: ULONG Length
890: );
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.