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


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


В результате (это будет видно позже в распечатке log-файла из программы DebugView) код функции DoNextTransfer выполняется на уровне IRQL равном IRQL кода функции ReadDataSafely и кода функции Isr, которые равны 8 в данном тесте.

//========================================================================= // Функция: DispatchRead // Назначение: Обрабатывает запрос по поводу Win32 вызова ReadFile // Аргументы: pDevObj - поступает от Диспетчера ввода/вывода // pIrp - поступает от Диспетчера ввода/вывода // Возвращаемое значение: // NTSTATUS - в случае нормального завершения STATUS_SUCCESS // или код ошибки STATUS_Xxx // NTSTATUS DispatchRead ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pDevObj-&#62DeviceExtension; PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp ); ULONG xferSize, xferredSize; #if DBG==1 DbgPrint("LPTPORT: in DispatchRead now\n"); #endif

if( pDevExt-&#62xferRest&#62 0 ) { // Не начинаем обрабатывать новый запрос, если остались // непереданные данные #if DBG==1 DbgPrint("LPTPORT: DispatchRead: Exists nonprocessed request\n"); #endif pIrp-&#62IoStatus.Status = STATUS_DEVICE_BUSY; IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return STATUS_DEVICE_BUSY; }

// Определяем размер запроса: xferSize = pIrpStack-&#62Parameters.Read.Length; if( xferSize &#62 MAX_BUFFER_SIZE ) xferSize = MAX_BUFFER_SIZE;

// Передаем не более данных, чем размер числа переданных байт xferredSize = pDevExt-&#62xferCount; xferSize = (xferSize &#60 xferredSize ? xferSize : xferredSize ); if(xferSize&#62 0) { // Копируем содержимое внутреннего входного буфера // в буфер клиента PVOID userBuffer = pIrp-&#62AssociatedIrp.SystemBuffer; RtlCopyMemory(userBuffer, pDevExt-&#62deviceInBuffer, xferSize); }

// Завершаем обработку IRP пакета: pIrp-&#62IoStatus.Status = STATUS_SUCCESS; pIrp-&#62IoStatus.Information = xferSize; // число переданных байт IoCompleteRequest( pIrp, IO_NO_INCREMENT ); #if DBG==1 DbgPrint("LPTPORT: DispatchRead: %d byted transferred.\n", xferSize); #endif return STATUS_SUCCESS; }




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