Просмотр полной версии : Доступ к заблокированному файлу
Если способы получить доступ на запись к заблокированному файлу другим процессом, не останавливая блокирующий процесc??
↑ (https://antichat.live/posts/4025391/)
Пожалуйста конкретней!
Приложение создает на диске файл и работает с ним - что-то пишет/читает. При этом доступ к файлу блокирующий - другие приложения не могут открыть файл на чтение/запись.
Задача - внести изменение в файл не останавливая процесс, который блокирует файл.
Есть программы типа Unlocker, которые снимают блокировку убивая блокирующий процесс - не годиться.
Это возможно, но сделать сложно. Надо уметь кодить и знать winapi.
При этом менять содержимое файла не закрывая дескриптор - очень плохая идея. Во-первых это может сломать логику программы и она может покрашиться; либо запишет в файл что-то своё не зная о твоих изменениях и файл закосячится.
Можно находить дескриптор файла и закрывать его. Тогда файл не закосячится, но программа всёравно от этого тоже может покрашиться. Унлокер кстати так и делает. Хз с чего ты взял, что он убивает процесс (может просто программа падала из-за вмешательства?).
В общем идея хреновая, лучше этого не делать.
master_555
19.12.2016, 02:53
есть вариант, инжект кода в процесс, работаем с хедлом файла,
в это время основной поток этого процесса ставим на паузу
потом перед ResumeThread() восстанавливаем все (позиция в файле, и т.д.)
↑ (https://antichat.live/posts/4026055/)
есть вариант, инжект кода в процесс, работаем с хедлом файла,
в это время основной поток этого процесса ставим на паузу
потом перед ResumeThread() восстанавливаем все (позиция в файле, и т.д.)
при "усыплении треда" разве освободится доступ к файлу?
master_555
20.12.2016, 02:00
работаем с тем же хедлом, но с другого потока
Я правильно понимаю идею?:
1. создать свой процесс.
2.В нем запустить в отдельном дочернем потоке программу, блокирующую доступ к файлу
3. Взять ссылку на хэдл к файлу у этого потока. Как получить хэндл дочернего потока к нужному файлу по имени файла???
4. Изменить параметры доступа к файлу
5. Внести необходимые изменения сторонним приложением в файл
6.Восстановить параметры доступа к файлу.
master_555
02.01.2017, 18:14
>Как получить хэндл дочернего потока к нужному файлу по имени файла???
а не нужно конкретный поток, получаешь хендл файла и ставишь все потоки на паузу
NtQuerySystemInformation(SYSTEM_HANDLE_INFORMATION , ...) - перечисление хендлов, найдешь свой
Найду свой handle. Дальше будет проверка прав доступа по параметру SECURITY_ATTRIBUTES... в которых права ограничены, в доступе к ресурсу будет отказано... разве не так?
Понял, про инжект упустил..
Кто-нибуть может подсказать как убить handle к файлу, также как это делает ProcessExplorere?
binarymaster
18.01.2017, 18:13
↑ (https://antichat.live/posts/4035143/)
Найду свой handle. Дальше будет проверка прав доступа по параметру SECURITY_ATTRIBUTES... в которых права ограничены, в доступе к ресурсу будет отказано... разве не так?
Если пользователь - админ, и есть привилегия отладки, то вряд ли такое произойдёт.
↑ (https://antichat.live/posts/4037093/)
Кто-нибуть может подсказать как убить handle к файлу, также как это делает ProcessExplorere?
CloseHandle(hFile);
↑ (https://antichat.live/posts/4037564/)
Если пользователь - админ, и есть привилегия отладки, то вряд ли такое произойдёт.
CloseHandle(hFile);
а получить hFile через DuplicateHandle?
binarymaster
18.01.2017, 21:30
↑ (https://antichat.live/posts/4037636/)
а получить hFile через DuplicateHandle?
Попробуйте.
↑ (https://antichat.live/posts/4037637/)
Попробуйте.
нашел нужный Handle, получил его дубликат. Но CloseHandle(dupHandle) не закрывает оригинальный хэндл...
Пример взял отсуда: https://forum.sysinternals.com/howto-enumerate-handles_topic18892.html
binarymaster
29.01.2017, 22:35
↑ (https://antichat.live/posts/4042071/)
нашел нужный Handle, получил его дубликат. Но CloseHandle(dupHandle) не закрывает оригинальный хэндл...
В общем-то как я и думал. Оригинальный закрывать надо, не дублируя его.
Пытаюсь закрыть оригинальный - CloseHandle((HANDLE)handle.Handle); - выбрасывет исключение...
binarymaster
30.01.2017, 00:22
↑ (https://antichat.live/posts/4042106/)
Пытаюсь закрыть оригинальный - CloseHandle((HANDLE)handle.Handle); - выбрасывет исключение...
Сейчас почитал то, что по ссылке.
Там ведь написано, что DuplicateHandle с последним аргументом DUPLICATE_CLOSE_SOURCE = 1 как раз закрывает его в удалённом процессе.
#define DUPLICATE_CLOSE_SOURCE 0x1
DuplicateHandle(hProcess,hFile,NULL,NULL,0,false,D UPLICATE_CLOSE_SOURCE);
Скопируй его, сделай что надо, потом удали. ПРОФИТ.
UPDATE: Программно тот же алгоритм.
binarymaster-у и всем кто принял участие в обсуждении спасибушки! Цель поражена!
binarymaster
30.01.2017, 23:29
Кто такой benmaster?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot