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


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


// Указывать, что будем использовать метод буферизации // BUFFERED_IO при отсутствии обработчиков Read/Write // уже не актуально, поэтому можем закоментировать: // pDevObj-&#62Flags |= DO_BUFFERED_IO; // Заполняем данными структуру Device Extension pDevExt = (PDEVICE_EXTENSION)pDevObj-&#62DeviceExtension; pDevExt-&#62pDevice = pDevObj; // сохраняем - это пригодится pDevExt-&#62ustrDeviceName = devName; pDevExt-&#62Irq = Irq; pDevExt-&#62portBase = (PUCHAR)portBase; pDevExt-&#62pIntObj = NULL; pDevExt-&#62xferCount = 0; // сейчас нет полученных данных pDevExt-&#62pIntObj = NULL; pDevExt-&#62pEvent = NULL; pDevExt-&#62hEvent = NULL; //================================================ // Теперь не инициализируем объект DPC, // а закрепляем за объектом устройства (а значит и за обслуживаемым // им прерыванием) единственную DpcForIsr функцию: IoInitializeDpcRequest( pDevObj, DpcForIsr ); //================================================ // На всякий случай блокируем поступление прерываний: WriteControlRegister ( pDevExt, CR_DEFAULT ); //================================================ // Создаем и подключаем объект прерываний: KIRQL kIrql; KAFFINITY kAffinity; ULONG kVector = HalGetInterruptVector(Isa, 0, pDevExt-&#62Irq, pDevExt-&#62Irq, &kIrql, &kAffinity); // Замечание. Для Isa шины второй параметр (номер шины) обычно // равен 0, а третий и четвертый параметры равны. #if DBG==1 DbgPrint( "LPTPORT: Interrupt %d converted to kIrql = %d, " "kAffinity = %d, kVector = %X(hex)\n", pDevExt-&#62Irq, kIrql, kAffinity, kVector); #endif

status = IoConnectInterrupt ( &pDevExt-&#62pIntObj, // Здесь будет создан Interrupt Object Isr, // Наша функция ISR pDevExt, // Этот указатель ISR функция будет // получать при вызове (контекстный указатель) NULL, // Не будем использовать spin-блокировку для // безопасного доступа к совместно используемым // данным kVector, // транслированное значение прерывания kIrql, // DIRQL kIrql, // DIRQL Latched, // Прерывание по перепаду TRUE, // Совместно используемое (Shared) прерывание kAffinity, // Поцессоров в мультипроцессорной системе FALSE ); // Не сохранять значения регистров сопроцессора if (!NT_SUCCESS(status)) { // В случае неудачи удаляем объект устройства IoDeleteDevice( pDevObj ); return status; } #if DBG==1 DbgPrint("LPTPORT: Interrupt successfully connected.\n"); #endif //================================================ // Создаем символьную ссылку: UNICODE_STRING symLinkName; // Сформировать символьное имя: //#define SYM_LINK_NAME L"\\??\\LPTPORT0" // ^^ проходит только в NT // Для того, чтобы работало в Windows 98 & XP : #define SYM_LINK_NAME L"\\DosDevices\\LPTPORT0" RtlInitUnicodeString( &symLinkName, SYM_LINK_NAME );




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