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


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


#if DBG==1 KIRQL currentIrql = KeGetCurrentIrql(); DbgPrint("LPTPORT: TransferToUserSafely, currentIrql=%d\n",currentIrql ); DbgPrint(" requested %d bytes, while ready %d bytes.\n", xferReq, pDevExt-&#62xferCount); #endif

if( pDevExt-&#62xferCount&#60 1 || xferReq&#60 1 ) { // Нет никаких полученных данных или нулевой запрос pDevExt-&#62xferSize = 0; return FALSE; } if( xferReq &#62 MAX_BUFFER_SIZE ) xferReq = MAX_BUFFER_SIZE; // Передаем не более данных, чем все, полученные из LPT порта, // оказавшиеся во внутреннем буфере драйвера: if( xferReq &#62 pDevExt-&#62xferCount ) xferReq = pDevExt-&#62xferCount;

// Собственно перенос запрошенных данных в буфер клиента: RtlCopyMemory( pDevExt-&#62pUserBuffer, inBuffer, xferReq );

if( xferReq &#60 pDevExt-&#62xferCount) { // Перемещаем оставшиеся данные к началу буфера: ULONG i=0,j=xferReq; for(; j&#60pDevExt-&#62xferCount; ) inBuffer[i++]=inBuffer[j++]; } pDevExt-&#62xferCount -= xferReq; pDevExt-&#62xferSize = xferReq; #if DBG==1 DbgPrint(" Transferred %d, the rest %d bytes.\n", xferReq, pDevExt-&#62xferCount); #endif return TRUE; } //========================================================================= // Функция: DpcForIsr // Назначение: Данная функция начинает работу по "заказу" ISR функции // и выполняет ввод/вывод путем безопасного вызова функций // ReadDataSafely и DoNextTransfer, то есть реализует // низкоуровневый ввод/вывод // Аргументы: Указатель на текущий DPC объект (не используется) // pDeferredContext - контекстный указатель - так // передается указатель на структуру объекта устройства // Возвращаемое значение: нет // VOID DpcForIsr( IN PKDPC pDpc, // не используется IN PVOID pDeferredContext, // Внимание! Теперь здесь // находится указатель pDevObj ! IN PVOID pArg1, // не используется IN PVOID pArg2 // не используется ) { PDEVICE_OBJECT pDevObj = (PDEVICE_OBJECT)pDeferredContext; PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj-&#62DeviceExtension; PIRP pIrp = pDevObj-&#62CurrentIrp; PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp); ULONG total = pIrpStack-&#62Parameters.DeviceIoControl.InputBufferLength, currentByteNumToWriteToPort = (ULONG)pIrpStack-&#62Parameters.DeviceIoControl.Type3InputBuffer;




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