Как сравнить две Unicode строки?

Тема в разделе "WASM.BEGINNERS", создана пользователем 2FED, 20 фев 2008.

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Я получаю список процессов через NtQuerySystemInformation, в возвращаемой структуре есть буфер в котором записан путь к процессу, например мне надо сравнить этот путь
    "C:\windows\explorer.exe" со второй unicode строкой в которой "explorer.exe"

    С RtlCompareString у меня ничего не получилось, а функций ядра которые ищут одну строку в другой я не нашел, в общем помогите :)
     
  2. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    свою функцию нужно писать для сравнения строк с конца

    в статьях МС-РЕМ такая функция точно была написана вручную
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    На сколько я помню в NtQuerySystemInformation нет ни одного инфокласса, который возвращает полное имя процесса, темболее в символическом виде(SystemModuleInformation возвращает полные пути к модулям в виде симв. ссылки).
    В списке процессов, полученных с помощью этой функции имена короткие.
    Можно получить полное имя процесса с помощью NtQueryInformationProcess, не понятно что ты делаешь..
     
  4. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    RtlCompareUnicodeString
    2 2FED ты плохо ищеш.
     
  5. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    но RtlCompareUnicodeString сравнивает строки только равной длины, или нет?
     
  6. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Пройдись до последнего слеша, и вытащи имя процесса, разве это трудно ?
    The RtlCompareUnicodeString routine compares two Unicode strings.
     
  7. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Та я просто оставлял этот вариант на крайняк, думал может в ядре есть какая функция в которой это уже реализовано
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    wcsstr
     
  9. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    я пишу на асм а эта функция из С RunTime library
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    нет эта функция не из C RunTime library.
     
  11. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Ладно тогда такой вопрос, эта функция wcsstr принимает обычную Null-terminated string, а как из unicode строки такую получить, функция RtlUnicodeStringToAnsiString конвертирует в ANSI_STRING а это не совсем обычная строка, там буфер воабще DWORD почемуто, в общем такая связка не работает =(
     
  12. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    2FED
    Код (Text):
    1. typedef struct _STRING {
    2.   USHORT  Length;
    3.   USHORT  MaximumLength;
    4.   PCHAR  Buffer; <---------
    5. } ANSI_STRING *PANSI_STRING;
     
  13. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Код (Text):
    1. UNICODE_STRING STRUCT
    2.     _Length     WORD    ?      
    3.     MaximumLength   WORD    ?      
    4.     Buffer      PWSTR   ? ; PWSTR = WORD, два байта unicode    
    5. UNICODE_STRING ENDS
    6.  
    7.  
    8. _STRING STRUCT
    9.     _Length     WORD    ?
    10.     MaximumLength   WORD    ?
    11.     Buffer      DWORD   ? ; Четыре байта? тут по идее должно было быть byte
    12. _STRING ENDS
    invoke RtlUnicodeStringToAnsiString,addr ansi,addr [eax+38h],TRUE
    invoke RtlInitAnsiString,addr ansi2,addr StrExplorer


    ;invoke wcsstr,addr ansi,addr ansi2 ;<--- Не работает и addr ansi.Buffer тоже
    ;invoke RtlCompareString,addr ansi,addr ansi2,TRUE ;<--- Работает
     
  14. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    _STRING STRUCT
    _Length WORD ?
    MaximumLength WORD ?
    Buffer DWORD ? ; Тут УКАЗАТЕЛЬ на строку
    _STRING ENDS
     
  15. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    А откуда?
     
  16. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Novi4ek
    Экспортируется в ntdll.dll. А так же и в ntoskrnl.exe она присутствует (если нужно в ринг-0)

    /off жесть, новички приходят, спрашивают, еще спорят, хотя сами еще даже не удосужились глянуть откуда фукнция, работает ли она, ее описание. Да еще с таким упорством спорят
     
  17. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    TermoSINteZ
    +1 Банить надо таких.
     
  18. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    >>новички приходят, спрашивают, еще спорят, хотя сами еще даже не удосужились глянуть откуда фукнция, работает ли она, ее описание. Да еще с таким упорством спорят

    >>+1 Банить надо таких.

    ЭЭэ...Надеюсь это не в мой адрес, иначе я даже не знаю что сказать.


    Посмотрел функция действительно экспортируется и ntdll.dll и ntoskrnl.exe. Отсюда у меня чисто нубский такой вопрос. По моей логике эта функция должна быть в каких-то ЦРТшных библиотеках, но никак не в ядерных. Мне бы никогда в голову не пришло проверить ее там наличие, если бы здесь не подсказали. И я даже не попробовал бы скомпилировать свой драйвер с использованием этой функции, т.к. был бы наперед уверен что ее нужно дополнительно откуда-то брать. Тем более что в официальной документации я нигде не нашел упоминание о том, что эти функции вшиты в родные виндоус библиотеки. Собственно вопрос у меня такой, вам, судя по всему, очевидно что эта функция находится в ntdll.dll и ntoskrnl.exe, а как вы до этого дошли, почему вам это очевидно?.. (сформулировал вопрос неочень, но надеюсь что вы меня поняли)
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    мне это очевидно атк как я изучал ядро винды, а без хотя бы просмотра экспорта это было бы трудно сделать + в драйверах же работают всякие "crt-шные" функции => они откуда-то экспортируются.
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    [off]
    Меня, например, (да и не только меня) всегда интересовал такой вопрос: зачем лезть в ядро, не зная даже элементарных вещей, не говоря уже о сях, которые некоторые вообще в глаза не видели.
    [/off]