Ограничения IRQL

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 28 окт 2005.

  1. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Всем доброго!

    Налогаются ли ограничения IRQL для использования strncmp, wcsncmp, _mbsncmp?

    А так же на memcpy.
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    ограничения IRQL касаются доступа к paged памяти.

    а как осуществляется доступ значения не имеет.

    т.е. все перечисленные ф-ции потенциально "опасны"
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ponaytno, rabotat' mojno no tol'ko s pamyat'yu "NonPagedPool".

    U menya voznik etot vopros potomuchto, ya pitalsya izpol'zovat' RtlUnicode... funkcii v svoem driver filtre, i vspomnil chto s nimi mojno rabotat' tol'ko na IRQL s PASSIVE_LEVEL.
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Если тебе только латинский текст сравнивать, т.е. коды символов не выходят за пределы 127, можешь выдрать из исходников RtlCompareUnicodeString и/или RtlEqualUnicodeString и макрос NLS_UPCASE. В макросе нужно убрать вызов TRAVERSE844W (оставить только (wch)). После этой несложной модификации они прекрасно работают и на повышенных IRQL. А strncmp, wcsncmp, _mbsncmp, в свете последних решений партии, лучше не юзать.
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Погоди... я забыл, что ты FileSpy мучаешь. Тогда не пойдёт, т.к. имена файлов само-собой и на китайском могут быть.
     
  7. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, вот именно сижу и думаю как же быть.

    Первоначально для определения типа файла я использовал следующий код:
    Код (Text):
    1.  
    2. ...
    3.     PFILE_OBJECT        FileObject = currentIrpStack->FileObject;
    4.     char str[] = ".txt";
    5.     PVOID   pdest;
    6.     status = RtlUnicodeStringToAnsiString(&ansi_string,&FileObject->FileName,TRUE);
    7.     if(NT_SUCCESS(status))
    8.     {
    9.         pdest = strstr( ansi_string.Buffer, str );
    10.         if(pdest == NULL)
    11.         {
    12.             status = STATUS_UNSUCCESSFUL;
    13.         }
    14.         else
    15.         {
    16.             ...
    17.            
    18.             status = STATUS_SUCCESS;
    19.             ...
    20.         }
    21.             else
    22.             {status = STATUS_UNSUCCESSFUL;}
    23.         }
    24.         RtlFreeAnsiString(&ansi_string);
    25.     }
    26. ...
    27.  


    На тот момент, я вовсе не задумывался о IRQL, драйвер работал, но при выключении компа происходило зависание(вечный цикл), в синяк система не падала. Тут я и вспомнил об IRQL, а еще я встал припоминать попутные мелочи, хотелось бы ими поделиться. И так:

    - верно ли, что IRP_MJ_CREATE всегда на PASSIVE_LEVEL?

    - FileObject->FsContext, какой структуре его можно соотнести, в инете встречал сообщения, что именно по нему ведеться трассировка отслеживаемых файлов(файловых объектов), так ли это?

    - по какаим еще ресурсам можно определить искомый файл(объек)?
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: верно ли, что IRP_MJ_CREATE всегда на PASSIVE_LEVEL? ]</font><!--color-->



    Да. Можешь глянуть ещё "Dispatch Routines and IRQLs" в ДДК.





    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: FileObject->FsContext, какой структуре его можно соотнести... ]</font><!--color-->



    В общем случае ни к какой. FsContext и FsContext2 предназначены для хранения приватной для драйвера информации. Там может быть что угодно, стандарта нет. См. "File Streams, Stream Contexts, and Per-Stream Contexts" в ДДК. Глянь ещё в исходниках IFSKit\src\filesys, как эти поля используются.
     
  9. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Что-то не так, либо я не правильно понимаю происходящее, либо фильтр работает криво. В архивах OSR, многие пишут что для трассировки файлов оспользуют следующую схему:

    - при появлении IRP_MJ_CREATE, включают счетчик открытия и FCB.

    - на основании FCB в IRP_MJ_READ определяют тот ли файл пришел.



    Вроде все работает, т.е. я получаю FCB и он на протяжении всего процесса чтения из файла он не изменяется(т.е указатель на на контекст файлового объекта остается не изменным). Но встает другой вопрос как обнулять этот счетчик, потому что IRP_MJ_CLEANUP\CLOSE приходят сразу же после IRP_MJ_CREATE, и уже потом IRP_MJ_READ.

    На сколько эта ситуация корректна?


    Код (Text):
    1.  
    2. IRP_MJ_Create: FileObject: FF96E7A8; Flags: 2180; Information: 1; FileName = \dbgview1805.LOG
    3. IRP_MJ_Create: FCB: E1D52D78; DeviceObject: FF9FA8E0
    4. IRP_MJ_CLEANUP/IRP_MJ_CLOSE: FileObject: FF96E7A8; Name = notepad.exe:488; Flags: 1028;
    5.                              Information: 0; FileName = \dbgview1805.LOG
    6. IRP_MJ_CLEANUP/IRP_MJ_CLOSE: FCB=E1D52D78
    7. IRP_MJ_READ: FileObject: FF96E7A8; Name = notepad.exe:488; Flags: 67;
    8.              Information: 0; FileName = \dbgview1805.LOG
    9. IRP_MJ_READ: FCB=E1D52D78
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    К сожалению, тут я мало чем могу помочь. Насколько я понимаю, обработчики IRP_MJ_CLEANUP / IRP_MJ_CLOSE у тебя объеденены. Т.е. из вышеприведенного лога невозможно понять, какой именно IRP ты получил. В описании IoCreateStreamFileObject / IoCreateStreamFileObjectEx, например есть такая фраза: "File system filter driver writers should note that IoCreateStreamFileObject causes an IRP_MJ_CLEANUP request to be sent to the file system driver stack for the volume."



    Посмотри ещё приаттаченную статью, если ещё её не видел.



    ЗЫ: Насчёт стандарта на содержимое поля FsContext я, похоже, ошибался. Именно для фс там указатель FSRTL_COMMON_FCB_HEADER или FSRTL_ADVANCED_FCB_HEADER.



    ЗЫ: Если не разберёшься, попробуй спросить на rsdn. Там точно есть несколько человек, неплохо разбирающихся в фс.

    [​IMG] 539857008__ReferenceCounting.rar
     
  11. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    <font color="red]ЗЫ: Если не разберёшься, попробуй спросить на rsdn.</font><!--color-->

    Four-F, действительно есть, только сложно мне пока с ними общаться, уровень моих знаний не позволяет мне пока качественно делать постановку вопроса, а это их там жуть как раздрожает :).

    <font color="red]поля FsContext</font><!--color-->,

    более-менее понятно чт это за зверь и уже на сколько я понял трогать его не советают, в отличии от FsContext2, но...

    Но мой фильтр кажет что после обработки IRP_MJ_CREATE, оба поля FsContext и FsContext2, имеют ссылки на определенную область памяти, т.е. это NULL как я ожидал. Все в тех же архивах на OSRONLINE, есть такие вот сообщения:
    Код (Text):
    1.  
    2. In a file system, we normally store this in whatever structure is
    3. pointed to by FsContext2.  In a filter, this would be in your
    4. per-open-instance structure (assuming you maintain one) or in your
    5. per-file structure (where you keep track of file objects that were
    6. opened by ID, for instance).
    7.  




    Отсюда вопрос, если я заменяю адрес который возращает мне система, на адрес своей структуры, неужели не будет никаких последствий?

    И еще, даже если это так, то кто будет заниматься особождением ресурса, менеджер IRP или я, если я то на соновании чего(какой информации) я должен выполнять это действие.

    Вообщем из первоначально кажущейся легко решаемой задачи "выявление файла, отвечающий определенным требованиям", я попал в очередной тупик.
     
  12. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: если я заменяю адрес который возращает мне система, на адрес своей структуры, неужели не будет никаких последствий? ]</font><!--color-->



    Разумеется будут.



    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: даже если это так, то кто будет заниматься особождением ресурса, менеджер IRP или я, если я то на соновании чего(какой информации) я должен выполнять это действие. ]</font><!--color-->



    Освобождением ресурса должен заниматься его хозяин, т.е. тот кто выделил память и запихал указатель на неё в FsContext. Система делть этого не будет.



    В том посте Тони дальше говорит: "Apparently I wasn't clear: the FsContext2 pointer belongs to the file system. If you are a filter, you'll have to maintain your own mechanism for finding per-file-object data. There are plenty of ways of doing this, but we generally use a table lookup. Note that USING the FsContext2 pointer directly is not an option for a file system filter driver."





    ЗЫ:Набрав в поиске по конфе ntfsd (без кавычек) "FsContext FCB IRP_MJ_CREATE" я получил немерянное кол-во ссылок. Уверен, если всё это внимательно прочитать, то найдется ответ на твой вопрос.
     
  13. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, привет!

    Слушай я наверное скоро в психушку попаду читая архивы на OSRONLINE :).

    Надо проконсультироваться, я более внимательно просамотрел свою трассировку, отделил MJ_CLEANUP и MJ_CLOSE, выяснилось что сразу же псоле MJ_CREATE, приходит MJ_CLEANUP, и после MJ_READ эти все пакеты адресованны одном процессу к примеру Notepad.exe, но я так и не дождался MJ_CLOSE для Notepad.exe. Все MJ_CLOSE которые мне удается поймать принадлежат к Explorer'y. Как это можно объяснить?

    FileSpy от Зузелы, показывает примерно туже картину, только в его случае MJ_CLOSE приходит от System'го процесса. На данный момент в своем диспечере я не делаю никакой обработки приходящь запросов, я просто отправляю все следющему за мной драйверу. Какие причины могут влият на все это?
     
  14. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ну дык фс - шибко мудрёная штука ;) Я затрудняюсь сказать что-либо вразумительное по твоему вопросу.
     
  15. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, еще одну вещь заметил, при небольших размерах файла, IRP_MJ_READ вообще не приходит, т.е. где именно и когда именно происходит загрузка файла полнейшая загадка, могу только предположить что при вызове FASTIO_QUERY_STANDARD_INFO :dntknw:.
    Код (Text):
    1.  
    2. 56  09:37:30.818    0   notepad.exe IRP_MJ_CREATE   00000884    00000000    C:\dbgvi ew251.LOG  STATUS_SUCCESS  FILE_OPEN CreOpts: 0x00000060 Access: 0x00120089 Share: 0x00000003 Attrib: 0x00000080 Result: FILE_OPENED
    3. 57  09:37:30.818    0   notepad.exe IRP_MJ_QUERY_VOLUME_INFORMATION 00000870    E1D950D8    C:\dbgview251.LOG   STATUS_SUCCESS 
    4. 58  09:37:30.818    0   notepad.exe IRP_MJ_QUERY_INFORMATION    00000870    E1D950 D8   C:\dbgview251.LOG   STATUS_BUFFER_OVERFLOW  FileAllInformation
    5. 59  09:37:30.818    0   notepad.exe FASTIO_QUERY_STANDARD_INFO      E1D950D8    C:\ dbgview251.LOG  STATUS_SUCCESS  AllocationSize: 00000000-00000028 EndOfFile: 00000000-00000024 NumberOfLinks: 1 DeletePending: 0 Directory: 0
    6. 60  09:37:30.818    0   notepad.exe IRP_MJ_CLEANUP  00000404    E1D950D8    C:\dbgview251.LOG   STATUS_SUCCESS 
    7. 61  09:37:30.818    0   notepad.exe IRP_MJ_CLOSE    00000404    E1D950D8    C:\dbgview251.LOG   STATUS_SUCCESS 
    8.  
     
  16. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Всем доброго!

    вот статья в продолжение темы namespace, там все так просто и легко, но на практике все иначе.
     
  17. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
  18. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, удалось получить желаемый результат и достигается это путем сброса данных из кэша.