Я получаю список процессов через NtQuerySystemInformation, в возвращаемой структуре есть буфер в котором записан путь к процессу, например мне надо сравнить этот путь "C:\windows\explorer.exe" со второй unicode строкой в которой "explorer.exe" С RtlCompareString у меня ничего не получилось, а функций ядра которые ищут одну строку в другой я не нашел, в общем помогите
свою функцию нужно писать для сравнения строк с конца в статьях МС-РЕМ такая функция точно была написана вручную
На сколько я помню в NtQuerySystemInformation нет ни одного инфокласса, который возвращает полное имя процесса, темболее в символическом виде(SystemModuleInformation возвращает полные пути к модулям в виде симв. ссылки). В списке процессов, полученных с помощью этой функции имена короткие. Можно получить полное имя процесса с помощью NtQueryInformationProcess, не понятно что ты делаешь..
Пройдись до последнего слеша, и вытащи имя процесса, разве это трудно ? The RtlCompareUnicodeString routine compares two Unicode strings.
Та я просто оставлял этот вариант на крайняк, думал может в ядре есть какая функция в которой это уже реализовано
Ладно тогда такой вопрос, эта функция wcsstr принимает обычную Null-terminated string, а как из unicode строки такую получить, функция RtlUnicodeStringToAnsiString конвертирует в ANSI_STRING а это не совсем обычная строка, там буфер воабще DWORD почемуто, в общем такая связка не работает =(
2FED Код (Text): typedef struct _STRING { USHORT Length; USHORT MaximumLength; PCHAR Buffer; <--------- } ANSI_STRING *PANSI_STRING;
Код (Text): UNICODE_STRING STRUCT _Length WORD ? MaximumLength WORD ? Buffer PWSTR ? ; PWSTR = WORD, два байта unicode UNICODE_STRING ENDS _STRING STRUCT _Length WORD ? MaximumLength WORD ? Buffer DWORD ? ; Четыре байта? тут по идее должно было быть byte _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 ;<--- Работает
_STRING STRUCT _Length WORD ? MaximumLength WORD ? Buffer DWORD ? ; Тут УКАЗАТЕЛЬ на строку _STRING ENDS
Novi4ek Экспортируется в ntdll.dll. А так же и в ntoskrnl.exe она присутствует (если нужно в ринг-0) /off жесть, новички приходят, спрашивают, еще спорят, хотя сами еще даже не удосужились глянуть откуда фукнция, работает ли она, ее описание. Да еще с таким упорством спорят
>>новички приходят, спрашивают, еще спорят, хотя сами еще даже не удосужились глянуть откуда фукнция, работает ли она, ее описание. Да еще с таким упорством спорят >>+1 Банить надо таких. ЭЭэ...Надеюсь это не в мой адрес, иначе я даже не знаю что сказать. Посмотрел функция действительно экспортируется и ntdll.dll и ntoskrnl.exe. Отсюда у меня чисто нубский такой вопрос. По моей логике эта функция должна быть в каких-то ЦРТшных библиотеках, но никак не в ядерных. Мне бы никогда в голову не пришло проверить ее там наличие, если бы здесь не подсказали. И я даже не попробовал бы скомпилировать свой драйвер с использованием этой функции, т.к. был бы наперед уверен что ее нужно дополнительно откуда-то брать. Тем более что в официальной документации я нигде не нашел упоминание о том, что эти функции вшиты в родные виндоус библиотеки. Собственно вопрос у меня такой, вам, судя по всему, очевидно что эта функция находится в ntdll.dll и ntoskrnl.exe, а как вы до этого дошли, почему вам это очевидно?.. (сформулировал вопрос неочень, но надеюсь что вы меня поняли)
мне это очевидно атк как я изучал ядро винды, а без хотя бы просмотра экспорта это было бы трудно сделать + в драйверах же работают всякие "crt-шные" функции => они откуда-то экспортируются.
[off] Меня, например, (да и не только меня) всегда интересовал такой вопрос: зачем лезть в ядро, не зная даже элементарных вещей, не говоря уже о сях, которые некоторые вообще в глаза не видели. [/off]