[Previous] [Next]

Заголовочный файл Driver.h

В заголовочном файле, относящемся ко второму варианту драйвера, также описывается структура расширения объекта устройства, которую разработчик драйвера всегда определяет самостоятельно.

Дополнительно (по сравнению с первой версией драйвера) введены определения пользовательских (задаваемых разработчиком драйвера) IOCTL кодов, предназначенных для применения при вызове Win32 функции DeviceIoControl в тестирующем приложении.

Кроме того, в структуру расширения устройства внесены поля pEvent и hEvent, предназначенные для хранения указателя на объект и дескриптора соответственно, описывающие событие, совместно используемые драйвером и тестирующим приложением для обеспечения синхронизации по моменту окончания вывода всех данных в порт.

//=============================================================================
// Driver.h - заголовочный файл для драйвера обслуживания заглушки CheckIt
// ( Вариант 2 )
// By SVP, 21 June 2004
//=============================================================================
#pragma once
extern "C" {
#include <NTDDK.h>
}
#define MAX_BUFFER_SIZE (32)
#define IOCTL_SEND_TO_PORT          CTL_CODE( \
	FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SEND_TO_USER          CTL_CODE( \
	FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_TAKE_EVENT            CTL_CODE( \
	FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_CLOSE_EVENT            CTL_CODE( \
	FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)

typedef struct _DEVICE_EXTENSION
{
	PDEVICE_OBJECT  pDevice;
	UNICODE_STRING  ustrDeviceName;	 // внутреннее имя устройства
	UNICODE_STRING  ustrSymLinkName; // внешнее имя (символьная ссылка)
	UCHAR byteToBeOutToPort,         // следующий передаваемый байт данных
	      deviceInBuffer[MAX_BUFFER_SIZE]; // данные, полученные из порта

	ULONG  xferCount; // получено (байт) из порта и не передано клиенту
	//=============================================
	// Только для применения в операциях передачи данных клиенту драйвера:
	PUCHAR pUserBuffer;
	ULONG  xferSize;
	//=============================================
	PUCHAR portBase;// адрес порта ввода/вывода
	ULONG  Irq;     // Irq в терминах шины ISA для параллельного порта
	//=============================================
	PKINTERRUPT pIntObj;  // interrupt object
	//=============================================
	PKEVENT pEvent; // event object - объект события
	HANDLE  hEvent; // представления объекта события через дескриптор
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

// Маски для выделения бит в регистре управления:
#define CR_NOT_RST  0x04   // CR.2 - 0 Reset printer
#define CR_INT_ENB  0x10   // CR.4 - 1 Interrupt enable
#define CR_DEFAULT  0xC0   // неиспользуемые биты

// Макроопределения для записи и чтения в параллельный порт
#define DATA_REG          0
#define STATUS_REG        1
#define CONTROL_REG       2

#define WriteControlRegister( pDeviceExtension, byte )   \
     ( WRITE_PORT_UCHAR( pDeviceExtension->portBase + CONTROL_REG, byte ) )
#define WriteDataRegister( pDeviceExtension, byte )      \
     ( WRITE_PORT_UCHAR( pDeviceExtension->portBase + DATA_REG, byte ) )
#define ReadStatusRegister( pDeviceExtension )           \
     ( READ_PORT_UCHAR( pDeviceExtension->portBase + STATUS_REG ) )