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


Процедура DriverEntry и предварительные объявления - часть 3


// Получаем указатель на область, предназначенную под // структуру расширение устройства PEXAMPLE_DEVICE_EXTENSION dx = (PEXAMPLE_DEVICE_EXTENSION)fdo->DeviceExtension; dx->fdo = fdo; // Сохраняем обратный указатель

// Применяя прием условной компиляции, вводим функцию DbgPrint, // сообщения которой мы сможем увидеть в окне DebugView, если // выполним сборку нашего драйвера как checked (отладочную) // версию: #if DBG DbgPrint("=Example= FDO %X, DevExt=%X.",fdo,dx); #endif

//======================================= // Действия по созданию символьной ссылки // (их нужно было бы делать в OurAddDeviceRoutine, но у нас // очень простой драйвер): UNICODE_STRING symLinkName; // Сформировать символьное имя: // #define SYM_LINK_NAME L"\\??\\Example" // Такого типа символьные ссылки ^^ проходят только в NT. // (То есть, если перенести бинарный файл драйвера в // Windows 98, то пользовательские приложения заведомо // не смогут открыть файл по такой символьной ссылке.) // Для того, чтобы ссылка работала в и Windows 98 и в NT, // необходимо поступать следующим образом: #define SYM_LINK_NAME L"\\DosDevices\\Example" RtlInitUnicodeString( &symLinkName, SYM_LINK_NAME ); dx->ustrSymLinkName = symLinkName;

// Создаем символьную ссылку status = IoCreateSymbolicLink( &symLinkName, &devName ); if (!NT_SUCCESS(status)) { // при неудаче v удалить Device Object и вернуть управление IoDeleteDevice( fdo ); return status; } // Теперь можно вызывать CreateFile("\\\\.\\Example",...); // в пользовательских приложениях

// Объект спин-блокировки, который будем использовать для // разнесения во времени выполнения кода обработчика // IOCTL запросов. Инициализируем его: KeInitializeSpinLock(&MySpinLock);

// Снова используем условную компиляцию, чтобы выделить код, // компилируемый в отладочной версии и не компилируемый в // версии free (релизной): #if DBG DbgPrint("=Example= DriverEntry successfully completed."); #endif return status; } #pragma code_seg() // end INIT section




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



Книжный магазин