Annotation of ntddk/src/video/inc/ntddvdeo.h, revision 1.1

1.1     ! root        1: /*++ BUILD Version: 0001    // Increment this if a change has global effects
        !             2: 
        !             3: Copyright (c) 1990-1993  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     ddvdeo.h
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This is the include file that defines all constants and types for
        !            12:     accessing the Video device.
        !            13: 
        !            14: Author:
        !            15: 
        !            16:     Andre Vachon (andreva) 21-Jan-1992
        !            17: 
        !            18: Revision History:
        !            19: 
        !            20: --*/
        !            21: 
        !            22: //
        !            23: // VideoIoControlFile InputBuffer/OutputBuffer record structures for
        !            24: // this device.
        !            25: //
        !            26: 
        !            27: //
        !            28: // Name used to create the miniport logical device names
        !            29: //
        !            30: 
        !            31: #define VIDEO_DEVICE_NAME "DISPLAY%d"
        !            32: #define WVIDEO_DEVICE_NAME L"DISPLAY%d"
        !            33: 
        !            34: 
        !            35: //
        !            36: // The first set of IOCTLs are handle by the port driver and never seen
        !            37: // by the miniport.
        !            38: //
        !            39: 
        !            40: #define IOCTL_VIDEO_ENABLE_VDM \
        !            41:     CTL_CODE(FILE_DEVICE_VIDEO, 0x00, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            42: #define IOCTL_VIDEO_DISABLE_VDM \
        !            43:     CTL_CODE(FILE_DEVICE_VIDEO, 0x01, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            44: #define IOCTL_VIDEO_REGISTER_VDM \
        !            45:     CTL_CODE(FILE_DEVICE_VIDEO, 0x02, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            46: 
        !            47: 
        !            48: //
        !            49: // All these IOCTL's must be both handled by the port and miniport since
        !            50: // they require processing by both parties.
        !            51: //
        !            52: #define IOCTL_VIDEO_SAVE_HARDWARE_STATE \
        !            53:     CTL_CODE(FILE_DEVICE_VIDEO, 0x80, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            54: #define IOCTL_VIDEO_RESTORE_HARDWARE_STATE \
        !            55:     CTL_CODE(FILE_DEVICE_VIDEO, 0x81, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            56: 
        !            57: 
        !            58: //
        !            59: // All these IOCTL's are public and must/can be handled by the miniport
        !            60: // driver
        !            61: //
        !            62: 
        !            63: #define IOCTL_VIDEO_QUERY_AVAIL_MODES \
        !            64:     CTL_CODE(FILE_DEVICE_VIDEO, 0x100, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            65: #define IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES \
        !            66:     CTL_CODE(FILE_DEVICE_VIDEO, 0x101, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            67: #define IOCTL_VIDEO_QUERY_CURRENT_MODE \
        !            68:     CTL_CODE(FILE_DEVICE_VIDEO, 0x102, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            69: #define IOCTL_VIDEO_SET_CURRENT_MODE \
        !            70:     CTL_CODE(FILE_DEVICE_VIDEO, 0x103, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            71: #define IOCTL_VIDEO_RESET_DEVICE \
        !            72:     CTL_CODE(FILE_DEVICE_VIDEO, 0x104, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            73: 
        !            74: #define IOCTL_VIDEO_LOAD_AND_SET_FONT \
        !            75:     CTL_CODE(FILE_DEVICE_VIDEO, 0x105, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            76: 
        !            77: #define IOCTL_VIDEO_SET_PALETTE_REGISTERS \
        !            78:     CTL_CODE(FILE_DEVICE_VIDEO, 0x106, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            79: #define IOCTL_VIDEO_SET_COLOR_REGISTERS \
        !            80:     CTL_CODE(FILE_DEVICE_VIDEO, 0x107, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            81: 
        !            82: #define IOCTL_VIDEO_ENABLE_CURSOR \
        !            83:     CTL_CODE(FILE_DEVICE_VIDEO, 0x108, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            84: #define IOCTL_VIDEO_DISABLE_CURSOR \
        !            85:     CTL_CODE(FILE_DEVICE_VIDEO, 0x109, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            86: #define IOCTL_VIDEO_SET_CURSOR_ATTR \
        !            87:     CTL_CODE(FILE_DEVICE_VIDEO, 0x10a, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            88: #define IOCTL_VIDEO_QUERY_CURSOR_ATTR \
        !            89:     CTL_CODE(FILE_DEVICE_VIDEO, 0x10b, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            90: #define IOCTL_VIDEO_SET_CURSOR_POSITION \
        !            91:     CTL_CODE(FILE_DEVICE_VIDEO, 0x10c, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            92: #define IOCTL_VIDEO_QUERY_CURSOR_POSITION \
        !            93:     CTL_CODE(FILE_DEVICE_VIDEO, 0x10d, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            94: 
        !            95: #define IOCTL_VIDEO_ENABLE_POINTER \
        !            96:     CTL_CODE(FILE_DEVICE_VIDEO, 0x10e, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            97: #define IOCTL_VIDEO_DISABLE_POINTER \
        !            98:     CTL_CODE(FILE_DEVICE_VIDEO, 0x10f, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !            99: #define IOCTL_VIDEO_SET_POINTER_ATTR \
        !           100:     CTL_CODE(FILE_DEVICE_VIDEO, 0x110, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           101: #define IOCTL_VIDEO_QUERY_POINTER_ATTR \
        !           102:     CTL_CODE(FILE_DEVICE_VIDEO, 0x111, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           103: #define IOCTL_VIDEO_SET_POINTER_POSITION \
        !           104:     CTL_CODE(FILE_DEVICE_VIDEO, 0x112, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           105: #define IOCTL_VIDEO_QUERY_POINTER_POSITION \
        !           106:     CTL_CODE(FILE_DEVICE_VIDEO, 0x113, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           107: #define IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES \
        !           108:     CTL_CODE(FILE_DEVICE_VIDEO, 0x114, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           109: 
        !           110: #define IOCTL_VIDEO_GET_BANK_SELECT_CODE \
        !           111:     CTL_CODE(FILE_DEVICE_VIDEO, 0x115, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           112: 
        !           113: #define IOCTL_VIDEO_MAP_VIDEO_MEMORY \
        !           114:     CTL_CODE(FILE_DEVICE_VIDEO, 0x116, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           115: #define IOCTL_VIDEO_UNMAP_VIDEO_MEMORY \
        !           116:     CTL_CODE(FILE_DEVICE_VIDEO, 0x117, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           117: #define IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES \
        !           118:     CTL_CODE(FILE_DEVICE_VIDEO, 0x118, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           119: #define IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES \
        !           120:     CTL_CODE(FILE_DEVICE_VIDEO, 0x119, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           121: 
        !           122: #define IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES \
        !           123:     CTL_CODE(FILE_DEVICE_VIDEO, 0x11a, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           124: 
        !           125: #define IOCTL_VIDEO_QUERY_AVAIL_FONTS \
        !           126:     CTL_CODE(FILE_DEVICE_VIDEO, 0x11b, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           127: #define IOCTL_VIDEO_QUERY_NUM_AVAIL_FONTS \
        !           128:     CTL_CODE(FILE_DEVICE_VIDEO, 0x11c, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           129: #define IOCTL_VIDEO_QUERY_CURRENT_FONT \
        !           130:     CTL_CODE(FILE_DEVICE_VIDEO, 0x11d, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           131: #define IOCTL_VIDEO_SET_CURRENT_FONT \
        !           132:     CTL_CODE(FILE_DEVICE_VIDEO, 0x11e, METHOD_BUFFERED, FILE_ANY_ACCESS)
        !           133: 
        !           134: 
        !           135: 
        !           136: //
        !           137: // Many of the video ICOTLs are modal. When ever the palette is set, or the
        !           138: // cursor is set or queried, it is done for the current mode.
        !           139: //
        !           140: // Modal specifies that the operation is only valid within a mode. Once a
        !           141: // set mode operation is performed, the state associated to the modal IOCTL
        !           142: // has been destroyed or reinitialized.
        !           143: // Non-modal IOCTLs have their state preserved across set-mode operations.
        !           144: //
        !           145: // Optional IOCTLs are IOCTLs the miniport can optionally support. If the
        !           146: // miniport does not support the IOCTL, it should return the appropriate
        !           147: // error status.
        !           148: // Required IOCTLs must be implemented in a miniport in order for the system
        !           149: // to system properly.
        !           150: //
        !           151: // IOCTL_VIDEO_ENABLE_VDM                       Non-Modal    Private(1)
        !           152: // IOCTL_VIDEO_DISABLE_VDM                      Non-Modal    Private(1)
        !           153: // IOCTL_VIDEO_REGISTER_VDM                     Non-Modal    Private(1)
        !           154: //
        !           155: // IOCTL_VIDEO_SAVE_HARDWARE_STATE              Non-Modal    Required(2)
        !           156: // IOCTL_VIDEO_RESTORE_HARDWARE_STATE           Non-Modal    Required(2)
        !           157: //
        !           158: // IOCTL_VIDEO_QUERY_AVAIL_MODES                Non-Modal    Required
        !           159: // IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES            Non-Modal    Required
        !           160: // IOCTL_VIDEO_QUERY_CURRENT_MODE               Modal        Required
        !           161: // IOCTL_VIDEO_SET_CURRENT_MODE                 Non-Modal    Required
        !           162: // IOCTL_VIDEO_RESET_DEVICE                     Non-Modal    Required
        !           163: //
        !           164: // IOCTL_VIDEO_LOAD_AND_SET_FONT                Modal        Required(2)
        !           165: //
        !           166: // IOCTL_VIDEO_SET_PALETTE_REGISTERS            Modal        Required(2)
        !           167: // IOCTL_VIDEO_SET_COLOR_REGISTERS              Modal        Required(3)
        !           168: //
        !           169: // IOCTL_VIDEO_ENABLE_CURSOR                    Modal        Required(2)
        !           170: // IOCTL_VIDEO_DISABLE_CURSOR                   Modal        Required(2)
        !           171: // IOCTL_VIDEO_SET_CURSOR_ATTR                  Modal        Required(2)
        !           172: // IOCTL_VIDEO_QUERY_CURSOR_ATTR                Modal        Required(2)
        !           173: // IOCTL_VIDEO_SET_CURSOR_POSITION              Modal        Required(2)
        !           174: // IOCTL_VIDEO_QUERY_CURSOR_POSITION            Modal        Required(2)
        !           175: //
        !           176: // IOCTL_VIDEO_ENABLE_POINTER                   Modal        Optional
        !           177: // IOCTL_VIDEO_DISABLE_POINTER                  Modal        Optional
        !           178: // IOCTL_VIDEO_SET_POINTER_ATTR                 Modal        Optional
        !           179: // IOCTL_VIDEO_QUERY_POINTER_ATTR               Modal        Optional
        !           180: // IOCTL_VIDEO_SET_POINTER_POSITION             Modal        Optional
        !           181: // IOCTL_VIDEO_QUERY_POINTER_POSITION           Modal        Optional
        !           182: // IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES       Non-Modal    Optional
        !           183: //
        !           184: // IOCTL_VIDEO_GET_BANK_SELECT_CODE             Modal        Required(2)
        !           185: //
        !           186: // IOCTL_VIDEO_MAP_VIDEO_MEMORY                 Special(4)   Required
        !           187: // IOCTL_VIDEO_UNMAP_VIDEO_MEMORY               Non-Modal    Required
        !           188: // IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES       Non-Modal    Required
        !           189: // IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES        Non-Modal    Required
        !           190: //
        !           191: // IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES         Non-Modal    Optional
        !           192: //
        !           193: // IOCTL_VIDEO_QUERY_AVAIL_FONTS                Non-Modal    Optional
        !           194: // IOCTL_VIDEO_QUERY_NUM_AVAIL_FONTS            Non-Modal    Optional
        !           195: // IOCTL_VIDEO_SET_CURRENT_FONT                 Non-Modal    Optional
        !           196: // IOCTL_VIDEO_QUERY_CURRENT_FONT               Non-Modal    Optional
        !           197: //
        !           198: //
        !           199: // (1) Private means the IOCTL is completely implemeted within the port driver
        !           200: //     and the miniport does not need to support it.
        !           201: //
        !           202: // (2) These Required functions are for "Vga Compatible" miniports. They are
        !           203: //     Optional for other, non vga-compatible (i.e frame buffers) drivers.
        !           204: //     VGA compatible means here that the miniport implements all the VGA
        !           205: //     functionality and that the VgaCompatible flag for the miniport in the
        !           206: //     registry parameters is turned on.
        !           207: //
        !           208: // (3) This IOCTL is required if the device has a color lookup table (also
        !           209: //     commonly called palette) the PALETTE IOCTL is used for VGA while the
        !           210: //     COLOR IOCTL is the more general IOCTL that is called by the display
        !           211: //     driver or application to set the colors in the devices internal
        !           212: //     lookup table
        !           213: //
        !           214: // (4) This IOCTL is both modal and non-modal. It should map all of video
        !           215: //     memory in the caller's address space. A set mode MUST NOT cause the
        !           216: //     video memory to change location - in this sense it is non-modal.
        !           217: //     However, this IOCTL returns the location size of the frame buffer within
        !           218: //     video memory, and the frame buffer size and location may vary from mode
        !           219: //     to mode - so that information is modal.
        !           220: //
        !           221: 
        !           222: 
        !           223: //
        !           224: // Any IOCTL that returns information should return in the status block the
        !           225: // size of the data returned.
        !           226: // If the output buffer was too small, an error should be returned.
        !           227: //
        !           228: //
        !           229: //
        !           230: //
        !           231: 
        !           232: 
        !           233: 
        !           234: //
        !           235: // VIDEO_IOCTL_ENABLE_VDM
        !           236: // VIDEO_IOCTL_DISABLE_VDM
        !           237: // VIDEO_IOCTL_REGISTER_VDM
        !           238: //
        !           239: // These IOCTLs are used to enable or disable a VDM's access to the video
        !           240: // hardware. This call will cause the real video frame buffer to be mapped
        !           241: // into the VDM's address space and get the video validator connected to the
        !           242: // V86 emulator for direct video register access.
        !           243: //
        !           244: // Information used by this function is passed using the following structure:
        !           245: //
        !           246: 
        !           247: typedef struct _VIDEO_VDM {
        !           248:     HANDLE ProcessHandle;
        !           249: } VIDEO_VDM, *PVIDEO_VDM;
        !           250: 
        !           251: //
        !           252: //ProcessHandle - Handle to the process for which this request must be
        !           253: //    performed. This is required because the console calls the miniport on
        !           254: //    the behalf of the VDM process; we are not performing this request in
        !           255: //    the context of the current caller.
        !           256: //
        !           257: 
        !           258: 
        !           259: typedef struct _VIDEO_REGISTER_VDM {
        !           260:     ULONG MinimumStateSize;
        !           261: } VIDEO_REGISTER_VDM, *PVIDEO_REGISTER_VDM;
        !           262: 
        !           263: //
        !           264: //MinimumStateSize - Output value determining the minimum size required to
        !           265: //    store the video hardware state when performing SAVE_HARDWARE_SATE or
        !           266: //    RESTORE_HARDWARE_STATE Ioctls.
        !           267: //
        !           268: 
        !           269: 
        !           270: //
        !           271: // Second set of structures
        !           272: //
        !           273: 
        !           274: //
        !           275: // These IOCTLs are used by the VDM and the console to communicate state
        !           276: // changes between the VDM and the kernel video driver.
        !           277: //
        !           278: // VIDEO_IOCTL_SAVE_HARDWARE_STATE -
        !           279: // VIDEO_IOCTL_RESTORE_HARDWARE_STATE -
        !           280: //
        !           281: //
        !           282: // This structure is at the start of the block used when saving or restoring
        !           283: // the state of the video hardware using ConsoleHardwareState().
        !           284: // the ULONG are offset to the location of the rest of the data. That data
        !           285: // is stored within the same memory block pointed to by the
        !           286: // VIDEO_HARDWARE_STATE structure, right after this header.
        !           287: //
        !           288: // Information used by this function is passed using the following structure:
        !           289: //
        !           290: 
        !           291: typedef struct _VIDEO_HARDWARE_STATE_HEADER {
        !           292:     ULONG Length;
        !           293:     UCHAR PortValue[0x30];
        !           294:     ULONG AttribIndexDataState;
        !           295:     ULONG BasicSequencerOffset;
        !           296:     ULONG BasicCrtContOffset;
        !           297:     ULONG BasicGraphContOffset;
        !           298:     ULONG BasicAttribContOffset;
        !           299:     ULONG BasicDacOffset;
        !           300:     ULONG BasicLatchesOffset;
        !           301:     ULONG ExtendedSequencerOffset;
        !           302:     ULONG ExtendedCrtContOffset;
        !           303:     ULONG ExtendedGraphContOffset;
        !           304:     ULONG ExtendedAttribContOffset;
        !           305:     ULONG ExtendedDacOffset;
        !           306:     ULONG ExtendedValidatorStateOffset;
        !           307:     ULONG ExtendedMiscDataOffset;
        !           308:     ULONG PlaneLength;
        !           309:     ULONG Plane1Offset;
        !           310:     ULONG Plane2Offset;
        !           311:     ULONG Plane3Offset;
        !           312:     ULONG Plane4Offset;
        !           313:     ULONG VGAStateFlags;
        !           314:     ULONG DIBOffset;
        !           315:     ULONG DIBBitsPerPixel;
        !           316:     ULONG DIBXResolution;
        !           317:     ULONG DIBYResolution;
        !           318:     ULONG DIBXlatOffset;
        !           319:     ULONG DIBXlatLength;
        !           320: } VIDEO_HARDWARE_STATE_HEADER, *PVIDEO_HARDWARE_STATE_HEADER;
        !           321: 
        !           322: //
        !           323: // defines for VGAStateFlags
        !           324: //
        !           325: 
        !           326: #define VIDEO_STATE_NON_STANDARD_VGA       0x00000001
        !           327: #define VIDEO_STATE_UNEMULATED_VGA_STATE   0x00000002
        !           328: #define VIDEO_STATE_PACKED_CHAIN4_MODE     0x00000004
        !           329: 
        !           330: 
        !           331: typedef struct _VIDEO_HARDWARE_STATE {
        !           332:     PVIDEO_HARDWARE_STATE_HEADER StateHeader;
        !           333:     ULONG StateLength;
        !           334: } VIDEO_HARDWARE_STATE, *PVIDEO_HARDWARE_STATE;
        !           335: 
        !           336: //
        !           337: //Length - Length of the basic structure. Used for versioning purposes. The
        !           338: //    length field should be initialized to be equal to
        !           339: //    sizeof(VIDEO_HARDWARE_STATE_HEADER).
        !           340: //
        !           341: //PortValue - Array of entries containing the data values for port 3B0 through
        !           342: //    3DF.
        !           343: //
        !           344: //AttribIndexDataState - State of the attribute index register.
        !           345: //
        !           346: //BasicSequencerOffset - Offset, in bytes, from the beginning of the structure,
        !           347: //    to an array of fields containing the register values for the basic
        !           348: //    sequencer register set of the VGA.
        !           349: //
        !           350: //BasicCrtContOffset - Offset, in bytes, from the beginning of the structure,
        !           351: //    to an array of fields containing the register values for the basic
        !           352: //    CRT register set of the VGA.
        !           353: //
        !           354: //BasicGraphContOffset - Offset, in bytes, from the beginning of the structure,
        !           355: //    to an array of fields containing the register values for the basic
        !           356: //    graphics controller register set of the VGA.
        !           357: //
        !           358: //BasicAttribContOffset - Offset, in bytes, from the beginning of the structure,
        !           359: //    to an array of fields containing the register values for the basic
        !           360: //    attribute controller register set of the VGA.
        !           361: //
        !           362: //BasicDacOffset - Offset, in bytes, from the beginning of the structure,
        !           363: //    to an array of fields containing the register values for the basic
        !           364: //    DAC registers of the VGA.
        !           365: //
        !           366: //BasicLatchesOffset - Offset, in bytes, from the beginning of the structure,
        !           367: //    to an array of fields containing the register values for the basic
        !           368: //    latches of the VGA.
        !           369: //
        !           370: //ExtendedSequencerOffset - Offset, in bytes, from the beginning of the structure,
        !           371: //    to an array of fields containing the registers values for the extended
        !           372: //    sequencer register set of the VGA.
        !           373: //
        !           374: //ExtendedCrtContOffset - Offset, in bytes, from the beginning of the structure,
        !           375: //    to an array of fields containing the registers values for the extended
        !           376: //    CRT register set of the VGA.
        !           377: //
        !           378: //ExtendedGraphContOffset - Offset, in bytes, from the beginning of the structure,
        !           379: //    to an array of fields containing the registers values for the extended
        !           380: //    graphics controller register set of the VGA.
        !           381: //
        !           382: //ExtendedAttribContOffset - Offset, in bytes, from the beginning of the structure,
        !           383: //    to an array of fields containing the registers values for the extended
        !           384: //    attribute controller register set of the VGA.
        !           385: //
        !           386: //ExtendedDacOffset - Offset, in bytes, from the beginning of the structure,
        !           387: //    to an array of fields containing the registers values for the extended
        !           388: //    DAC registers of the VGA.
        !           389: //
        !           390: //ExtendedValidatorStateOffset - Offset, in bytes, from the beginning of the
        !           391: //    structure, to an area reserved for the miniport to put the unemulated
        !           392: //    save state that the miniport uses to perform instruction validation for
        !           393: //    DOS apps.
        !           394: //
        !           395: //ExtendedMiscDataOffset - Offset, in bytes, from the beginning of the structure,
        !           396: //    to an area reserved for the use of the miniport.
        !           397: //
        !           398: //PlaneLength - Length of each of the following plane (if present)
        !           399: //
        !           400: //Plane1Offset - Offset, in bytes, from the beginning of the structure, to an
        !           401: //    array of fields containing the data of the first plane of video memory.
        !           402: //
        !           403: //Plane2Offset - Offset, in bytes, from the beginning of the structure, to an
        !           404: //    array of fields containing the data of the second plane of video memory.
        !           405: //
        !           406: //Plane3Offset - Offset, in bytes, from the beginning of the structure, to an
        !           407: //    array of fields containing the data of the third plane of video memory.
        !           408: //
        !           409: //Plane4Offset - Offset, in bytes, from the beginning of the structure, to an
        !           410: //    array of fields containing the data of the fourth plane of video memory.
        !           411: //
        !           412: //VGAStateFlags - Flags used for the interpretation of the VGA state.
        !           413: //    VIDEO_STATE_NON_STANDARD_VGA is set when the set of registers the VGA
        !           414: //        returns is not the basic set (all super vga's are not standard).
        !           415: //        The VDM should not emulate the saved state unless a specific VDD
        !           416: //        has been written for the device.
        !           417: //    VIDEO_STATE_UNEMULATED_VGA_STATE specified the miniport has stored
        !           418: //        informaiton in the ExtendedValidatorState field and the miniport
        !           419: //        should treat this as a frozen state, whatever the registers say.
        !           420: //    VIDEO_STATE_PACKED_CHAIN4_MODE indicates that in mode 13 (320x200x256).
        !           421: //        the data is stored in a packed pixel format in the plane, as
        !           422: //        opposed to the standard VGA format where the data is interleaved
        !           423: //        at every four bytes, and on every 16K boundary, offset by one
        !           424: //        extra byte.
        !           425: //
        !           426: //DIBOffset - Offset to the location of the DIB in the allocated data
        !           427: //        structure. If NULL, no translation is available.
        !           428: //
        !           429: //DIBBitsPerPixel - Format of the DIB.
        !           430: //
        !           431: //DIBXResolution - Width of the DIB in pixels.
        !           432: //
        !           433: //DIBYResolution - Height of the DIB in pixels.
        !           434: //
        !           435: //DIBXlatOffset - Offset to the location of the translation vector
        !           436: //    from DIB pixel values to 32-bit RGB (1 byte red, 1 byte green, 1 byte
        !           437: //    blue, 1 byte empty). Maximum length 256. If NULL, the standard
        !           438: //    VGA palette stored in this structure should be used.
        !           439: //
        !           440: //DIBXlatLength - Length of the RGB translation vector at DIBXlatOffset.
        !           441: //
        !           442: // For each of the offset fields, if an offset value is NULL, then there is
        !           443: // no data for that offset.
        !           444: // The length of a data area is:
        !           445: //   1) the specific length given to it : plane length (planes) or XResolution *
        !           446: //        Yresolution * BitsPerPel (DIB)
        !           447: //   2) otherwise, the length = next_non-null_offset_value -
        !           448: //                                   current_offset_value
        !           449: //
        !           450: 
        !           451: //
        !           452: //StateHeader - Pointer to the VIDEO_HARDWARE_STATE_HEADER structure.
        !           453: //
        !           454: //StateLength - Size of the VIDEO_HARDWARE_STATE_HEADER structure.
        !           455: //
        !           456: 
        !           457: //
        !           458: // VIDEO_IOCTL_QUERY_NUM_AVAIL_MODES - Returns number of different modes
        !           459: //                                     available on the controller.
        !           460: //
        !           461: // Information used by this function is passed using the following structure:
        !           462: //
        !           463: 
        !           464: typedef struct _VIDEO_NUM_MODES {
        !           465:     ULONG NumModes;
        !           466:     ULONG ModeInformationLength;
        !           467: } VIDEO_NUM_MODES, *PVIDEO_NUM_MODES;
        !           468: 
        !           469: //
        !           470: //NumModes - Returns the number of modes supported by the kernel driver.
        !           471: //
        !           472: //ModeInformationLength - Length of the VIDEO_MODE_INFORMATION structure
        !           473: //    for the VIDEO_IOCTL QUERY_AVAILABLE_MODES IOCTL.
        !           474: 
        !           475: 
        !           476: //
        !           477: // VIDEO_IOCTL_SET_CURRENT_MODE - Is used to set the mode of the controller.
        !           478: //
        !           479: // Information used by this function is passed using the following structure:
        !           480: //
        !           481: 
        !           482: typedef struct _VIDEO_MODE {
        !           483:     ULONG RequestedMode;
        !           484: } VIDEO_MODE, *PVIDEO_MODE;
        !           485: 
        !           486: #define VIDEO_MODE_NO_ZERO_MEMORY 0x80000000 // High order bit of the mode
        !           487:                                              // determines if the set mode
        !           488:                                              // should (0) or should not (1)
        !           489:                                              // cause the video memory to be
        !           490:                                              // zeroed out simultaneously to
        !           491:                                              // the set mode operation.
        !           492: 
        !           493: //
        !           494: //RequestedMode - Indicates in which mode the adapter should be initialized.
        !           495: //
        !           496: 
        !           497: 
        !           498: //
        !           499: // VIDEO_IOCTL_RESET_DEVICE - Is used to reset the mode of the adapter when GDI
        !           500: //                            gives up control of the device to allow a VDM to
        !           501: //                            access the hardware. x86 only.
        !           502: //                            The default mode should be whatever is the
        !           503: //                            default mode when the machine is booted
        !           504: //
        !           505: // No information is needed fo this function.
        !           506: //
        !           507: 
        !           508: 
        !           509: 
        !           510: //
        !           511: // VIDEO_IOCTL_QUERY_AVAIL_MODES - Returns information about each available
        !           512: //                                 mode on the controller.
        !           513: //
        !           514: // VIDEO_IOCTL_QUERY_CURRENT_MODE - Returns the information for the current
        !           515: //                                  controller mode.
        !           516: //
        !           517: // Information used by this function is passed using the following structure:
        !           518: //
        !           519: // NOTE This structure is matched exactly with the DISP_MODE structure
        !           520: // in winddi.h - every change to this structure MUST be made to the
        !           521: // structure in winddi.h.
        !           522: //
        !           523: 
        !           524: typedef struct _VIDEO_MODE_INFORMATION {
        !           525:     ULONG Length;
        !           526:     ULONG ModeIndex;
        !           527:     ULONG VisScreenWidth;
        !           528:     ULONG VisScreenHeight;
        !           529:     ULONG ScreenStride;
        !           530:     ULONG NumberOfPlanes;
        !           531:     ULONG BitsPerPlane;
        !           532:     ULONG Frequency;
        !           533:     ULONG XMillimeter;
        !           534:     ULONG YMillimeter;
        !           535:     ULONG NumberRedBits;
        !           536:     ULONG NumberGreenBits;
        !           537:     ULONG NumberBlueBits;
        !           538:     ULONG RedMask;
        !           539:     ULONG GreenMask;
        !           540:     ULONG BlueMask;
        !           541:     ULONG AttributeFlags;
        !           542:     ULONG VideoMemoryBitmapWidth;
        !           543:     ULONG VideoMemoryBitmapHeight;
        !           544: } VIDEO_MODE_INFORMATION, *PVIDEO_MODE_INFORMATION;
        !           545: 
        !           546: //
        !           547: // Bit definitions for Attribute Flags
        !           548: //
        !           549: 
        !           550: #define VIDEO_MODE_COLOR           0x0001  // 0 = Mono-compatible, 1 = Color
        !           551: #define VIDEO_MODE_GRAPHICS        0x0002  // 0 = Text mode, 1 = Graphics
        !           552: #define VIDEO_MODE_PALETTE_DRIVEN  0x0004  // 0 = Colors are direct
        !           553:                                            // 1 = Colors are index to a palette
        !           554: #define VIDEO_MODE_MANAGED_PALETTE 0x0008  // 0 = Palette is fixed (must be
        !           555:                                            //     queried from miniport
        !           556:                                            // 1 = Palette is settable.
        !           557: #define VIDEO_MODE_INTERLACED      0x0010  // 1 = Mode is interlaced
        !           558:                                            // 0 = non-interlaced
        !           559: #define VIDEO_MODE_NO_OFF_SCREEN   0x0020  // 1 = Offscreen memory CAN NOT be
        !           560:                                            //     used to store information.
        !           561:                                            // 0 = Offscreen memory is available
        !           562: 
        !           563: //
        !           564: //Length - Length of the structure in bytes. Also used to do verisioning.
        !           565: //
        !           566: //ModeIndex - Number used to set this mode when calling the miniport driver.
        !           567: //
        !           568: //VisScreenWidth - Number of visible horizontal pixels on a scan line
        !           569: //
        !           570: //VisScreenHeight - Number of visible lines (or scan lines)
        !           571: //
        !           572: //ScreenStride - Delta, in *BYTES*, between the start of two scan lines.
        !           573: //
        !           574: //    NOTE: the width and height are in pixels, but the stride is in bytes !!!
        !           575: //
        !           576: //NumberOfPlanes - Number of separate planes combined by the device.
        !           577: //
        !           578: //BitsPerPlane - Number of bits per pixel on a plane.
        !           579: //
        !           580: //Frequency - Screen Frequency, in Hertz.
        !           581: //
        !           582: //XMillimeter - Size of the horizontal active region on the output device,
        !           583: //    in millimeters.
        !           584: //
        !           585: //YMillimeter - Size of the vertical active region on the output device,
        !           586: //    in millimeters.
        !           587: //
        !           588: //NumberRedBits - Number of bits in the red DAC.
        !           589: //
        !           590: //NumberGreenBits - Number of bits in the green DAC.
        !           591: //
        !           592: //NumberBlueBits - Number of bits in the blue DAC.
        !           593: //
        !           594: //RedMask - Red color Mask for device with direct color modes. Bits turned
        !           595: //    on indicate the bit is of color Red.
        !           596: //
        !           597: //GreenMask - Green color Mask for device with direct color modes. Bits
        !           598: //    turned on indicate the bit is of color Green.
        !           599: //
        !           600: //BlueMask - Blue color Mask for device with direct color modes. Bits
        !           601: //    turned on indicate the bit is of color Blue.
        !           602: //
        !           603: //AttributeFlags. Flags indicating certain behavior for the device.
        !           604: //
        !           605: //VideoMemoryBitmapWidth - Width of the video memory bitmap.
        !           606: //    VisScreenWidth <= VideoMemoryBitmapWidth <= ScreenStride
        !           607: //
        !           608: //VideoMemoryBitmapHeight - Height of the video memory bitmap.
        !           609: //   VisScreenHeight <= VideoMemoryBitmapHeight = VideoRamLength / ScreenStride
        !           610: //
        !           611: 
        !           612: //
        !           613: // VIDEO_IOCTL_QUERY_NUM_AVAIL_FONTS - Returns the number of ROM fonts
        !           614: //                                     available on the card.
        !           615: //
        !           616: // Information used by this function is passed using the following structure:
        !           617: //
        !           618: 
        !           619: typedef struct _VIDEO_NUM_FONTS {
        !           620:     ULONG NumFonts;
        !           621: } VIDEO_NUM_FONTS, *PVIDEO_NUM_FONTS;
        !           622: 
        !           623: //
        !           624: //NumFonts - Returns the number of ROM fonts found on the device.
        !           625: //
        !           626: 
        !           627: 
        !           628: //
        !           629: // VIDEO_IOCTL_QUERY_AVAIL_FONTS - Returns an array containing information
        !           630: //                                 about each available font on the controller.
        !           631: //
        !           632: // Information used by this function is passed using the following structure:
        !           633: //
        !           634: 
        !           635: typedef struct _VIDEO_FONT_INFORMATION {
        !           636:     ULONG FontIndex;
        !           637:     USHORT WidthInPixels;
        !           638:     USHORT HeightInPixels;
        !           639: } VIDEO_FONT_INFORMATION, *PVIDEO_FONT_INFORMATION;
        !           640: 
        !           641: //
        !           642: //FontIndex - Index of the font in the controller's font table. For a
        !           643: //    QUERY_CURRENT_FONT, 0 is returned if the font was a loadable-font.
        !           644: //
        !           645: //WidthInPixels - Width of the characters in the font, in pixels.
        !           646: //
        !           647: //HeigthInPixels - Heigth of the characters in the font, in pixels.
        !           648: //
        !           649: 
        !           650: 
        !           651: //
        !           652: // VIDEO_IOCTL_SET_CURRENT_FONT -  Is used to load one of the ROM fonts found
        !           653: //                                 on the controller.
        !           654: //
        !           655: // Information used by this function is passed using the following structure:
        !           656: //
        !           657: 
        !           658: typedef struct _VIDEO_FONT {
        !           659:     ULONG RequestedFont;
        !           660: } VIDEO_FONT, *PVIDEO_FONT;
        !           661: 
        !           662: //
        !           663: //RequestedFont - Indicates which ROM font from the device should be loaded.
        !           664: //                Note that zero is not a valid font since it indicates the
        !           665: //                font that is currently in the font generator.
        !           666: //
        !           667: 
        !           668: 
        !           669: //
        !           670: // VIDEO_IOCTL_LOAD_AND_SET_FONT - Is used to load a user-defined font.
        !           671: //
        !           672: // VIDEO_IOCTL_QUERY_CURRENT_FONT - Returns the information for the current
        !           673: //                                  controller font.
        !           674: //
        !           675: // Information used by this function is passed using the following structure:
        !           676: //
        !           677: 
        !           678: typedef struct _VIDEO_LOAD_FONT_INFORMATION {
        !           679:     USHORT WidthInPixels;
        !           680:     USHORT HeightInPixels;
        !           681:     ULONG FontSize;
        !           682:     UCHAR Font[1];
        !           683: } VIDEO_LOAD_FONT_INFORMATION, *PVIDEO_LOAD_FONT_INFORMATION;
        !           684: 
        !           685: //
        !           686: //WidthInPixels - Width of the characters in the font, in pixels.
        !           687: //
        !           688: //HeigthInPixels - Heigth of the characters in the font, in pixels.
        !           689: //
        !           690: //FontSize - Size of the font buffer being passed in, in bytes.
        !           691: //
        !           692: //Font - Start of the font buffer.
        !           693: //
        !           694: 
        !           695: 
        !           696: //
        !           697: // VIDEO_IOCTL_SET_PALETTE_REGISTERS - Takes buffer containing
        !           698: //                                     VIDEO_PALETTE_DATA where Colors[]
        !           699: //                                     specifies the array containing the
        !           700: //                                     color values for the palette registers.
        !           701: //
        !           702: // Information used by this function is passed using the following structure:
        !           703: //
        !           704: // NOTE: This should only be used by the VGA type drivers
        !           705: //
        !           706: 
        !           707: typedef struct _VIDEO_PALETTE_DATA {
        !           708:     USHORT NumEntries;
        !           709:     USHORT FirstEntry;
        !           710:     USHORT Colors[1];
        !           711: } VIDEO_PALETTE_DATA, *PVIDEO_PALETTE_DATA;
        !           712: 
        !           713: //
        !           714: //NumEntries - Number of entries in the array of color values.
        !           715: //
        !           716: //FirstEntry - Location in the device palette to which the first entry in the
        !           717: //    list of colors should be copied to. The other entries in the color list
        !           718: //    should be copied sequentially, from this starting point into the device's
        !           719: //    palette.
        !           720: //
        !           721: //Colors - Array of color entries to copy into the device's color palette.
        !           722: //
        !           723: 
        !           724: //
        !           725: // VIDEO_IOCTL_SET_COLOR_REGISTERS - Takes buffer containing VIDEO_CLUT.
        !           726: //
        !           727: // Information used by this function is passed using the following structure:
        !           728: //
        !           729: 
        !           730: typedef struct _VIDEO_CLUTDATA {
        !           731:     UCHAR Red;
        !           732:     UCHAR Green;
        !           733:     UCHAR Blue;
        !           734:     UCHAR Unused;
        !           735: } VIDEO_CLUTDATA, *PVIDEO_CLUTDATA;
        !           736: 
        !           737: //
        !           738: //Red - Bits to be put in the Red portion of the color registers.
        !           739: //
        !           740: //Green - Bits to be put in the Green portion of the color registers.
        !           741: //
        !           742: //Blue - Bits to be put in the Blue portion of the color registers.
        !           743: //
        !           744: 
        !           745: typedef struct {
        !           746:     USHORT   NumEntries;
        !           747:     USHORT   FirstEntry;
        !           748:     union {
        !           749:         VIDEO_CLUTDATA RgbArray;
        !           750:         ULONG RgbLong;
        !           751:     } LookupTable[1];
        !           752: } VIDEO_CLUT, *PVIDEO_CLUT;
        !           753: 
        !           754: //
        !           755: //NumEntries - Number of entries in the LookupTable of color values.
        !           756: //
        !           757: //FirstEntry - Location in the device palette to which the first entry in the
        !           758: //    LookupTable of colors should be copied to. The other entries in the
        !           759: //    LookupTable should be copied sequentially, from this starting point into
        !           760: //    the device's palette.
        !           761: //
        !           762: //LookupTable - Array of color entries to copy into the device's color
        !           763: //    registers/palette. The color entries can be accessed as a genric 32 bit
        !           764: //    value or as Red/Green/Blue/Unused fields.
        !           765: //
        !           766: 
        !           767: //
        !           768: // NOTE: Cursor vs. Pointer:
        !           769: //    A cursor is a rectangular set of pixels which are used to indicate the
        !           770: //    location of input coming from the keyboard.
        !           771: //
        !           772: //    A pointer is the set of pixels that are used to paint the shape
        !           773: //    associated with the mouse.
        !           774: //
        !           775: 
        !           776: //
        !           777: // VIDEO_IOCTL_QUERY_CURSOR_POSITION - Returns the location of the cursor on
        !           778: //                                     the screen.
        !           779: //
        !           780: // VIDEO_IOCTL_SET_CURSOR_POSITION - Is used to set the location of the
        !           781: //                                   cursor on the screen.
        !           782: //
        !           783: // Information used by this function is passed using the following structure:
        !           784: //
        !           785: 
        !           786: typedef struct _VIDEO_CURSOR_POSITION {
        !           787:     SHORT Column;
        !           788:     SHORT Row;
        !           789: } VIDEO_CURSOR_POSITION, *PVIDEO_CURSOR_POSITION;
        !           790: 
        !           791: //
        !           792: //Column - Column on which the cursor is located from the top left, in pixels.
        !           793: //
        !           794: //Row - Row on which the cusor is located from the top left, in pixels.
        !           795: //
        !           796: 
        !           797: 
        !           798: //
        !           799: // VIDEO_IOCTL_QUERY_CURSOR_ATTR - Returns all attributes of the cursor.
        !           800: //
        !           801: // VIDEO_IOCTL_SET_CURSOR_ATTR - Is used to set the attributes of the cursor.
        !           802: //
        !           803: // Information used by this function is passed using the following structure:
        !           804: //
        !           805: 
        !           806: //
        !           807: // For the VGA:
        !           808: // TopScanLine will be stored in the height when an IOCTL is made
        !           809: // BottomScanLine will be stored in the width when an IOCTL is made
        !           810: //
        !           811: 
        !           812: typedef struct _VIDEO_CURSOR_ATTRIBUTES {
        !           813:     USHORT Width;
        !           814:     USHORT Height;
        !           815:     SHORT Column;
        !           816:     SHORT Row;
        !           817:     UCHAR Rate;
        !           818:     UCHAR Enable;
        !           819: } VIDEO_CURSOR_ATTRIBUTES, *PVIDEO_CURSOR_ATTRIBUTES;
        !           820: 
        !           821: //
        !           822: //Width - Width of the cursor, in pixels.
        !           823: //
        !           824: //Height - Height of the cursor, in scans.
        !           825: //
        !           826: //Column - Column on which the cursor is located from the top left, in pixels.
        !           827: //
        !           828: //Row - Row on which the cusor is located from the top left, in pixels.
        !           829: //
        !           830: //Rate - Rate at which the cursor whould flash.
        !           831: //
        !           832: //Enable - Non-zero to display cursor, 0 not to display.
        !           833: //
        !           834: 
        !           835: //
        !           836: // VIDEO_IOCTL_QUERY_POINTER_POSITION - Returns the location of the pointer
        !           837: //                                      on the screen
        !           838: //
        !           839: // VIDEO_IOCTL_SET_POINTER_POSITION - Is used to set the location of the
        !           840: //                                    pointer on the screen.
        !           841: //
        !           842: // Information used by this function is passed using the following structure:
        !           843: //
        !           844: 
        !           845: typedef struct _VIDEO_POINTER_POSITION {
        !           846:     SHORT Column;
        !           847:     SHORT Row;
        !           848: } VIDEO_POINTER_POSITION, *PVIDEO_POINTER_POSITION;
        !           849: 
        !           850: //
        !           851: //Column - Column on which the cursor is located from the top left, in pixels.
        !           852: //
        !           853: //Row - Row on which the cusor is located from the top left, in pixels.
        !           854: //
        !           855: 
        !           856: 
        !           857: //
        !           858: // VIDEO_IOCTL_QUERY_POINTER_ATTR - Returns all attributes of the pointer.
        !           859: //
        !           860: // VIDEO_IOCTL_SET_POINTER_ATTR - Is used to set the attributes of the
        !           861: //                                pointer.
        !           862: //
        !           863: // Information used by this function is passed using the following structure:
        !           864: //
        !           865: 
        !           866: typedef struct _VIDEO_POINTER_ATTRIBUTES {
        !           867:     ULONG Flags;
        !           868:     ULONG Width;
        !           869:     ULONG Height;
        !           870:     ULONG WidthInBytes;
        !           871:     ULONG Enable;
        !           872:     SHORT Column;
        !           873:     SHORT Row;
        !           874:     UCHAR Pixels[1];
        !           875: } VIDEO_POINTER_ATTRIBUTES, *PVIDEO_POINTER_ATTRIBUTES;
        !           876: 
        !           877: //
        !           878: //Flags - color or mono pointer, same as for query pointer capabilities.
        !           879: //
        !           880: //Width - Width of the pointer, in pixels.
        !           881: //
        !           882: //Height - Height of the pointer, in scans.
        !           883: //
        !           884: //WidthInBytes - Width of the pointer, in bytes.
        !           885: //
        !           886: //Enable - Non-zero to display pointer, 0 not to display.
        !           887: //
        !           888: //Column - Column on which the cursor is located from the top left, in pixels.
        !           889: //
        !           890: //Row - Row on which the cusor is located from the top left, in pixels.
        !           891: //
        !           892: //Pixels - Start of pointer data, in device-compatible DIB format.
        !           893: //    (Mask data is always in 1-bpp DIB format.)
        !           894: //
        !           895: 
        !           896: 
        !           897: //
        !           898: // VIDEO_IOCTL_QUERY_POINTER_CAPABILITIES - Returns capabilities of miniport
        !           899: //                                          hardware cursor
        !           900: //
        !           901: 
        !           902: typedef struct _VIDEO_POINTER_CAPABILITIES {
        !           903:     ULONG Flags;
        !           904:     ULONG MaxWidth;
        !           905:     ULONG MaxHeight;
        !           906:     ULONG HWPtrBitmapStart;
        !           907:     ULONG HWPtrBitmapEnd;
        !           908: } VIDEO_POINTER_CAPABILITIES, *PVIDEO_POINTER_CAPABILITIES;
        !           909: 
        !           910: //
        !           911: // Flag bit definitions
        !           912: //
        !           913: 
        !           914: #define VIDEO_MODE_ASYNC_POINTER  0x01 // 1 if the cursor can be updated
        !           915:                                        // asynchronously to drawing operations.
        !           916: #define VIDEO_MODE_MONO_POINTER   0x02 // 1 if a monochrome hardware pointer
        !           917:                                        // is supported.
        !           918: #define VIDEO_MODE_COLOR_POINTER  0x04 // 1 if a color hardware pointer is
        !           919:                                        // supported.
        !           920: #define VIDEO_MODE_ANIMATE_START  0x08 // The pointer being passed down has
        !           921: #define VIDEO_MODE_ANIMATE_UPDATE 0x10 // the same hotspot as the previous
        !           922:                                        // pointer
        !           923: 
        !           924: //
        !           925: //MaxWidth - Widest pointer bitmap the miniport should be requested to load
        !           926: //    for either monochrome or color pointer.
        !           927: //
        !           928: //MaxHeight - widest pointer bitmap the miniport should be requested to load
        !           929: //    for either monochrome color pointer handled.
        !           930: //
        !           931: //HWPtrBitmapStart = first offset in bitmap of memory used to store hardware
        !           932: //    pointer bitmap, in CPU-addressable units (-1 if not applicable). For
        !           933: //    planar modes (like VGA mode 12h), this is a planar offset; for linear
        !           934: //    modes (like VGA mode 13h), this is a linear offset. The CPU-addressable
        !           935: //    translation in HC planar mode is assumed to be linearaddress/4,
        !           936: //    because there are four planes at each address.
        !           937: //
        !           938: //HWPtrBitmapEnd = last offset in bitmap of memory used to store hardware
        !           939: //    pointer bitmap (-1 if not applicable).
        !           940: //
        !           941: // Note: Miniport has options to reject any call to set a pointer.
        !           942: //
        !           943: 
        !           944: 
        !           945: //
        !           946: // VIDEO_IOCTL_GET_BANK_SELECT_CODE - Called by the Windows display driver
        !           947: //                                    to get a block of executable code used
        !           948: //                                    to perform bank-switching in high
        !           949: //                                    resolution SVGA drivers.
        !           950: //
        !           951: // Gets information needed to implement banking control for a selected mode.
        !           952: //
        !           953: // Information used by this function is passed using the following structures:
        !           954: //
        !           955: 
        !           956: //
        !           957: // The input from the caller in the input buffer is a VIDEO_MODE structure, as
        !           958: // described under VIDEO_IOCTL_SET_CURRENT_MODE.
        !           959: //
        !           960: // RequestedMode - mode index for which banking information is desired.
        !           961: //
        !           962: 
        !           963: //
        !           964: // Returned in output buffer.
        !           965: //
        !           966: 
        !           967: typedef struct _VIDEO_BANK_SELECT {
        !           968:     ULONG Length;
        !           969:     ULONG Size;
        !           970:     ULONG BankingFlags;
        !           971:     ULONG BankingType;
        !           972:     ULONG PlanarHCBankingType;
        !           973:     ULONG BitmapWidthInBytes;
        !           974:     ULONG BitmapSize;
        !           975:     ULONG Granularity;
        !           976:     ULONG PlanarHCGranularity;
        !           977:     ULONG CodeOffset;
        !           978:     ULONG PlanarHCBankCodeOffset;
        !           979:     ULONG PlanarHCEnableCodeOffset;
        !           980:     ULONG PlanarHCDisableCodeOffset;
        !           981: } VIDEO_BANK_SELECT, *PVIDEO_BANK_SELECT;
        !           982: 
        !           983: //
        !           984: // Stored in the BankType and PlanarHCBankintType fields
        !           985: //
        !           986: 
        !           987: typedef enum _VIDEO_BANK_TYPE {
        !           988:     VideoNotBanked = 0,
        !           989:     VideoBanked1RW,
        !           990:     VideoBanked1R1W,
        !           991:     VideoBanked2RW,
        !           992:     NumVideoBankTypes
        !           993: } VIDEO_BANK_TYPE, *PVIDEO_BANK_TYPE;
        !           994: 
        !           995: //
        !           996: // Defines for BankingFlags.
        !           997: //
        !           998: 
        !           999: #define PLANAR_HC               0x00000001
        !          1000: 
        !          1001: //
        !          1002: //Note: planar high-color ("planar HC") mode is a special 8-bpp-and-up
        !          1003: //    CPU addressing mode in which four bytes can be accessed at
        !          1004: //    once by using the VGA's planar hardware.  This mode is enabled
        !          1005: //    by turning off the Chain4 bit (bit 3 in Sequence Controller
        !          1006: //    register 4), so it is also known as non-Chain4 mode.  Planar HC
        !          1007: //    mode can greatly accelerate operations such as solid fills,
        !          1008: //    some pattern fills, and some blits.
        !          1009: //
        !          1010: //Note: the term "CPU-addressable bytes" means offsets measured
        !          1011: //    in bytes as accessed by the CPU.  In 16-color modes, this
        !          1012: //    merely means "measured in bytes" rather than "measured in
        !          1013: //    pixels," where each byte contains 8 pixels, as usual.
        !          1014: //    In normal high-color modes, "CPU-addressable bytes"
        !          1015: //    is exactly what you'd expect; it's the number of pixels in 256
        !          1016: //    color modes, pixels*2 in 16-bpp modes, and so on.  However, in
        !          1017: //    planar HC modes, there are four display memory bytes at every CPU-
        !          1018: //    addressable byte, because four planes are at each address, so
        !          1019: //    in 256 color modes the number of CPU-addressable bytes is
        !          1020: //    pixels/4, in 16-bpp modes CPU-addressable bytes = pixels/2, and
        !          1021: //    so on.  Basically, "CPU-addressable bytes" just means the
        !          1022: //    offsets the CPU needs to address banks properly in the
        !          1023: //    specified mode.
        !          1024: //
        !          1025: //Note: the start address must be set to 0 (displayed pixels must
        !          1026: //    start at offset 0 in display memory), and the banking windows
        !          1027: //    must fit within the 64K area starting at A000:0; no 128K
        !          1028: //    mappings, please, because there may be a monochrome adapter
        !          1029: //    in the system.
        !          1030: //
        !          1031: //Length - Length of the basic structure. Used for versioning by checking the
        !          1032: //    Length of the struct is at least as large as the valuegiven by sizeof().
        !          1033: //
        !          1034: //Size - number of bytes required to hold all banking information for
        !          1035: //    this mode, including the VIDEO_BANK_SELECT structure and all
        !          1036: //    bank-switch code.  This is the size of the buffer that
        !          1037: //    VgaGetBankSelectCode requires in order properly to return info.
        !          1038: //
        !          1039: //BankingFlags - indicate the type of banking supported in this mode.
        !          1040: //    PLANAR_HC - if set, indicates that planar high-color (HC) mode
        !          1041: //          (non-Chain4 8-, 15-, 16-, 24-, and 32-bpp) is supported.
        !          1042: //          If this bit is set, the following fields must be filled in:
        !          1043: //              PlanarHCGranularity, pPlanarHCBankCode,
        !          1044: //              pPlanarHCEnableCode, pPlanarHCDisableCode.
        !          1045: //          This bit is ignored by the 16-color driver, as are the
        !          1046: //          associated fields.
        !          1047: //
        !          1048: //BankingType - These are the banking types supported by the adapter
        !          1049: //    when it is ina standard mode.
        !          1050: //
        !          1051: //    VideoNotBanked - this mode does not support or require banking.
        !          1052: //    VideoBanked1RW - this mode supports a single RW (readable and
        !          1053: //        writable) banking window.  The window is assumed to be
        !          1054: //        64K in size.
        !          1055: //    VideoBanked1R1W - this mode supports a single window, but the
        !          1056: //        window can be mapped to different areas of display memory
        !          1057: //        for reads and for writes.  The window is assumed to be
        !          1058: //        64K in size.
        !          1059: //    VideoBanked2RW - this mode supports two independently mappable
        !          1060: //        banking windows, each RW.  Each window is assumed to be
        !          1061: //        32K in size.  The second window is assumed
        !          1062: //        to start immediately after the end of the first, at
        !          1063: //        A000:8000.
        !          1064: //
        !          1065: //PlanarHCBankingType - These are the banking types supported by the
        !          1066: //    adapter when it is in a PLANAR HC mode.
        !          1067: //
        !          1068: //    See BankingType for defintions of each banking type.
        !          1069: //
        !          1070: //
        !          1071: //BitmapWidthInBytes - distance from start of one scan line to start
        !          1072: //    of next, counted in CPU-addressable bytes (not pixels).  The
        !          1073: //    CPU-addressable distance from one scan line to the next is
        !          1074: //    assumed to be BitmapWidthInBytes/4 in planar HC modes, because
        !          1075: //    there are four planes at each address.
        !          1076: //
        !          1077: //BitmapSize - size of display memory in CPU-addressable bytes (for
        !          1078: //    example, 256K on a 1 Mb SVGA in 16-color mode, because there
        !          1079: //    are four bytes at each address).  The CPU-addressable bitmap
        !          1080: //    size is assumed to be BitmapSize/4 in planar HC modes, because
        !          1081: //    there are four planes at each address.
        !          1082: //
        !          1083: //Granularity - granularity with which display memory may be mapped
        !          1084: //    into a banking window.  (That is, resolution with which the
        !          1085: //    display memory address mapped to the start of a window may be
        !          1086: //    set; anywhere from 1K to 64K, depending on the adapter.  If
        !          1087: //    Granularity < window size (either 64K or 32K), then adjacent
        !          1088: //    banks can overlap, and broken rasters can always be avoided.
        !          1089: //    If Granularity == window size, then banks are disjoint, and
        !          1090: //    display memory is basically segmented into banks.)  Granularity
        !          1091: //    is measured in CPU-addressable bytes.
        !          1092: //
        !          1093: //PlanarHCGranularity - granularity with which display memory may be
        !          1094: //    mapped into a banking window in planar HC mode.
        !          1095: //    PlanarHCGranularity is measured in CPU-addressable bytes, and
        !          1096: //    is typically but not always Granularity/4.  Ignored in
        !          1097: //    16-color modes.
        !          1098: //
        !          1099: //CodeOffset - base of the code section in the structure.
        !          1100: //
        !          1101: //PlanarHCBankCodeOffset - offset from Code of executable code
        !          1102: //    that performs planar HC mode bank switching.  Ignored in
        !          1103: //    16-color modes.
        !          1104: //
        !          1105: //PlanarHCEnableCodeOffset - offset from Code of executable code
        !          1106: //    that enables planar HC mode.  Ignored in 16-color modes.
        !          1107: //
        !          1108: //PlanarHCDisableCodeOffset - offset from Code of executable code
        !          1109: //    that disables planar HC mode.  Ignored in 16-color modes.
        !          1110: //
        !          1111: //Specification for bank switch code at Code:
        !          1112: //    Executes requested bank mappings.
        !          1113: //
        !          1114: //    Input:
        !          1115: //      EAX = bank number to which to map window #0
        !          1116: //      EBX = bank number to which to map window #1
        !          1117: //      interpreted according to BankingType as follows:
        !          1118: //        VideoBanked1RW - the single window is mapped to bank EAX,
        !          1119: //            EBX is ignored.
        !          1120: //        VideoBanked1RW - the read window is mapped to bank EAX,
        !          1121: //            the write window is mapped to bank EBX
        !          1122: //        VideoBanked1R1W - the window at A000:0 is mapped to bank EAX,
        !          1123: //            the window at A800:0 is mapped to bank EBX
        !          1124: //
        !          1125: //    Output: none
        !          1126: //
        !          1127: // Note: the definition of "bank n" is the bank that starts at
        !          1128: //    display memory offset Granularity*n.  In other words,
        !          1129: //    banks are assumed to start every Granularity CPU-addressable
        !          1130: //    bytes, and are numbered from 0 to number of banks-1.
        !          1131: //
        !          1132: //Specification for planar HC executable code:
        !          1133: //    ***To be filled in when we get to planar HC modes***
        !          1134: //
        !          1135: 
        !          1136: 
        !          1137: //
        !          1138: // VIDEO_IOCTL_MAP_VIDEO_MEMORY - Maps the frame buffer into the callers
        !          1139: //                                address space.
        !          1140: // VIDEO_IOCTL_UNMAP_VIDEO_MEMORY - Unmaps the frame buffer from the callers
        !          1141: //                                  address space.
        !          1142: //
        !          1143: // Information used by this function is passed using the following structure:
        !          1144: //
        !          1145: 
        !          1146: typedef struct _VIDEO_MEMORY {
        !          1147:     PVOID RequestedVirtualAddress;
        !          1148: } VIDEO_MEMORY, *PVIDEO_MEMORY;
        !          1149: 
        !          1150: //
        !          1151: //RequestedVirtualAddress - For MAP: Requested virtual address for the video
        !          1152: //    memory. This value is optional. If zero is specified, the operating
        !          1153: //    system will choose an appropriate location.  For UNMAP: Virtual Address
        !          1154: //    of the base of video memory. The size is implicit since it can not
        !          1155: //    change (you can not add video memory dynamically!).
        !          1156: //
        !          1157: 
        !          1158: //
        !          1159: // VIDEO_IOCTL_MAP_VIDEO_MEMORY - Returns the virtual address and size of
        !          1160: //                                the frame buffer and video memory in the
        !          1161: //                                caller's address space.
        !          1162: //                                This IOCTL must be called after a call
        !          1163: //                                to the MAP IOCTL has been made.
        !          1164: //
        !          1165: 
        !          1166: typedef struct _VIDEO_MEMORY_INFORMATION {
        !          1167:     PVOID VideoRamBase;
        !          1168:     ULONG VideoRamLength;
        !          1169:     PVOID FrameBufferBase;
        !          1170:     ULONG FrameBufferLength;
        !          1171: } VIDEO_MEMORY_INFORMATION, *PVIDEO_MEMORY_INFORMATION;
        !          1172: 
        !          1173: //
        !          1174: //VideoRamBase - Virtual address of the Video RAM in the callers address space
        !          1175: //    (only valid if the memory is mapped.
        !          1176: //
        !          1177: //VideoRamLength - Linear length of the Video RAM in the caller's virtual
        !          1178: //    address space (memory accessible through a bank switch mechanism is not
        !          1179: //    described by this value).
        !          1180: //    This value must be equal to VideoMemoryBitmapHeight * ScreenStride
        !          1181: //
        !          1182: //FrameBufferBase - Virtual address of the Frame Buffer in the caller's
        !          1183: //    address space. The Frame buffer is the actively displayed part of Video
        !          1184: //    Ram.
        !          1185: //
        !          1186: //FrameBufferLength - Linear length of the Frame Buffer in the caller's
        !          1187: //    virtual address space (memory accessible through a bank switch mechanism
        !          1188: //    is not described by this value).
        !          1189: //    This value must be equal to VisScreenWidth * ScreenStride
        !          1190: //
        !          1191: 
        !          1192: 
        !          1193: //
        !          1194: // IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES - Returns the access range used to
        !          1195: //                                          program the hardware directly.
        !          1196: //                                          An array of these is returned if
        !          1197: //                                          multiple ranges exist.
        !          1198: //
        !          1199: // IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES - Frees up the access ranges that were
        !          1200: //                                         allocated by the QUERY_ACCESS_RANGES
        !          1201: //                                         call.
        !          1202: //
        !          1203: // Information used by this function is passed using the following structure:
        !          1204: //
        !          1205: 
        !          1206: typedef struct _VIDEO_PUBLIC_ACCESS_RANGES {
        !          1207:     ULONG InIoSpace;
        !          1208:     ULONG MappedInIoSpace;
        !          1209:     PVOID VirtualAddress;
        !          1210: } VIDEO_PUBLIC_ACCESS_RANGES, *PVIDEO_PUBLIC_ACCESS_RANGES;
        !          1211: 
        !          1212: //
        !          1213: //InIoSpace - Indicates if the hardware registers or ports are in IO space
        !          1214: //    or in memory space.
        !          1215: //
        !          1216: //MappedInIoSpace - Indicates if under the current platform the registers or
        !          1217: //    ports are mapped in IO Space or memory space.
        !          1218: //
        !          1219: //VirtualAddress - Location of the registers or IO ports as mapped under the
        !          1220: //    current architecture.
        !          1221: //
        !          1222: 
        !          1223: 
        !          1224: //
        !          1225: // IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES - Returns the color information
        !          1226: //                                        found in the monitors VDDPs
        !          1227: //                                        description file.
        !          1228: //
        !          1229: // NOTE: This structure must be filled out completely. A subset of the
        !          1230: //         values can not be returned.
        !          1231: //
        !          1232: 
        !          1233: typedef struct _VIDEO_COLOR_CAPABILITIES {
        !          1234:     ULONG Length;
        !          1235:     ULONG AttributeFlags;
        !          1236:     LONG  RedPhosphoreDecay;
        !          1237:     LONG  GreenPhosphoreDecay;
        !          1238:     LONG  BluePhosphoreDecay;
        !          1239:     LONG  WhiteChromaticity_x;
        !          1240:     LONG  WhiteChromaticity_y;
        !          1241:     LONG  WhiteChromaticity_Y;
        !          1242:     LONG  RedChromaticity_x;
        !          1243:     LONG  RedChromaticity_y;
        !          1244:     LONG  GreenChromaticity_x;
        !          1245:     LONG  GreenChromaticity_y;
        !          1246:     LONG  BlueChromaticity_x;
        !          1247:     LONG  BlueChromaticity_y;
        !          1248:     LONG  WhiteGamma;
        !          1249:     LONG  RedGamma;
        !          1250:     LONG  GreenGamma;
        !          1251:     LONG  BlueGamma;
        !          1252: } VIDEO_COLOR_CAPABILITIES, *PVIDEO_COLOR_CAPABILITIES;
        !          1253: 
        !          1254: //
        !          1255: // Flag Bit definitions
        !          1256: //
        !          1257: 
        !          1258: #define VIDEO_DEVICE_COLOR          0x1   // Is this device support color (1)
        !          1259:                                           // or monochrome only
        !          1260: #define VIDEO_OPTIONAL_GAMMET_TABLE 0x2   // Indicates that a gammet table can
        !          1261:                                           // be queried/set for the device
        !          1262:                                           // use other IOCTLs for that purpose.
        !          1263: //
        !          1264: //Length - Length of the basic structure. Used for versioning by checking the
        !          1265: //    Length of the struct is at least as large as the value given by sizeof().
        !          1266: //
        !          1267: //AttributesFlag - List of falgs determining some of the properties of the
        !          1268: //    device.
        !          1269: //
        !          1270: //See the VDDP documentation for the details on the various fields
        !          1271: //
        !          1272: //RedPhosphoreDecay
        !          1273: //GreenPhosphoreDecay
        !          1274: //BluePhosphoreDecay -
        !          1275: //
        !          1276: //WhiteChromaticity_x
        !          1277: //WhiteChromaticity_y
        !          1278: //WhiteChromaticity_Y -
        !          1279: //
        !          1280: //RedChromaticity_x
        !          1281: //RedChromaticity_y
        !          1282: //GreenChromaticity_x
        !          1283: //GreenChromaticity_y
        !          1284: //BlueChromaticity_x
        !          1285: //BlueChromaticity_y -
        !          1286: //
        !          1287: //WhiteGamma -
        !          1288: //
        !          1289: //RedGamma
        !          1290: //GreenGamma
        !          1291: //BlueGamma -
        !          1292: //
        !          1293: //All values returned in this structure are integers.
        !          1294: //The values returned must be floating point values * 10,000; i.e:
        !          1295: //a gamma of 2.34 would be returned as 23400.
        !          1296: //

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.