Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Драйвер-фильтр файловой системы  (Прочитано 5410 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Zver
Гость
« : 17-05-2004 07:22 » 

Драйвер создан на основе filemon и предназначен для контроля доступа и фильтрации запросов к гибким дискам (floppy, cdrom, cd-rw и. т. д.).

Привожу код фильтрующей функции:

NTSTATUS HookDispatcher (PDEVICE_OBJECT HookDevice,
                           PIRP            Irp)
{
    PIO_STACK_LOCATION CurrentIrpStack = IoGetCurrentIrpStackLocation(Irp);
    PIO_STACK_LOCATION NextIrpStack    = IoGetNextIrpStackLocation(Irp);
    PHOOK_EXTENSION    HookExt;
    KIRQL              Irql;

    //получаем информацию о целевом устройстве файловой системе
    HookExt =    HookDevice->DeviceExtension;

    // Определяем, с какой функцией мы имеем дело
    switch( CurrentIrpStack->MajorFunction )
   {
     case IRP_MJ_CREATE:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_CREATE");
    break;
    case IRP_MJ_READ:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_READ");
    break;
    case IRP_MJ_WRITE:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_WRITE");
    break;
    case IRP_MJ_CLOSE:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_CLOSE");
    break;
    case IRP_MJ_FLUSH_BUFFERS:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_FLUSH_BUFFERS");
    break;
    case IRP_MJ_QUERY_INFORMATION:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_QUERY_INFORMATION");
    break;
    case IRP_MJ_SET_INFORMATION:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SET_INFORMATION");
    break;
    case IRP_MJ_QUERY_EA:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_QUERY_EA");
    break;
    case IRP_MJ_SET_EA:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SEA_EA");
    break;
    case IRP_MJ_QUERY_VOLUME_INFORMATION:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_QUERY_VOLUME_INFORMATION");
    break;
    case IRP_MJ_SET_VOLUME_INFORMATION:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SET_VOLUME_INFORMATION");
    break;
    case IRP_MJ_DIRECTORY_CONTROL:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_DIRECTORY_CONTROL");
    break;
    case IRP_MJ_FILE_SYSTEM_CONTROL:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SYSTEM_CONTROL");
    break;
    case IRP_MJ_SHUTDOWN:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SHUTDOWN");
    break;
    case IRP_MJ_LOCK_CONTROL:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_LOCK_CONTROL");
    break;
    case IRP_MJ_CLEANUP:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_CLEANUP");
    break;
    case IRP_MJ_DEVICE_CONTROL:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_DEVICE_CONTROL");
    break;
    case IRP_MJ_CREATE_MAILSLOT:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_CREATE_MAILSLOT");
    break;
    case IRP_MJ_QUERY_SECURITY:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_QUERY_SECURITY");
    break;
    case IRP_MJ_SET_SECURITY:
    DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SET_SECURITY");
    break;
    default:
    DbgPrint("Horonzon - HookDispatcher=>UNKNOWN");
    break;
    }

    // копируем параметры в стек следующего уровня
    *NextIrpStack = *CurrentIrpStack;

   if(Magic)
   {

     // устанавливаем процедуру завершения, если мы не выгружаемся
     KeAcquireSpinLock(&SpinLock, &Irql);
     if( !UnloadInProgress )
    {
       OutstandingIRPCount++;
       IoSetCompletionRoutine( Irp, HoronzonCompletionRoutine, NULL, TRUE, TRUE, TRUE );
     }
     KeReleaseSpinLock(&SpinLock, Irql);

    DbgPrint("Horonzon - HookDispatcher=>IoCallDriver");
     // возвращаем результаты запроса вызывающему
    return IoCallDriver( HookExt->FileSystem, Irp );
   }
   else
   {
//Вот здесь основная зацепка. Есть ли более изящные способы?
      IoCancelIrp(Irp);
      DbgPrint("Horonzon - HookDispatcher=>IoCancelIrp");
      return STATUS_SUCCESS;
   }

}

Вопрос знатокам. Подскажите пожалуйста, известны ли более изящный способы фильтрации IRP, чем банальное удаление?
Если есть исходные коды, пожалуйста дайте ссылку, буду очень благодарен.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 17-05-2004 07:45 » new

Может быть, в случае запрещённой операции возвращать что нибудь вроде Permission Denied?
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines