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


Исполняемый код драйвера - часть 12


#if DBG==1 KIRQL currentIrql = KeGetCurrentIrql(); DbgPrint("LPTPORT: We are now in DpcForIsr, currentIrql=%d xferCount = %d\n", currentIrql, pDevExt-&#62xferCount ); #endif

if( currentByteNumToWriteToPort &#62 0 ) // &#60- т.е. уже были передачи { // Безопасно читаем следующий байт из устройства: KeSynchronizeExecution( pDevExt-&#62pIntObj, ReadDataSafely, pDevExt ); } if ( currentByteNumToWriteToPort &#60 total ) { // Если остались данные, то записываем следующий байт // данных в порт и запускаем прерывание: PUCHAR userBuffer = (PUCHAR)pIrp-&#62AssociatedIrp.SystemBuffer; pDevExt-&#62byteToBeOutToPort = userBuffer[currentByteNumToWriteToPort]; #if DBG==1 DbgPrint("LPTPORT: currentByteNo = %d, byteToBeOutToPort=%02X(hex)\n", currentByteNumToWriteToPort, pDevExt-&#62byteToBeOutToPort ); #endif // Заранее корректируем номер следующего байта для записи в порт // и сохраняем его там же: pIrpStack-&#62Parameters.DeviceIoControl.Type3InputBuffer = (PVOID)( currentByteNumToWriteToPort+1 ); KeSynchronizeExecution( pDevExt-&#62pIntObj, DoNextTransfer, pDevExt ); } else { #if DBG==1 DbgPrint("LPTPORT: We are now in DpcForIsr, all data transmitted.\n"); #endif if(pDevExt-&#62pEvent!=NULL) { // Устанавливаем объект события в сигнальное состояние, // что является сигналом клиету о полностью завершенном // переносе данных в параллельный порт KeSetEvent(pDevExt-&#62pEvent, IO_NO_INCREMENT , FALSE ); //^^^^^^^^^^^^^^^ Замечание А. } // Завершаем обработку текущего IRP пакета. // Поскольку это была обработка пакета от Win32 вызова // DeviceIoControl, который передавал данные в драйвер, // а назад ничего не ожидал, // то указываем, что число байт, возвращаемых клиенту // (третий аргумент вызова CompleteIrp), равно 0: PIRP pIrp = pDevObj-&#62CurrentIrp; CompleteIrp( pIrp, STATUS_SUCCESS, 0 );

// Сообщаем Диспетчеру ввода/вывода, что готовы обработать // следующий пакет: IoStartNextPacket( pDevObj, FALSE ); } return; } //========================================================================= // Функция: DeviceControlRoutine // Назначение: Обрабатывает запросы от Win32 вызова DeviceIoControl. // Аргументы: pDevObj - поступает от Диспетчера ввода/вывода, // pIrp - поступает от Диспетчера ввода/вывода. // Возвращаемое значение: // NTSTATUS - в случае нормального завершения STATUS_SUCCESS // или код ошибки STATUS_Xxx // NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ) { NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION pIrpStack=IoGetCurrentIrpStackLocation(pIrp); PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj-&#62DeviceExtension; //------------------------------- #if DBG==1 KIRQL currentIrql = KeGetCurrentIrql(); DbgPrint("LPTPORT: We are now in DeviceControlRoutine, currentIrql=%d\n", currentIrql ); #endif // Диспетчеризация по IOCTL кодам: switch( pIrpStack-&#62Parameters.DeviceIoControl.IoControlCode ) { case IOCTL_SEND_TO_PORT: { // Размер данных, поступивших от клиента драйвера // (см.


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