|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|||||||||||
Функция QueryFullProcessImageName врёт и возвращает неправильный, уже не существующий, путь к исполняемому файлу21.04.2023, 13:30. Показов 5452. Ответов 63
Метки нет (Все метки)
Столкнулся сегодня с небывалом чудом. Функция QueryFullProcessImageName врёт и возвращает не правду, наглую ложь и враньё. Позор Microsoft'у! Я такого от Microsoft'а не ожидал, честно! Баг майкрософта!!!
Всё началось с того, что я решил написать простенькую функцию AppPath для получения пути к своему исполняемому файлу с учётом уникодных символов, с китайскими иероглифами или другими сложными уникодными символами, в пути, в именах папок. Конечно стандартный App.Path нам такого не вернёт, но в стандартном App.Path хотя бы не врёт с получением правильного пути. Хоть и не поддерживает уникод. Итак сначала я создал новый проект: Форма:
Переименовал свою папку с программой в "App.Path с китайскими иероглифами 拷贝" для теста, как будет работать функция. Запустил EXE и первый раз функция сработала правильно! Потом переименовал папку в другое имя, для проверки. Переименовал в "App.Path с китайскими иероглифами ñ" и решил проверить, в результате получил в пути старое имя папки! Майкрософтовская функция QueryFullProcessImageName даже и не подумала обновить путь к EXE-файлу! Ладно, подумал может это лёгкий баг и нужно просто перезапустить программу заного. Полностью закрыл, потом открыл программу снова! И то же самое! Опять старый путь с китайскими символами!!!! Я был в шоке! Потом 10 раз закрывал и перезапускал и всё так же старая папка с китайщиной. И самое смешное то, что стандартный App.Path правильно меняет путь и китайских символов в пути уже нет, НО конечно не поддерживает букву n диакритическую с тильдой сверху буквы. Вопрос почему функция майкрософта такая ерундовая!? И как правильно получать путь в уникоде чтобы небыло этой ерунды со старыми путями, после переименовывания папок...
1
|
|||||||||||
| 21.04.2023, 13:30 | |
|
Ответы с готовыми решениями:
63
Путь к исполняемому файлу Путь к исполняемому файлу |
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 21.04.2023, 13:50 [ТС] | |
|
Вы знаете, меня это поведение функции дико шокировало, конечно. Я только что проверил на других программах - тоже самое. После переименовывания папки любой программы, путь всегда будет старый почему-то.
Кстати, вот мой исходник. Для себя делаю вывод что функцией QueryFullProcessImageName лучше вообще никогда не пользоваться, если она постоянно врёт получается, стоит только переименовать папку и всё.
0
|
|
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 21.04.2023, 14:45 [ТС] | |
|
Самое смешное NtQueryInformationProcess возвращает тоже самое - старый путь, что за бред...
Добавлено через 15 минут А NtQuerySystemInformation не возвращает полные пути Проверим другие функции тогда... Добавлено через 4 минуты Попробуем функции PSAPI.DLL для интереса тогда ещё, хотя там минус что они не работают с 64-битными процессами, но всё же всё равно попробую для интереса Добавлено через 2 минуты Батюшки, а функции PSAPI.DLL работают правильно! Добавлено через 10 минут А так же работает правильно, если прочитать командную строку запуска процесса через ReadProcessMemory считывая структуру PEB, но это сложнее Добавлено через 1 минуту Легче всего тогда использовать функцию GetModuleFileNameExW учитывая что наш процесс это всегда 32 битный процесс то думаю всё будет работать на УРА
0
|
|
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||||||||||||||||
| 21.04.2023, 15:10 [ТС] | ||||||||||||||||
|
Всё! Готово! Просто поменял функцию QueryFullProcessImageName на GetModuleFileNameEx и всё заработало как надо! Теперь без обмана! Ура!!! Я справился с глюками майкрософта!
Просто поменял одну строчку
Кстати!!! Теперь так даже лучше стало! Теперь будет работать и в XP потому что, в отличии от QueryFullProcessImageName которая начиная только от Vista. Переименуйте папку с "App.Path с китайскими иероглифами" на "App.Path с китайскими иероглифами 拷贝" запустите потом AppPath.exe и увидите сами, что всё работает шикарно, как надо!
0
|
||||||||||||||||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 21.04.2023, 16:34 [ТС] | |
|
Мало того, я сейчас проверил, функция NtQueryInformationProcess врёт даже в XP!!! Просто, запустите любую программу, потом закройте эту программу, потом переименуйте папку с этой программой и всё! И начинается враньё! Показывает старый путь.
Добавлено через 2 минуты Тут даже программа ProcessHacker начинает показывать неправильно... Старый путь... И не загружается иконка к EXE файлу из-за этого... Добавлено через 3 минуты А стандартный диспетчер задач Windows 7 в колонке "Путь к образу" вообще ничего не выдаёт, полная пустота просто, если путь неправильный. Это реально глюк винды слушайте пипец просто... Добавлено через 2 минуты Ваш знаменитый ProcessExplorer думаю тоже споткнётся об эту ситуацию... Добавлено через 6 минут Вряд ли в Windows 10 исправили этот баг, но если у кого стоит десятка, проверьте пожалуйста
0
|
|
|
|
|
| 21.04.2023, 19:23 | |
|
Хмм, действительно какая-то дичь.
ProcMon: https://ibb.co/jb8kRMp PS. У меня кстати, DrawText из вашего примера ничего не рисует на форме почему-то, хз.
0
|
|
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||
| 21.04.2023, 19:48 [ТС] | ||
|
Добавлено через 2 минуты Dragokas, а у вас десятка наверное? и тоже глюк винды такой же?
0
|
||
|
|
|
| 21.04.2023, 19:59 | |
|
Спасибо, надо было сменить метрику на пиксели.
Потестировал на доступных системах: Win XP GetProcessImageFileName - Ложь GetModuleFileNameEx - Истина Win 7 QueryFullProcessImageName - Ложь GetProcessImageFileName - Ложь GetModuleFileNameEx - Истина Win 10 QueryFullProcessImageName - Истина GetProcessImageFileName - Истина GetModuleFileNameEx - Истина Win 11 QueryFullProcessImageName - Истина GetProcessImageFileName - Истина GetModuleFileNameEx - Истина NtQueryInformationProcess не проверял. Добавлено через 4 минуты ++ и на Windows 8.1 такой же баг.
0
|
|
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||
| 21.04.2023, 20:07 [ТС] | ||
|
Так в десятке этот глюк исправили что ли?
Добавлено через 1 минуту
0
|
||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 21.04.2023, 21:07 [ТС] | |
|
The trick, посмотри пожалуйста как написана функция QueryFullProcessImageName чего она так глючит
0
|
|
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||
| 21.04.2023, 21:16 [ТС] | ||
|
The trick любит анализировать функции и смотреть как они написаны
а вот WMI я как раз забыл проверить Добавлено через 3 минуты
0
|
||
|
|
|
| 21.04.2023, 21:21 | |
|
Когда речь идёт об Nt*/Zw* функциях, там уже не так просто анализировать, да и уже известно, информация о процессе там берётся из ядра, структура EPROCESS. Почитайте.
А вот каким образом туда попадает эта инфа, там уже будет цепочка вызовов по-длиннее, чем анализ 1 функции. Можно только строить предположения.
0
|
|
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 21.04.2023, 21:27 [ТС] | |
|
Лично я проверял что если читать структуру PEB то глюка никакого нет. Просто так геморно. Поэтому решил использовать GetModuleFileNameExW.
0
|
|
|
|
|
| 21.04.2023, 21:34 | |
|
HackerVlad, но раз вы уже добрались до PEB, тогда и сами в состоянии провести "отладку", просто возьмите любой редактор памяти, и подмените значение, где прописан путь к образу, и затем посмотрите, изменился ли ответ GetModuleFileNameExW. Судя по описанию на MSDN она смотрит путь в списке модулей самого процесса.
Раз пути в PEB и EPROCESS отличаются, то вот и частично ответ на ваш вопрос.
1
|
|
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||||||
| 23.04.2023, 00:57 [ТС] | ||||||
|
По совету The Trick решил использовать функцию GetModuleFileName простую для получения пути к EXE. Вместе с The Trick удалось создать неплохую функцию AppPath
1
|
||||||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
||
| 23.04.2023, 02:06 [ТС] | ||
|
0
|
||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|||||||
| 23.04.2023, 12:42 [ТС] | |||||||
0
|
|||||||
| 23.04.2023, 12:42 | |
|
Помогаю со студенческими работами здесь
20
Получить путь к исполняемому файлу
Как узнать путь к исполняемому файлу? Получить путь к исполняемому bat файлу Получить путь к исполняемому файлу службы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|