|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|||||||||||
Функция QueryFullProcessImageName врёт и возвращает неправильный, уже не существующий, путь к исполняемому файлу21.04.2023, 13:30. Показов 5485. Ответов 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 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|