UNICODE_STRING и IRQL

Тема в разделе "WASM.NT.KERNEL", создана пользователем ntdrivers, 4 янв 2011.

  1. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    В документации DDK написано, что все функции работы со строками UNICODE_STRING, такие как RtlCompareUnicodeString и даже DbgPrint допустимы только при IRQL=PASSIVE_LEVEL. А что делать со строками, если нужно работать на APC_LEVEL? Мне нужно сравнивать имена модулей, поступающие в callback от PsSetLoadImageNotifyRoutine. Попробовал вызывать функции работы со строками на APC_LEVEL, бсодов пока нет, с чем связано это ограничение и в каких случаях можно его нарушать?
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Ограничение связанно с тем, что память, на которую указывает поле Buffer, может быть выделена в подкачиваемом пуле. Нарушать это ограничение нельзя вообще ни при каких условиях (вернее, можно только при работе со своими строками, про которые _точно_ известно, что они находятся в неподкачиваемой памяти).

    То что BSoD-а нет - просто везение, на других машинах (или под driver verifier-ом) он может появиться.

    И да, нотификатор на загрузку образов разве не на PASSIVE_LEVEL-е вызывается?
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    есть ещё и wide-char функции
    В callback PsSetLoadImageNotifyRoutine не замечал, чтобы UNICODE_STRING - функции вызывали какие-либо проблемы.
    P.S. Возможно из-за NonPaged памяти
     
  4. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Но ведь отказ страницы может привести к бсоду только если IRQL>=DISPATCH_LEVEL, а на APC_LEVEL это нормальная ситуация и подкачка должна осуществляться прозрачно для моего кода?
     
  5. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Я вот тоже сначала хотел использовать всякие _wcsnicmp вместо системных функций, но потом наткнулся на это сообщение:http://www.wasm.ru/forum/viewtopic.php?pid=385746#p385746
     
  6. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    На XP SP2 он вызывается с PASSIVE_LEVEL только для экзешника и NTDLL, а для остальных библиотек уже на APC_LEVEL.
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Cr4sh
    На пассиве. Так что, проблем работы со строками внутри колбека быть не должно.
    Главное проверять указатель PUNICODE_STRING FullImageName на NULL.
     
  8. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Нет, на пассиве он вызывается только для модуля экзешника и ntdll, а для остальных библиотек уже на APC_LEVEL, по крайней мере у меня на XP SP2 это так.
     
  9. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Да, верно... в таком случае, я даже не знаю что и предположить насчёт ограничений на PASSIVE_LEVEL.
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    ntdrivers
    возможно. Хотя опять же не замечал проблем с тем же DbgPrint().

    То о чем пишет ТС - имеет место быть, но не в данной ситуации.
     
  11. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    Вот здесь обсуждался вопрос
    http://www.osronline.com/showthread.cfm?link=169645

    Как я понял, ограничение может быть связано с тем, что таблица соответствия для сравнения без учёта регистра находится в выгружаемой памяти. Посмотрел функцию под дизасмом - она простая, без вызовов наружу, вот только идёт обращение к памяти через ds, видимо к этой таблице оно и относится.
     
  12. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Мне нужно именно сравнение без учета регистра, и именно с ним могут быть проблемы на APC_LEVEL, печально.. От использования _wcsnicmp тоже профита наверно не будет, она сама импортируется из NTOSKRNL.EXE.. Как обычно решается проблема работы с unicode на высоких IRQL?
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    ntdrivers
    Как вариант - напишите тогда свою процедуру сравнения (благо она не очень то и сложная если известно, что кодировка будет латиницей). И передавайте ей юникод который будет создан только в Nonpaged Pool (для этого юзайте например RtlInitUnicodeString).

    Либо сравнивать строки в отдельном потоке (передавая ему параметры), в контексте системы на PASSIV_LEVEL.

    Пока только такие две идеи.
     
  14. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Не факт, что латиница.
    В документации я заметил интересную штуку: RtlUpcaseUnicodeString допускается вызывать на IRQL<=APC_LEVEL. Варианта два: забить и оставить как есть, благо пока не падало, либо написать свой аналог на основе RtlUpcaseUnicodeString и побайтового сравнения.
     
  15. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    PS: Может быть это вообще ошибка в документации?
     
  16. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    TermoSINteZ
    Для этого ему придётся скопировать сначала из подкачиваемого пула, а тут и вся проблема. Насколько я понимаю, память под строку выделяется отнюдь не его кодом....

    Сначала хотел посоветовать IsBadReadPtr, но потом почитал мсдн и отхотелось что-то....

    Идея с отдельным потоком пока самая толковая.
     
  17. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Ну и бред понаписали... При чем подкачиваемый пул к APC_LEVEL- не ясно.
    А причина, на самом деле, в NLS-таблицах, которые могут подгружаться при работе с unicode-строками. Поскольку они открываются и грузятся с применением хотя бы той же ZwCreateFile, для которой существуют вот такие ограничения:
    Аналогичные ограничения будут накладываться и на функции, типа:
     
  18. ntdrivers

    ntdrivers New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2010
    Сообщения:
    25
    Вот это больше похоже на правду..
    А почему тогда RtlUpcaseUnicodeString допускается вызывать на APC_LEVEL?
     
  19. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Потому, что не грузит NLS-таблицы динамически, а использует Nls844UnicodeUpcaseTable, которая инициализируется еще при загрузке системы в KiInitializeKernel. Кстати, в доках не всегда правду пишут, может это связанно с различиями реализаций Rtl* функций на разных ОС, и разрабы MS решили не заморачиваться с правкой MSDN, но часть Rtl* функций все же может работать на APC_LEVEL. Нужно полагаться больше на реверс, чтобы знать точно, что можно, а что нельзя.
     
  20. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Deyton
    Как раз лучше не полагаться. Со следущей версии работа функции может быть такой, как написано в мсдн в точности (а может и не быть, кто знает). И тогда то, что отработало - не сработает.