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


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


IoStartNextPacket( pDevObj, TRUE ); } //================================================================================= // Функция: StartIo // Назначение: Вызывается для обработки отложенных IRP пакетов. // Аргументы: pDevObj - поступает от Диспетчера ввода/вывода // pIrp - поступает от Диспетчера ввода/вывода // Возвращаемое значение: нет // VOID StartIo( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { #if DBG==1 KIRQL currentIrql = KeGetCurrentIrql(); DbgPrint("LPTPORT: We are now in StartIo , currentIrql=%d\n", currentIrql ); #endif PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj-&#62DeviceExtension; PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp ); PUCHAR userBuffer; ULONG xferSize; switch( pIrpStack-&#62MajorFunction ) { case IRP_MJ_DEVICE_CONTROL: { ULONG controlCode = pIrpStack-&#62Parameters.DeviceIoControl.IoControlCode; if( controlCode != IOCTL_SEND_TO_PORT ) { // Сюда мы не должны попадать: #if DBG==1 DbgPrint("LPTPORT: StartIo: bad IOCTL."); #endif CompleteIrp( pIrp, STATUS_NOT_SUPPORTED, 0 ); IoStartNextPacket( pDevObj, FALSE ); break; } // Очищаем место, где будем хранить номер следующего байта в // клиентском буфере, который следует передать: pIrpStack-&#62Parameters.DeviceIoControl.Type3InputBuffer=(PVOID)0; //============================================================= // Можно было сделать как и в варианте 1 для запуска переноса: // KeSynchronizeExecution( pDevExt-&#62pIntObj, // DoNextTransfer, // pDevExt ); // // Но пойдем усложненным путем: внесем изменения в DpcForIsr // и DoNextTransfer, затем запланируем вызов DpcForIsr. // Замечание. Функцию IoRequestDpc для планирования DpcForIsr // нужно вызывать с уровня IRQL не ниже DISPATCH_LEVEL, // а StartIo работает как раз на этом уровне IRQL: #if DBG==1 DbgPrint("LPTPORT: StartIo: IoRequestDpc will be called now."); #endif IoRequestDpc( pDevObj, NULL, NULL ); //============================================================= break; } default: { // Сюда мы не должны попадать: #if DBG==1 DbgPrint("LPTPORT: StartIo: bad IOCTL (in 'switch-default')."); #endif CompleteIrp( pIrp, STATUS_NOT_SUPPORTED, 0 ); IoStartNextPacket( pDevObj, FALSE ); break; } } }




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