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

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

блин, замучился с запросом IRP_MJ_DIRECTORY_CONTROL....

добавляю воркитем, в котором (основной поток гарантированно выходит из обработки IRP_MJ_DIRECTORY_CONTROL со status=STATUS_PENDING)

VOID XtFSDeQueueRequest(IN PVOID Context)
{
    PFSD_IRP_CONTEXT IrpContext;
   DP("\n" DRIVER_NAME "XtFSDeQueueRequest() Dispatching Req from WorkItem\n");

    IrpContext = (PFSD_IRP_CONTEXT) Context;

   {
      LARGE_INTEGER Timeout;
      DP(DRIVER_NAME "Delaying execution\n");
      Timeout.QuadPart = -30 * 10000;  // 100ms time break
      KeDelayExecutionThread(KernelMode,FALSE, &Timeout);
      DP(DRIVER_NAME "Delaying complete\n");
   }


//   IrpContext->Irp->IoStatus.Information = 0;
//   IrpContext->Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
//   IoCompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
//   return;

    try
    {
      FsRtlEnterFileSystem();   
      if (!IrpContext->IsTopLevel)
         IoSetTopLevelIrp((PIRP) FSRTL_FSP_TOP_LEVEL_IRP);

      XtFSDispatchRequest(IrpContext);        
    }
    __finally
    {
        IoSetTopLevelIrp(NULL);
        FsRtlExitFileSystem();      
    }
   DP(DRIVER_NAME "XtFSDeQueueRequest() Leaving\n");
}
при последуюдущем запросе (в воркитеме я сбрасываю асинхронность и сново запускаю диспечер обработки irp) - верно заполняю соотв. структуры и комплетю irp.

все зацикливается....отображается список файлов, который я создал, но продолжаются запросы  IRP_MJ_DIRECTORY_CONTROL бесконечно !!!! Иногда даже подвисает explorer. Что делать? Почему Ext2Ifs работает?

Даже если просто комплетить асинхронный IRP_MJ_DIRECTORY_CONTROL  и заполнять поля, появляется глюк (вложенные папки не открываются быстро, те содержимое папки пропадает! Но появляется вновь, если нажать обновить вовремя....)


Что то я упустил, как правильно обрабатывать этот запрос, люди, кто занималя fs, помогите, мучаюсь уже второй день.
Записан
maaaaaad
Гость
« Ответ #1 : 05-06-2004 20:33 » 

Z:\>dir
 Том в устройстве Z имеет метку serg
 Серийный номер тома: 0000-0000

 Содержимое папки Z:\

01.01.1601  04:00                  128 filexxx
01.01.1601  04:00                  128 filexxx
               2 файлов            256 байт
               0 папок               0 байт свободно

Z:\>dir
 Том в устройстве Z имеет метку serg
 Серийный номер тома: 0000-0000

 Содержимое папки Z:\

01.01.1601  04:00                  128 filexxx
01.01.1601  04:00                  128 filexxx
               2 файлов            256 байт
               0 папок               0 байт свободно

Z:\>dir
 Том в устройстве Z имеет метку serg
 Серийный номер тома: 0000-0000

 Содержимое папки Z:\

Файл не найден

Z:\>dir
 Том в устройстве Z имеет метку serg
 Серийный номер тома: 0000-0000

 Содержимое папки Z:\

Файл не найден

Z:\>dir
 Том в устройстве Z имеет метку serg
 Серийный номер тома: 0000-0000

 Содержимое папки Z:\

01.01.1601  04:00                  128 filexxx
01.01.1601  04:00                  128 filexxx
               2 файлов            256 байт
               0 папок               0 байт свободно

Z:\>
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 08-06-2004 07:35 » 

Там все по хитрому. Во первых там идет несколько запросов- на какой-то надо вернуть STATUS_NO_MORE_FILES, чтоб прекратили спрашивать о содержимом папки.
 Для пустой директории например на первый запрос возвращаешь сначала '.', на следующий '..', а на третий STATUS_NO_MORE_FILES.
Записан
maaaaaad
Гость
« Ответ #3 : 09-06-2004 11:11 » 

я это делал.

=) по поводу асинхронности......=) что то я пересмотрел и у меня вышло что все эти запросы синхронны. STATUS_PENDING инициировал ошибку (для синхронного запроса) и кто то там =))) повторял запрос....все циклилось

но все равно проблема спонтаного пропадания содержимого каталога остается....
Записан
maaaaaad
Гость
« Ответ #4 : 09-06-2004 11:12 » 

Цитата

Для пустой директории например на первый запрос возвращаешь сначала '.', на следующий '..', а на третий STATUS_NO_MORE_FILES.


Огромное спасибо, попробую.
Записан
maaaaaad
Гость
« Ответ #5 : 09-06-2004 11:14 » 

для не пустых как я полагаю это тоже надо делать.......спасибо
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 09-06-2004 11:34 » 

Цитата

для не пустых как я полагаю это тоже надо делать.......спасибо


Естественно. Плюс заполнять содержимым каталога буфер, возвращать STATUS_SUCCESS, а на последний запрос STATUS_NO_MORE_FILES.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines