Есть прога работает с файлами открывает пишет закрывает. Я сделал инжект dll в процесс этой проги и моя dll так же читает пишет один файл с которым работает прога. Иногда происходит блокировка. Прога открыла файл .. а моя dll не может читать писать. Что делать ? Точнее как получить хендлер уже открытого прогой файла и его юзать ? Или найти хендлекр и принудительно его закрыть а затем заново открыть свой файл с блекджеком и шлюхами ...
Что меня смущает -- не сказано с какими ошибками происходит чтение/запись файла. Т.е. я так понял, что новая dll пытается открыть файл и получает ошибку, что он уже открыт? Если так, надо перехватить CreateFile и сохранить HANDLE, который она возвращает при открытии целевого файла. Далее для операций использовать этот HANDLE. Единственная проблема -- делать это надо осторожно, т.к. если программа думает, что работает с файлом одна, то можно нечаянно преподнести ей сюрприз, записав в файл какие-то данные.
Случайно не STATUS_SHARING_VIOLATION(ERROR_SHARING_VIOLATION) ? Тогда необходимо остановить потоки, работающие с файлом и найти его описатель. Для этого нужно сделать слепок(SystemHandleInformation), найти описатель типа File, для каждого получить Nt-имя файла(ObjectNameInformation) и сравнить с необходимым(при необходимости сконвертировав его в Dos-имя, тоесть раскрыв символическую ссылку заранее). Получение слепка можно опустить, просто перечислив все описатели, но это плохой способ.
> я так понял, что новая dll пытается открыть файл и получает ошибку, что он уже открыт? да >Для этого нужно сделать слепок(SystemHandleInformation), найти описатель типа File, для каждого получить Nt-имя файла(ObjectNameInformation) и сравнить с необходимым(при >необходимости сконвертировав его в Dos-имя, тоесть раскрыв символическую ссылку заранее). Получение слепка можно опустить, просто перечислив все описатели, но это плохой способ. Спасибо. Я о чем то подобном и думал только не знал с какой стороны копать.
asmlamo С перехватом, тоже все не будет так уж просто ибо: 1.просто засунуь в самое начало push/ret или jmp уже не поможет ибо функцию нужно перехватывать ПОСЛЕ работы. 2. если вы перехватите CreateFileW (а по хорошему это нужно сделать) то получите кучу вызовов из разных сторонних библиотек, которые нужно будет обрабатывать. 3. если библиотека аттачится к процессу после его создания часть хандлов Вы рискуете потерять.