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


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


PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pContext; UCHAR nextByte = 0x0F & (pDevExt-&#62byteToBeOutToPort);

#if DBG==1 DbgPrint("LPTPORT: DoNextTransfer:\n"); DbgPrint("LPTPORT: Sending 0x%02X to port %X\n", nextByte, pDevExt-&#62portBase); #endif // Отправка полубайта данных. //= 1 =============================================================== // Заглушка CheckIt работает не самым простым образом. // Бит 0 отсылаемого полубайта нужно отправить как бит 0 // в Data Register WriteDataRegister ( pDevExt, nextByte & 0x01); // // Это бит будет считан как бит 3 из Status Register

//= 2 =============================================================== // Биты 1-3 отсылаемого полубайта нужно отправить как // биты 0, 1 и 3 в Control Register UCHAR bits = (nextByte & 0x8) + ((nextByte & 0x6)&#62&#62 1); // Таким образом бит 2 всегда равен 0

bits ^= 0x3; // Инвертируем биты (0 & 1) перед // записью в Control Register // Эти биты будут считаны в Status Register как биты 4,5 и 7 #if DBG==1 DbgPrint("LPTPORT: generating next interrupt...\n"); #endif // Собственно отправляем данные вместе с генерацией // сигнала прерывания: ForceInterrupt( pDevExt, bits ); return TRUE; } //========================================================================= // Функция ReadDataSafely выполняет чтение данных из устройства // без опасения быть прерванной кодом ISR функции: // BOOLEAN ReadDataSafely ( IN PVOID pContext ) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pContext; UCHAR status = ReadStatusRegister( pDevExt );

// Преобазуем полученные через Status register биты // в понятную форму UCHAR readByte = ((status & 0x8)&#60&#60 1) | ((status & 0x30)&#60&#60 1) | (status & 0x80); readByte &#62&#62= 4; #if DBG==1 KIRQL currentIrql = KeGetCurrentIrql(); DbgPrint("LPTPORT: ReadDataSafely, currentIrql=%d ReadStatus = %02X" " ReadByte = %02X\n", currentIrql, status, readByte ); DbgPrint( "LPTPORT: \n"); #endif if(pDevExt-&#62xferCount &#60 MAX_BUFFER_SIZE) { // Помещаем принимаемые во внутренний буфер драйвера, // только если его размер не исчерпан: pDevExt-&#62deviceInBuffer[pDevExt-&#62xferCount++] = readByte; } return TRUE; } //========================================================================= // Функция TransferToUserSafely выполняет перенос данных из внутреннего // буфера драйвера без опасения быть прерванной кодом ISR функции: // BOOLEAN TransferToUserSafely ( IN PVOID pContext ) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pContext; ULONG xferReq = pDevExt-&#62xferSize; PUCHAR inBuffer = pDevExt-&#62deviceInBuffer;




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