| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Эксклюзивный доступ к файлу |
| Автор: ZBugz 24.4.2009, 10:42 |
| Всем привет. Столкнулся с такой проблемой. Есть программа. Есть файл с конфигурацией, там все храниться. Его лочит одна плохая программа. И когда моя программа хочет туда записать данные, то она просто падает, так как там еще и ключи шифрования и т.д. Так вот вопрос, как залочить файл так, что бы в него можно было писать данные. Причем нужно именно так (в силу обстоятельст и особенности программы), будет файл, который запускаеться при запуске программы и лочит файл с настройками от всех, но когда основной программе нужно будет записать данные, то будет подаваться комманда и файл защитник будет разрешать запись именно этой программе и никому более вообще. Файл защитник должен быть просто файлом, а не драйвером, службой и т.д. Мне бы примерчик Заранее спасибо. |
| Автор: Alexeis 24.4.2009, 10:55 | ||||
Добавлено через 3 минуты и 35 секунд Вообще с файлами нужно работать примерно в таком ключе
Тогда все будет безопасно. |
| Автор: ZBugz 24.4.2009, 11:00 | ||||
Ну это точно 100% работает на запись, если вредная программа к нему обратиться ? И как его разлочить на время для моей программы, что бы плохая программа не успела влезть, точнее вообще не могла влезть или пусть лазиет, тока записи не мешает ? |
| Автор: ZBugz 24.4.2009, 11:10 | ||||||
А вот это что то не понял, мне бы в примере Добавлено через 50 секунд
Да вот незнаю, просто программа не моя, даже не знаю как там все работает. |
| Автор: CodeMonkey 24.4.2009, 11:12 | ||||||
Я так понял, у него два процесса.
Если всё происходит в одном процессе - то как и сказал Alexeis. А если в разных, то я бы не разлочивал, а просто делал бы DuplicateHandle описателя файла во все свои процессы, которым нужен доступ. Ну и плюс синхронизация по мьютексу, чтоб одновременно никто в файл не писал. Тогда все свои имеют доступ с расклонированного хэндла, что ты открыл "F := TFileStream.Create('c:\myfile.txt', fmOpenReadWrite or fmShareExclusive)", а все прочие - обламываются из-за fmShareExclusive. Добавлено через 1 минуту и 16 секунд
А может быть всё же стоит рассказать о том, что у вас происходит? Ну нет здесь телепатов. Сколько у вас процессов? Кто из них ваш? Чей код можете менять? И т.п. |
| Автор: ZBugz 24.4.2009, 11:28 | ||||||||
Щас обьясню еще раз Короче, есть программа, написанная не мною, она хранит множество настроек в файле. Есть программа конкурентов, они тырят эти настройки и лочат файл, а когда наша программа пытаеться что то туда записать при завершении работы, она обламываеться и ломаеться в итоге, потому что там еще ключи шифрования. Программист гавнюк, да и особо не разбираеться в том коде, потому что он достался ему по наследству от другова программиста. Ну вот родилась мысль, при страте программы, запускать мой защитник файла, и никого не пускать, кроме нашей программы, в тот момент когда ей надо туда записать данные. Так как тут я чайНеГ |
| Автор: Alexeis 24.4.2009, 12:02 |
| Без вмешательства в код той проги врядли выйдет... |
| Автор: ZBugz 24.4.2009, 12:06 | ||||
Вот кусок кода компонента, я там все переправил на fmOpenReadWrite or fmShareExclusive, но пока еще не перекомпелировали. |
| Автор: Akella 24.4.2009, 12:06 |
| А если переименовать файл настроек и хранить в другом месте? |
| Автор: ZBugz 24.4.2009, 12:13 | ||
Ну мысль была такая, но че то видимо не осили программист. Я так и предлагал, что бы каждый раз , к примеру, менялось название файла, ну и само название куда нить шифровать. В итоге был послан на х... |
| Автор: CodeMonkey 24.4.2009, 13:49 |
| А ваша программа (основная, не "защитник") на постоянке работает или: запустился, конфиг чё-то почитал, закрылся? |
| Автор: Akella 24.4.2009, 15:33 |
| Проблема ещё может быть в том, что файл настроек может быть заблокирован ДО запуска вашей программы. Добавлено через 35 секунд Можно попробовать ещё вариант с удалением из процессов вражеской программы. |
| Автор: Valechik2 24.4.2009, 21:28 |
| А есть такая функция API- LockFile называется, пока твоя прога держит его хэндл никто ентот файл не откроет |
| Автор: ZBugz 25.4.2009, 13:14 | ||||||||
В том то и дело что он постоянно открыт и не закрываеться. Добавлено через 3 минуты и 6 секунд
Это тоже есть. Но в этом случае ошибка то будет, но программа работает, если файл разлочить. Хотя я тут вчера тести, залочил файл, все комбинации перепробывал с программой, не падает. Мне уже кажеться, что на самом деле два варианта: или программа в какой то момент файл упускает и закрывает или другая программа тупо портит файл, когда программа его не открыла еще.
Нельзя, политика фирмы Добавлено через 5 минут и 25 секунд
Почитаю на досуге. В любом случаае мне бы примерчик того, как впихнуть комманду защитнику на разлочивание файла, когда основной программе понадобиться что то туда записать, но только именно ей, а не кому другому. |
| Автор: CodeMonkey 25.4.2009, 14:00 |
Вообще-то я про программу спрашивал, а не про файл - дабы предотвратить ситуации когда файл заблокирован ещё до запуска вашей программы. А в вашей проге и так понятно, что файл нужно открывать с эксклюзивным доступом в самом начале работы и не отпускать его до конца. |
| Автор: Akella 25.4.2009, 14:16 |
я тогда вообще ничего не понимаю, бред какой-то, извините за выражение |
| Автор: ZBugz 27.4.2009, 07:41 | ||||
Да тут к сожалению все сложно для них :( Как говориться ум за разум зашел. Добавлено через 4 минуты и 53 секунды
А З.Ы. А по поводу порчи файла до запуска программы тут двояко. Если файл испорчен, то программа не запускаеться. Вроде как и заранее испорчен файл, но в тоже время, когда он еще живой, апускаешь свою программу, запускаеться программа вредитель и наша программа работает, в какой то момент она пишет ошибку, что файл используеться другой программой, ну и после чего падает, так как записать ключи не смогла. Поэтому получаеться что где то она все таки файл отпускает и плохая программа пишет туда что то. Хотя возможен вариант, что просто на лету перехватываеться и модифицируеться ключь, но хз, там все шифрованно. |
| Автор: CodeMonkey 27.4.2009, 09:57 | ||||
Ну так просмотрите код и найдите, где она это делает. Затем исправьте - пусть программа держит файл на всём протяжении работы.
Мы сейчас говорим о взломе? |
| Автор: ZBugz 27.4.2009, 15:24 | ||||
Ну вот только тот кусок кода который я дал, он и открывает. Я поправил, но как всегда еще три года ждать пока программист перекомпилирует.
Да, именно о нем. Т.е. там 100% взлом идет, тырят настройки и т.д. и вот ладно бы тырили бы, так программа падает. Тут главное что бы программа работала, а уж все остальное потом... |
| Автор: CodeMonkey 27.4.2009, 17:33 | ||||
Ну это понятно, ну а закрывает-то она его где?
Не, если речь о взломе, то никакими установками масок доступа вы не отделаетесь. Вам тогда в топики про анти-кряк. |
| Автор: ZBugz 28.4.2009, 08:03 | ||||
Закрывает тока при выходе. Вот кусок файла от компонента, там где она его открывает. Я там подправил.
Ну на взлом пофигу, лишь бы не падало. |
| Автор: CodeMonkey 28.4.2009, 08:52 | ||||||
| Я тогда теперь тоже ничего не понимаю: 1. Вас не волнуют проблемы блокировки файла до запуска программы:
2. Вы говорите, что программа держит файл на всём протяжении работы. С учётом того, что даже до исправления код не давал доступ на запись - совершенно непонятно, как могут быть какие-то проблемы. 3. Далее, вы говорите, что "вражина" ломает вашу программу:
Что-то у вас противоречие на противоречии сидит. |
| Автор: ZBugz 28.4.2009, 14:09 | ||||||||||||
Сейчас обьясню необьяснимое
Да, не волнует, тут важна работоспособность программы, те.е. когда плохую программу закроют, главаное что бы наша работала, а не падала.
Ну тут так, это я думаю что так, и программист говорит так, тока выходит в итоге не так получаеться. Вот в этом то и проблемма. Я поэтому и спросил у Вас, может он или я что то не понимаем
А это политика фирмы такая, я тут ниче поделать не могу, главное работоспособность, а то что тырят, это дело 20-е. Просто после каждого падения нашей программы, приходиться ее заново ставить, а это накладно. А в том файле код правильный ? На предмет полный блокировки от изменений из вне ? Или все таки есть какие то срадства, нестандартные, которые могут это обойти ? |
| Автор: CodeMonkey 28.4.2009, 14:57 | ||||||
(вздох) Ещё раз: ваша программа работает одновременно с "плохой" или нет? Зачем вообще запускают плохую программу? А если плохую программу закрыли, и вы при этом вылетели, то, однозначно же, что ваш файл испортили.
То, что вас тут никто не понимает - это точно ;)
fmShareExclusive не даст никому писать в файл, пока вы его держите открытым. Разумеется, речь идёт о легальных путях, а не о взломе. Опять-таки, не ясно, чего вы так печётесь о блокировке, если файл-то открывать больше некому: сами только что сказали, что плохую программу закрывают до запуска вашей. |
| Автор: ZBugz 29.4.2009, 08:06 | ||||||||||||
А это так надо клиентам. На самом деле есть много программа конкурентов, клиенты пользуют их как хотя, хоть одновременно, хоть по очереди, тут от нас не зависит.
Да, именно так. Причем уже и тем же unlocker все было проверенно, что плохая программа держит наш файл при запуске.
Т.е. я правильно все исправил ?
Нет, там и открывают и нет. Все от пользователя зависит. Просто есть моменты, когда пользователю нужно, для удобства, что бы все программы были открыты |
| Автор: CodeMonkey 29.4.2009, 10:34 | ||
КАК она может держать файл, если её ЗАКРЫЛИ???!!!! |
| Автор: ZBugz 29.4.2009, 13:13 | ||||
Не, в этом случае конечно не держит |
| Автор: ZBugz 4.5.2009, 13:28 |
| Все, большое спасибо всем. Этот кусок исправленного когда помог |