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




Рабочая процедура обработки IOCTL запросов - часть 3


errDetected=1; }; #if DBG DbgPrint("-Example- Value of x is %X.",x); if(errDetected) DbgPrint("-Example- Except detected in Example driver."); #endif break; }

#ifndef SMALL_VERSION case IOCTL_TOUCH_PORT_378H: { unsigned short ECRegister = 0x378+0x402; #if DBG DbgPrint("-Example- IOCTL_TOUCH_PORT_378H."); #endif // Пробуем программно перевести параллельный порт 378, // сконфигурированный средствами BIOS как ECP+EPP, в // режим EPP. _asm { mov dx,ECRegister ; xor al,al ; out dx,al ; Установить EPP mode 000 mov al,095h ; Биты 7:5 = 100 out dx,al ; Установить EPP mode 100 } // Подобные действия в приложении пользовательского // режима под NT обязательно привело бы к аварийной // выгрузке приложения с сообщением об ошибке! // Практически эти пять строк демонстрируют, что можно // работать с LPT портом под Windows NT ! break; }

case IOCTL_SEND_BYTE_TO_USER: { // Размер данных, поступивших от пользователя: ULONG InputLength = //только лишь для примера IrpStack->Parameters.DeviceIoControl.InputBufferLength; // Размер буфера для данных, ожидаемых пользователем ULONG OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; #if DBG DbgPrint("-Example- Buffer outlength %d",OutputLength); #endif

if( OutputLengthAssociatedIrp.SystemBuffer; #if DBG DbgPrint("-Example- Method : BUFFERED."); #endif } else if (method==METHOD_NEITHER) { buff=(unsigned char*)Irp->UserBuffer; #if DBG DbgPrint("-Example- Method : NEITHER."); #endif } else { #if DBG DbgPrint("-Example- Method : unsupported."); #endif status = STATUS_INVALID_DEVICE_REQUEST; break; } #if DBG DbgPrint("-Example- Buffer address is %08X",buff); #endif *buff=33; // Любимое число Штирлица BytesTxd = 1; // Передали 1 байт break; } #endif // SMALL_VERSION // Ошибочный запрос (код IOCTL, который не обрабатывается): default: status = STATUS_INVALID_DEVICE_REQUEST; } // Освобождение спин-блокировки KeReleaseSpinLock(&MySpinLock,irql);




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