Программирование драйверов Windows


Модификация приложения для тестирования драйвера


Тестирующее консольное приложение не так сильно изменилось, за исключением переписывания кода на использование вызовов DeviceIoControl

и организации ожидания вызовом WaitForSingleObject.

//======================================================================= // Файл тестовой программы test.cpp //=======================================================================

#include &#60windows.h&#62 #include &#60stdio.h&#62 #include "winioctl.h"

#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) int ReadWrite(HANDLE devHandle); #define BUFFSIZE (17) static unsigned char outBuffer[BUFFSIZE], inBuffer[BUFFSIZE*2]; static HANDLE devHandle, hEvent;

int __cdecl main() { printf("\n\n\n\n\nParallel Port CheckIt Loopback Device Test Program.\n" ); devHandle = CreateFile( "\\\\.\\LPTPORT0", GENERIC_READ | GENERIC_WRITE, 0, // share mode none NULL, // no security OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); // no template

if ( devHandle == INVALID_HANDLE_VALUE ) { printf("Error: can not open device PLPTPORT0. Win32 errno %d\n", GetLastError() ); return -1; } printf("Congratulation. LPTPORT0 device is open.\n\n"); //========================================== // Получение доступа к объекту события, // создаваемому в драйвере DWORD bytesRead; if ( !DeviceIoControl(devHandle, IOCTL_TAKE_EVENT, NULL, 0, // отправляем в драйвер &hEvent, sizeof(HANDLE), // получаем из драйвера &bytesRead, NULL ) ) { printf("Error during IOCTL_TAKE_EVENT: errno %d.\n", GetLastError() ); CloseHandle(devHandle); return -1; } printf("\nEvent handle = %04X(hex)\n", hEvent); //========================================== // Заполнение буфера данными: DWORD i=3,j=0; for ( ; j&#60sizeof(outBuffer); ) outBuffer[j++] = (unsigned char)i++; //========================================== ReadWrite(devHandle); //========================================== // Завершение работы if ( !DeviceIoControl(devHandle, IOCTL_CLOSE_EVENT, NULL, 0, // отправляем в драйвер NULL, 0, // получаем из драйвера &bytesRead, NULL ) ) { printf("\nError during IOCTL_CLOSE_EVENT: errno %d.\n", GetLastError() ); } else printf("\nEvent handle is normally closed.\n");




Начало  Назад  Вперед