Есть процесс, хочется перечислить все открытые процессом файлы, но очень не хочется делать ему OpenProcess. То есть, понятно, что я могу перечислить все хендлы в системе, отобрать хендлы процесса по пиду, но чтобы получить, какой именно файл (путь к нему) ассоциирован с хендлом, мне нужно дублировать хендл в свой процесс, а для этого нужно делать OpenProcess, а я этого не хочу. Есть какие-то другие варианты? Я нашел апи Restart Manager'а, которое позволяет по конкретному файлу (по его пути) узнать, какой процесс держит на него хендл, но в обратную сторону, похоже, сделать нельзя, судя по апи. Может я что-то упустил в этом? Ну и да: само собой юзер мод, желательно от имени обычного мирского пользователя (не админа).
Возможно бред: Использовать NtQuerySystemInformation с параметром SystemHandleInformation, чтобы получить информацию о всех открытых хендлах в системе. Затем отфильтровать хендлы, связанные с твоим процессом, используя его PID, без необходимости вызывать OpenProcess https://habr.com/ru/companies/infopulse/articles/352060/
alex_dz, каждый хэндл значимый и особенный, и не важно сколько их, тысячи или мульоны тысяч(без них ничто бы в системе не работало). Нужно быть благодарным каждому хэндлу, без них, система не могла бы работать так гладко и безопасно
Я об этом и писал в первом сообщении, перечислить хендлы я могу, отобрать хендлы процесса я могу, отобрать среди них хендлы файлов я могу, но чтобы узнать по хендлу имя файла, с которым этот хендл ассоциирован, мне нужно дублировать хендл к себе в процесс, а для этого нужно делать OpenProcess. Или я чего-то не понимаю тут?
Чат гпт подсказывает забористое решение: Код (Text): HANDLE hSourceHandle = /* исходный хендл */; HANDLE hTargetHandle = NULL; // новый хендл if (DuplicateHandle(GetCurrentProcess(), hSourceHandle, GetCurrentProcess(), &hTargetHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) { // Дублирование хендла прошло успешно // Теперь у вас есть новый хендл hTargetHandle, который указывает на тот же объект, что и исходный хендл } else { // Обработка ошибки дублирования хендла }
Ну наконец-то. Только надо было на расте пример просить, а то только от одного вида сорца вся память утечет в переполняющийся буфер
Да, надо же было просто дублировать хендл из своего процесса в свой процесс, как же я об этом не подумал? С каждым днем убеждаюсь, что меня (как программиста) скоро заменит ии, ну ничего, пойду в лену ленину ногти пилить.
Иногда возникает необходимость узнать хэндл (или идентификатор) файла для последующей обработки или мониторинга. Часто возникает вопрос: каким образом можно получить этот идентификатор, особенно если у вас нет прямого доступа. Некоторые разработчики прибегают к методу, известному как "брутфорс" (brute force), чтобы получить хэндл. В некоторых ситуациях у разработчиков нет другого способа получить хэндл для файла, например, если файл находится внутри защищенной среды или если доступ ограничен. В таких случаях брутфорс может быть единственным способом получить необходимую информацию. Кроме того, при использовании брутфорса разработчики могут узнать больше о внутренней структуре системы и улучшить свои навыки взаимодействия с файловой системой.
Можно использовать драйвер Process Explorer'а для открытия процесса если не хочется из юзермода дергать OpenProcess.
Можно пойти другим путём: включить трассировку через ETW, подписавшись, например, на Microsoft-Windows-Kernel-File на события KERNEL_FILE_KEYWORD_CREATE и KERNEL_FILE_KEYWORD_CREATE_NEW_FILE, затем запустить процесс, и в интересующий момент остановить трассировку. Мы получим полный лог всех открытий и созданий файлов во всей системе. Распарсив dumpfile.xml, исключим все события, кроме событий от нашего процесса - и так поймём, что он открывал.
Можно через WMI попробовать запросить процессы. Походу CIM_Process дёргает апи с классом "SystemProcessInformation", т.к. логи получаю почти такие-же как в буфере апи. Но в списке есть поля как Pid так и Handle, хотя значения их у меня почему-то одинаковые (оба pid). Вот батник софтины WmiGen, может у тебя вернёт хэндл: Код (Text): @ECHO OFF :: WMI query to list selected or all properties and values of the \\root\CIMV2:CIM_Process class. :: This batch file was generated using the WMI Code Generator, Version 10.0.15.4 :: https://www.robvanderwoude.com/wmigen.php IF "%~1"=="" ( SET Node=%ComputerName% ) ELSE ( SET Node=%~1 ) FOR /F %%A IN ('WMIC.EXE /Node:"%Node%" Path CIM_Process Get /Format:CSV ^| MORE.COM /E +2 ^| FIND.EXE /C ","') DO ( IF %%A EQU 1 ( ECHO 1 instance: ) ELSE ( ECHO %%A instances: ) ) WMIC.EXE /Node:"%Node%" Path CIM_Process Get * /Format:Value
а такое не поможет Адцу русской демократии??? https://learn.microsoft.com/en-us/sysinternals/downloads/handle
Там как раз через перечисление хендлов сделано и сначала открывает через OpenProcess и если облом то через драйвер ProcessExplorer'а.
ТС просто много хочет - вот и приходится на Бренную мечтателя возвращать шерстить хэндлы даже в пределах собственного процесса является нарушением секуры, а Ему подавай из других процессов на уровне мирского юзверя.. губу раскатал да по всей палубе