Если способы получить доступ на запись к заблокированному файлу другим процессом, не останавливая блокирующий процесc??
Приложение создает на диске файл и работает с ним - что-то пишет/читает. При этом доступ к файлу блокирующий - другие приложения не могут открыть файл на чтение/запись. Задача - внести изменение в файл не останавливая процесс, который блокирует файл. Есть программы типа Unlocker, которые снимают блокировку убивая блокирующий процесс - не годиться.
Это возможно, но сделать сложно. Надо уметь кодить и знать winapi. При этом менять содержимое файла не закрывая дескриптор - очень плохая идея. Во-первых это может сломать логику программы и она может покрашиться; либо запишет в файл что-то своё не зная о твоих изменениях и файл закосячится. Можно находить дескриптор файла и закрывать его. Тогда файл не закосячится, но программа всёравно от этого тоже может покрашиться. Унлокер кстати так и делает. Хз с чего ты взял, что он убивает процесс (может просто программа падала из-за вмешательства?). В общем идея хреновая, лучше этого не делать.
есть вариант, инжект кода в процесс, работаем с хедлом файла, в это время основной поток этого процесса ставим на паузу потом перед ResumeThread() восстанавливаем все (позиция в файле, и т.д.)
Я правильно понимаю идею?: 1. создать свой процесс. 2.В нем запустить в отдельном дочернем потоке программу, блокирующую доступ к файлу 3. Взять ссылку на хэдл к файлу у этого потока. Как получить хэндл дочернего потока к нужному файлу по имени файла??? 4. Изменить параметры доступа к файлу 5. Внести необходимые изменения сторонним приложением в файл 6.Восстановить параметры доступа к файлу.
>Как получить хэндл дочернего потока к нужному файлу по имени файла??? а не нужно конкретный поток, получаешь хендл файла и ставишь все потоки на паузу NtQuerySystemInformation(SYSTEM_HANDLE_INFORMATION, ...) - перечисление хендлов, найдешь свой
Найду свой handle. Дальше будет проверка прав доступа по параметру SECURITY_ATTRIBUTES... в которых права ограничены, в доступе к ресурсу будет отказано... разве не так? Понял, про инжект упустил..
Если пользователь - админ, и есть привилегия отладки, то вряд ли такое произойдёт. CloseHandle(hFile);
нашел нужный Handle, получил его дубликат. Но CloseHandle(dupHandle) не закрывает оригинальный хэндл... Пример взял отсуда: https://forum.sysinternals.com/howto-enumerate-handles_topic18892.html
Сейчас почитал то, что по ссылке. Там ведь написано, что DuplicateHandle с последним аргументом DUPLICATE_CLOSE_SOURCE = 1 как раз закрывает его в удалённом процессе. PHP: #define DUPLICATE_CLOSE_SOURCE 0x1DuplicateHandle(hProcess, hFile, NULL, NULL, 0, false, DUPLICATE_CLOSE_SOURCE);