Windows - статьи



ШАГ - часть 2


Код представляет собой 32-разрядное слово и строится по определенному правилу, которое учитывает тип устройства, вид и метод доступа. Не вдаваясь в подробности, перечислим значения кодов для управления параллельным портом и их идентификаторы, принятые в Microsoft.

Идентификатор кода IOCTL Значение кода

IOCTL_IEEE1284_GET_MODE $160014
IOCTL_IEEE1284_NEGOTIATE $160018
IOCTL_PAR_GET_DEFAULT_MODES $160028
IOCTL_PAR_GET_DEVICE_CAPS $160024
IOCTL_PAR_IS_PORT_FREE $160054
IOCTL_PAR_QUERY_DEVICE_ID $16000C
IOCTL_PAR_QUERY_DEVICE_ID_SIZE $160010
IOCTL_PAR_QUERY_INFORMATION $160004
IOCTL_PAR_QUERY_LOCATION $160058
IOCTL_PAR_QUERY_RAW_DEVICE_ID $160030
IOCTL_PAR_SET_INFORMATION $160008
IOCTL_PAR_SET_READ_ADDRESS $160020
IOCTL_PAR_SET_WRITE_ADDRESS $16001C
IOCTL_SERIAL_GET_TIMEOUTS $1B001C
IOCTL_SERIAL_SET_TIMEOUTS $1B0020

Обращаю внимание читателя, что статья приготовлена для сайта Delphi, поэтому все примеры кода и т.п. приводятся на Паскале. Коды в таблице указаны в шестнадцатеричном формате (т.е. 0х160014 и т.д.).

Код IOCTL_IEEE1284_GET_MODE предназначен для формирования запроса текущего режима порта:

const IOCTL_IEEE1284_GET_MODE = $160014;

type PARCLASS_NEGOTIATION_MASK = record usReadMask: word; usWriteMask: word; end; PPARCLASS_NEGOTIATION_MASK = ^PARCLASS_NEGOTIATION_MASK;

var Mode: PARCLASS_NEGOTIATION_MASK; lpOverlapped: POverlapped; ret: DWORD;

DeviceIoControl(hLpt, IOCTL_IEEE1284_GET_MODE, nil, 0, @Mode, sizeof(PARCLASS_NEGOTIATION_MASK), ret, lpOverlapped);

Если запрос синхронный, то он выглядит так:

DeviceIoControl(hLpt, IOCTL_IEEE1284_GET_MODE, nil, 0, @Mode, sizeof(PARCLASS_NEGOTIATION_MASK), ret, nil);

@Mode - указатель на буфер, в котором драйвер возвращает текущий режим. Следующий параметр сообщает драйверу размер буфера, а параметр ret возвращает размер структуры, через которую передаются данные. Структура PARCLASS_NEGOTIATION_MASK имеет два поля: usReadMask - определяет режим работы порта при чтении, а usWriteMask - при записи.


Содержание  Назад  Вперед