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



Рабочая процедура обработки IOCTL запросов - часть 2


// Получаем текущее значение уровня IRQL v приоритета, // на котором выполняется поток (вообще говоря, целое число): KIRQL irql, currentIrql = KeGetCurrentIrql();

#if DBG DbgPrint("-Example- In DeviceControlRoutine (fdo= %X)\n",fdo); DbgPrint("-Example- DeviceIoControl: IOCTL %x.", ControlCode ); if(currentIrql==PASSIVE_LEVEL) DbgPrint("-Example- PASSIVE_LEVEL (val=%d)",currentIrql); #endif // Запрашиваем владение объектом спин-блокировки. В данном // примере не выполняется никаких критичных действий, но, // вообще говоря, этот прием может быть полезен и даже // незаменим, если в приведенном ниже коде должны будут // выполнены манипуляции, которые можно делать только // эксклюзивно. Пока потоку выделен объект спин-блокировки v // никакой другой поток не сможет войти в оператор switch: KeAcquireSpinLock(&MySpinLock,&irql);

// Диспетчеризация по IOCTL кодам: switch( ControlCode) {

#ifndef SMALL_VERSION case IOCTL_PRINT_DEBUG_MESS: { // Только вводим сообщение и только в отладочной версии #if DBG DbgPrint("-Example- IOCTL_PRINT_DEBUG_MESS."); #endif break; } case IOCTL_CHANGE_IRQL: { #if DBG // Эксперименты по искусственному повышению // IRQL v только в отладочной версии! DbgPrint("-Example- IOCTL_CHANGE_IRQL."); KIRQL dl = DISPATCH_LEVEL, // только для распечатки (2) oldIrql, newIrql=25; // Новый уровень IRQL (например, 25) // Устанавливаем newIrql, сохраняя текущий в oldIrql: KeRaiseIrql(newIrql,&oldIrql); newIrql=KeGetCurrentIrql(); // Что реально получили?

DbgPrint("-Example- DISPATCH_LEVEL value =%d",dl); DbgPrint("-Example- IRQLs are old=%d new=%d", oldIrql,newIrql); KeLowerIrql(oldIrql); // Возвращаем старое значение #endif break; } #endif // SMALL_VERSION

case IOCTL_MAKE_SYSTEM_CRASH: { int errDetected=0; char x = (char)0xFF;

#if DBG // Вообще говоря, под NT мы этого уже не увидим: DbgPrint("-Example- IOCTL_MAKE_SYSTEM_CRASH."); #endif // Вызываем системный сбой обращением по нулевому адресу __try { x = *(char*)0x0L; // ошибочная ситуация //^^^^^^^^^^^^ здесь случится сбой NT, но не Win98 } __except(EXCEPTION_EXECUTE_HANDLER) { // Перехват исключения не работает! // Эта занимательная ситуация объяснена в 10.2.6, // при рассмотрении объектов спин-блокировок.


Содержание  Назад  Вперед