/*++ Copyright (c) 2003 Aleksandrov O.E. All rights Reserved Module Name: mi1201.h Abstract: Include file for MI1201-AGM Port I/O Driver ******************************************************** ORIGINATED from Copyright (c) 1990-2000 Microsoft Corporation, All Rights Reserved Abstract: Include file for Generic Port I/O Example Driver Author: Robert R. Howell January 8, 1993 Revision History: Robert B. Nelson (Microsoft) March 1, 1993 --*/ #if !defined(__MI1201IOCTL_H__) #define __MI1201IOCTL_H__ // Символическое имя драйвера в файловой системе, устанавливаемое при загрузке #define DOS_DEVICE_NAME L"\\??\\MI1201_Dev" // ?? эквивалентно DosDevices // Имя, использовавшееся предыдущей версией драйвера, устанавливается при загрузке для совместимости #define OLD_DOS_DEVICE_NAME L"\\DosDevices\\PortIODev" // !!! Вы должны использовать вызов CreateFile(\\??\\MI1201_Dev", ..., чтобы получить доступ к драйверу // Символическое имя драйвера, устанавливаемое при загрузке #define GPD_DEVICE_NAME L"\\Device\\MI1201_0" // // Define the IOCTL codes we will use. The IOCTL code contains a command // identifier, plus other information about the device, the type of access // with which the file must have been opened, and the type of buffering. // // // Device type -- in the "User Defined" range." // #define GPD_TYPE 40000 // The IOCTL function codes from 0x800 to 0xFFF are for customer use. #define IOCTL_GPD_READ_PORT_UCHAR \ CTL_CODE( GPD_TYPE, 0x900, METHOD_BUFFERED, FILE_READ_ACCESS ) #define IOCTL_GPD_READ_PORT_USHORT \ CTL_CODE( GPD_TYPE, 0x901, METHOD_BUFFERED, FILE_READ_ACCESS ) #define IOCTL_GPD_READ_PORT_ULONG \ CTL_CODE( GPD_TYPE, 0x902, METHOD_BUFFERED, FILE_READ_ACCESS ) // Чтение нескольких значений из ПОРТА #define IOCTL_GPD_READ_PORT_BUFFER \ CTL_CODE( GPD_TYPE, 0x903, METHOD_BUFFERED, FILE_READ_ACCESS ) // Ожидание на ПОРТу #define IOCTL_GPD_WAIT_ON_PORT \ CTL_CODE( GPD_TYPE, 0x904, METHOD_BUFFERED, FILE_READ_ACCESS ) #define IOCTL_GPD_WRITE_PORT_UCHAR \ CTL_CODE(GPD_TYPE, 0x910, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_GPD_WRITE_PORT_USHORT \ CTL_CODE(GPD_TYPE, 0x911, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_GPD_WRITE_PORT_ULONG \ CTL_CODE(GPD_TYPE, 0x912, METHOD_BUFFERED, FILE_WRITE_ACCESS) // Запись нескольких значений в ПОРТ #define IOCTL_GPD_WRITE_PORT_BUFFER \ CTL_CODE( GPD_TYPE, 0x913, METHOD_BUFFERED, FILE_WRITE_ACCESS ) // Запись в порт1 + ожидание на ПОРТу 2 #define IOCTL_GPD_WRITE_AND_WAIT_ON_PORT \ CTL_CODE( GPD_TYPE, 0x914, METHOD_BUFFERED, FILE_WRITE_ACCESS ) // Проверка корректности входного буфера для MULTIFUNCTION_IO_OPERATION #define IOCTL_GPD_MULTIFUNCTION_IO_OPERATION_CHECK_INPUT_BUFFER \ CTL_CODE( GPD_TYPE, 0x915, METHOD_BUFFERED, FILE_READ_ACCESS ) // MULTIFUNCTION_IO_OPERATION #define IOCTL_GPD_MULTIFUNCTION_IO_OPERATION \ CTL_CODE( GPD_TYPE, 0x916, METHOD_BUFFERED, FILE_WRITE_ACCESS ) typedef struct _GENPORT_WRITE_INPUT { ULONG PortNumber; // Port # to write to union { // Data to be output to port ULONG LongData; USHORT ShortData; UCHAR CharData; }; } GENPORT_WRITE_INPUT, *PGENPORT_WRITE_INPUT; // ---------- Новый вариант драйвера ---------------- typedef struct _LSHUnion { union { ULONG ULong; USHORT UShort; UCHAR UChar; LONG Long; SHORT Short; CHAR Char; }; } tLSHUnion, *PLSHUnion; typedef struct _LSHArrayUnion { union { ULONG ULong[1]; USHORT UShort[1]; UCHAR UChar[1]; LONG Long[1]; SHORT Short[1]; CHAR Char[1]; }; } tLSHArrayUnion, *PLSHArrayUnion; // Чтение ------------------------- typedef struct _GENPORT_READ_OUTPUT_BUFFER { tLSHUnion Data; // Данные считанные с порта } GENPORT_READ_OUTPUT_BUFFER , *PGENPORT_READ_OUTPUT_BUFFER; typedef struct _GENPORT_READ_INTPUT_BUFFER { ULONG PortNumber; // Port # to read from } GENPORT_READ_INTPUT_BUFFER, *PGENPORT_READ_INTPUT_BUFFER; typedef struct _GENPORT_READ_INPUT_OUTPUT_BUFFER { union { GENPORT_READ_INTPUT_BUFFER Input; // Данные по порту GENPORT_READ_OUTPUT_BUFFER Output; // Данные считанные с порта }; } GENPORT_READ_INPUT_OUTPUT_BUFFER, *PGENPORT_READ_INPUT_OUTPUT_BUFFER; typedef struct _GENPORT_READ_MULTI_OUTPUT_BUFFER_HEADER { ULONG Count; // Количество считанных значений } GENPORT_READ_MULTI_OUTPUT_BUFFER_HEADER, *PGENPORT_READ_MULTI_OUTPUT_BUFFER_HEADER; typedef struct _GENPORT_READ_MULTI_OUTPUT_BUFFER { GENPORT_READ_MULTI_OUTPUT_BUFFER_HEADER Header; // Заголовок tLSHArrayUnion Data; // Данные считанные с порта } GENPORT_READ_MULTI_OUTPUT_BUFFER, *PGENPORT_READ_MULTI_OUTPUT_BUFFER; // тип порта #define myPORT_UCHAR 0 #define myPORT_USHORT 1 #define myPORT_ULONG 2 typedef struct _GENPORT_READ_MULTI_INPUT_BUFFER { ULONG Port; // Port # to read from UCHAR PortType; // 0 - byte; 1 - word; 2 - dword ULONG Count; // Количество значений для считывания } GENPORT_READ_MULTI_INPUT_BUFFER, *PGENPORT_READ_MULTI_INPUT_BUFFER; typedef struct _GENPORT_READ_MULTI_INPUT_OUTPUT_BUFFER { union { GENPORT_READ_MULTI_INPUT_BUFFER Input; // Данные по порту GENPORT_READ_MULTI_OUTPUT_BUFFER Output; // Данные считанные с порта }; } GENPORT_READ_MULTI_INPUT_OUTPUT_BUFFER, *PGENPORT_READ_MULTI_INPUT_OUTPUT_BUFFER; // Запись ------------------------- typedef struct _GENPORT_WRITE_INPUT_BUFFER { ULONG Port; // Port # to write to tLSHUnion Data; // Data to be output to port } GENPORT_WRITE_INPUT_BUFFER, *PGENPORT_WRITE_INPUT_BUFFER; typedef struct _GENPORT_WRITE_MULTI_INPUT_BUFFER_HEADER { ULONG Port; // Port # to write to UCHAR PortType; // 0 - byte; 1 - word; 2 - dword ULONG Count; // Количество значений для считывания } GENPORT_WRITE_MULTI_INPUT_BUFFER_HEADER, *PGENPORT_WRITE_MULTI_INPUT_BUFFER_HEADER; typedef struct _GENPORT_WRITE_MULTI_INPUT_BUFFER { GENPORT_WRITE_MULTI_INPUT_BUFFER_HEADER Header; // Port # to write to tLSHArrayUnion Data; // Данные, записиваемые в порт } GENPORT_WRITE_MULTI_INPUT_BUFFER, *PGENPORT_WRITE_MULTI_INPUT_BUFFER; typedef struct _GENPORT_WRITE_MULTI_OUTPUT_BUFFER_HEADER { ULONG XXX; // ЗАГЛУШКА } GENPORT_WRITE_MULTI_OUTPUT_BUFFER_HEADER, *PGENPORT_WRITE_MULTI_OUTPUT_BUFFER_HEADER; typedef struct _GENPORT_WRITE_MULTI_OUTPUT_BUFFER { GENPORT_WRITE_MULTI_OUTPUT_BUFFER_HEADER Header; // Заголовок } GENPORT_WRITE_MULTI_OUTPUT_BUFFER, *PGENPORT_WRITE_MULTI_OUTPUT_BUFFER; typedef struct _GENPORT_WRITE_MULTI_INPUT_OUTPUT_BUFFER { union { GENPORT_WRITE_MULTI_INPUT_BUFFER Input; // Данные для вывода в порт GENPORT_WRITE_MULTI_OUTPUT_BUFFER Output; }; } GENPORT_WRITE_MULTI_INPUT_OUTPUT_BUFFER, *PGENPORT_WRITE_MULTI_INPUT_OUTPUT_BUFFER; // Ожидание ------------------------- typedef enum _tPortWaitResult { pwrSUCCESS, // дождались pwrTIMEOUT, // таймаут pwrABANDONED // ожидание прервано } tPortWaitResult; // Результат ожидания события // но не менее 1 раза typedef struct _GENPORT_WAIT_OUTPUT_BUFFER { BOOLEAN Event; // Результат ожидания: TRUE - дождались. ULONG WaitResult; // Результат ожидания, см. myPORT_WAIT_xxx ULONG TimeOut; // Реальное время, затраченное на ожидание в мс, // если установлен wcfReturnWaitIntervalIn100nanosecUnit, то в единицах 100 наносекунд ULONG Data; // последние данные, считанные с порта } GENPORT_WAIT_OUTPUT_BUFFER, *PGENPORT_WAIT_OUTPUT_BUFFER; // Флаги управления ожиданием (номера битов) typedef enum _tWaitControlFlag { wcfUserRequest, // запрос пользователя, иначе [Executive] wcfUserMode, // ожидать в режиме UserMode, иначе [KernelMode] wcfAlertable, // ожидание можно прервать, иначе [FALSE] wcfWaitOnAPC_Level, // ТОЛЬКО WriteAndWaitOnPort ожидание на IRQL=APC_LEVEL wcfWaitOnDISPATCH_Level, // ТОЛЬКО WriteAndWaitOnPort ожидание на IRQL=DISPATCH_LEVEL wcfAllowZeroResolution, // разрешить ожидание с 0 разрешением wcfUseQueryPerformanceCounter, // ТОЛЬКО WriteAndWaitOnPort использовать KeQueryPerformanceCounter для определения времени ожидания wcfReturnWaitIntervalIn100nanosecUnit // ТОЛЬКО WriteAndWaitOnPort возвратить данные ожидания в единицах 100 наносекунд } tWaitControlFlag; #define bit_wcfUserRequest (1<