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


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


if( xferSize == 0 ) // Нет данных для передачи : { #if DBG==1 DbgPrint("LPTPORT: DispatchWrite: no bytes to transfer.\n"); #endif pIrp-&#62IoStatus.Status = STATUS_SUCCESS; pIrp-&#62IoStatus.Information = 0; // Нет переноса IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } if( pDevExt-&#62xferRest&#62 0 ) { // Не начинаем обрабатывать новый запрос, если остались // непереданные данные (в буфере deviceOutBuffer драйвера) #if DBG==1 DbgPrint("LPTPORT: DispatchWrite: not all data transferred\n"); #endif pIrp-&#62IoStatus.Status = STATUS_DEVICE_BUSY; pIrp-&#62IoStatus.Information = 0; // Нет переноса IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return STATUS_DEVICE_BUSY; } if( xferSize &#62 MAX_BUFFER_SIZE ) { // Слишком большой запрос. Завершаем обработку IRP пакета: #if DBG==1 DbgPrint( "PLPTPORT: DispatchWrite: xferSize &#62 MAX_BUFFER_SIZE\n" ); #endif pIrp-&#62IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; pIrp-&#62IoStatus.Information = 0; // Нет переноса IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return STATUS_INSUFFICIENT_RESOURCES; } // Буфер с данными, поступивший от клиента, переносим в // рабочий буфер: PUCHAR userBuffer = (PUCHAR)pIrp-&#62AssociatedIrp.SystemBuffer; RtlCopyMemory( pDevExt-&#62deviceOutBuffer, userBuffer, xferSize );

pDevExt-&#62xferRest = xferSize; pDevExt-&#62xferCount = 0;

// Запускаем перенос данных в первый раз KeSynchronizeExecution( pDevExt-&#62pIntObj, DoNextTransfer, pDevExt ); // Формально -- передача завершена: pIrp-&#62IoStatus.Information = xferSize; IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return STATUS_SUCCESS; }

Обработчик запросов от Win32 вызова WriteFile переносит данные во внутренний буфер deviceOutBuffer и инициирует процесс переноса вызовом DoNextTransfer при посредничестве KeSyncronizeExecution. Последний повышает текущий уровень IRQL работы до уровня, ассоциированного с объектом прерывания, указанного в качестве первого параметра pDevExt-&#62pIntObj.


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