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


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


pDevExt-&#62xferRest--; // Число непереданных байт уменьшилось return (pDevExt-&#62xferRest&#60 1 ? FALSE : TRUE ); // это значение возвратится // через вызов KeSynchronizeExecution }

//========================================================================= // Функция: DpcForIsr // Назначение: Данная функция начинает работу по "заказу" ISR функции // и выполняет ввод/вывод путем безопасного вызова функций // ReadDataSafely и DoNextTransfer, то есть реализует // низкоуровневый ввод/вывод // Аргументы: Указатель на текущий DPC объект (не используется) // pDeferredContext - контекстный указатель - так передается // указатель на структуру Device Extension // Возвращаемое значение: нет // VOID DpcForIsr( IN PKDPC pDpc, // не используется IN PVOID pDeferredContext, IN PVOID pArg1, // не используется IN PVOID pArg2 // не используется ) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDeferredContext; #if DBG==1 KIRQL currentIrql = KeGetCurrentIrql(); DbgPrint("LPTPORT: We are now in DpcForIsr, currentIrql=%d xferCount = %d\n", currentIrql, pDevExt-&#62xferCount ); #endif // Безопасно читаем данные из устройства: BOOLEAN dataNotTransferrered = KeSynchronizeExecution( pDevExt-&#62pIntObj, ReadDataSafely, pDevExt ); if ( dataNotTransferrered ) // остались непереданные данные : { // Если остались данные, то записываем следующую порцию // данных в порт и запускаем прерывание: KeSynchronizeExecution( pDevExt-&#62pIntObj, DoNextTransfer, pDevExt ); } else { #if DBG==1 DbgPrint("LPTPORT: We are now in DpcForIsr, all data transmitted.\n"); #endif } } //=========================================================================




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