Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Эксклюзивный доступ к файлу


Автор: ZBugz 24.4.2009, 10:42
Всем привет.
Столкнулся с такой проблемой. Есть программа. Есть файл с конфигурацией, там все храниться. Его лочит одна плохая программа. И когда моя программа хочет туда записать данные, то она просто падает, так как там еще и ключи шифрования и т.д.
Так вот вопрос, как залочить файл так, что бы в него можно было писать данные.
Причем нужно именно так (в силу обстоятельст и особенности программы), будет файл, который запускаеться при запуске программы и лочит файл с настройками от всех, но когда основной программе нужно будет записать данные, то будет подаваться комманда и файл защитник будет разрешать запись именно этой программе и никому более вообще. Файл защитник должен быть просто файлом, а не драйвером, службой и т.д.
Мне бы примерчик  smile На самом деле очень сильно поможете, если все заработает.

Заранее спасибо.

Автор: Alexeis 24.4.2009, 10:55
Код

F := TFileStream.Create('c:\myfile.txt', fmOpenReadWrite or fmShareExclusive);


Добавлено через 3 минуты и 35 секунд
Вообще с файлами нужно работать примерно в таком ключе
Код

   try                                  
     F := TFileStream.Create('c:\myfile.txt', fmOpenReadWrite or fmShareExclusive);
     try
       //Делаем операции чтения и записи
     finally
       //Освобождаем занятые ресуры
     end;
   except
     ShowMessage('нет доступа к файлу');
   end;


Тогда все будет безопасно.

Автор: ZBugz 24.4.2009, 11:00
Цитата(Alexeis @ 24.4.2009,  10:55)
Код

F := TFileStream.Create('c:\myfile.txt', fmOpenReadWrite or fmShareExclusive);

Ну это точно 100% работает на запись, если вредная программа к нему обратиться ? И как его разлочить на время для моей программы, что бы плохая программа не успела влезть, точнее вообще не могла влезть или пусть лазиет, тока записи не мешает ?

Автор: Alexeis 24.4.2009, 11:03
Цитата(ZBugz @  24.4.2009,  10:00 Найти цитируемый пост)
Ну это точно 100% работает на запись, если вредная программа к нему обратиться ?

  Попробуйте, такой файл нельзя даже блокнотом открыть. 

Цитата(ZBugz @  24.4.2009,  10:00 Найти цитируемый пост)
И как его разлочить на время для моей программы, что бы плохая программа не успела влезть, точнее вообще не могла влезть или пусть лазиет, тока записи не мешает ? 

  Так не нужно разлочивать, просто используйте файловый поток F : TFileStream - для своих операций с данными. 

Аналогичный код можно сделать на API, если у вас работа с файлом на WinApi.

Автор: ZBugz 24.4.2009, 11:10
Цитата(Alexeis @ 24.4.2009,  11:03)
 
Цитата

 Так не нужно разлочивать, просто используйте файловый поток F : TFileStream - для своих операций с данными. 



А вот это что то не понял, мне бы в примере smile

Добавлено через 50 секунд
Цитата

Аналогичный код можно сделать на API, если у вас работа с файлом на WinApi.

Да вот незнаю, просто программа не моя, даже не знаю как там все работает. 

Автор: CodeMonkey 24.4.2009, 11:12
Цитата
Так не нужно разлочивать, просто используйте файловый поток F : TFileStream - для своих операций с данными

Я так понял, у него два процесса.

Цитата
И как его разлочить на время для моей программы

Если всё происходит в одном процессе - то как и сказал Alexeis. 
А если в разных, то я бы не разлочивал, а просто делал бы DuplicateHandle описателя файла во все свои процессы, которым нужен доступ. Ну и плюс синхронизация по мьютексу, чтоб одновременно никто в файл не писал.
Тогда все свои имеют доступ с расклонированного хэндла, что ты открыл "F := TFileStream.Create('c:\myfile.txt', fmOpenReadWrite or fmShareExclusive)", а все прочие - обламываются из-за fmShareExclusive.

Добавлено через 1 минуту и 16 секунд
Цитата
 просто программа не моя, даже не знаю как там все работает

А может быть всё же стоит рассказать о том, что у вас происходит? Ну нет здесь телепатов.
Сколько у вас процессов? Кто из них ваш? Чей код можете менять? И т.п.

Автор: ZBugz 24.4.2009, 11:28
Цитата(CodeMonkey @ 24.4.2009,  11:12)
Цитата
Так не нужно разлочивать, просто используйте файловый поток F : TFileStream - для своих операций с данными

Я так понял, у него два процесса.

Цитата
И как его разлочить на время для моей программы

Если всё происходит в одном процессе - то как и сказал Alexeis. 
А если в разных, то я бы не разлочивал, а просто делал бы DuplicateHandle описателя файла во все свои процессы, которым нужен доступ. Ну и плюс синхронизация по мьютексу, чтоб одновременно никто в файл не писал.
Тогда все свои имеют доступ с расклонированного хэндла, что ты открыл "F := TFileStream.Create('c:\myfile.txt', fmOpenReadWrite or fmShareExclusive)", а все прочие - обламываются из-за fmShareExclusive.

Добавлено @ 11:13
Цитата
 просто программа не моя, даже не знаю как там все работает

А может быть всё же стоит рассказать о том, что у вас происходит? Ну нет здесь телепатов.
Сколько у вас процессов? Кто из них ваш? Чей код можете менять? И т.п.

Щас обьясню еще раз smile 
Короче, есть программа, написанная не мною, она хранит множество настроек в файле. Есть программа конкурентов, они тырят эти настройки и лочат файл, а когда наша программа пытаеться что то туда записать при завершении работы, она обламываеться и ломаеться в итоге, потому что там еще ключи шифрования.
Программист гавнюк, да и особо не разбираеться в том коде, потому что он достался ему по наследству от другова программиста.
Ну вот родилась мысль, при страте программы, запускать мой защитник файла, и никого не пускать, кроме нашей программы, в тот момент когда ей надо туда записать данные. 
Так как тут я чайНеГ smile , хотелось бы пример какой нибудь  smile А то это сложно для меня smile Но ОЧЕНЬ КРАЙНЕ ВАЖНО !!! Поэтому очень прошу помощи smile 


Автор: Alexeis 24.4.2009, 12:02
  Без вмешательства в код той проги врядли выйдет...

Автор: ZBugz 24.4.2009, 12:06
Цитата(Alexeis @ 24.4.2009,  12:02)
Без вмешательства в код той проги врядли выйдет...

Код

procedure TPagedFile.OpenFile;
var
  fileOpenMode: Word;
begin
  if FActive then exit;  

  // store user specified mode
  FUserMode := FMode;
  if not (FMode in [pfMemoryCreate, pfMemoryOpen]) then
  begin
    // test if file exists
    if not FileExists(FFileName) then
    begin
      // if auto-creating, adjust mode
      if FAutoCreate then case FMode of
        pfExclusiveOpen:             FMode := pfExclusiveCreate;
        pfReadWriteOpen, pfReadOnly: FMode := pfReadWriteCreate;
      end;
      // it seems the VCL cannot share a file that is created?
      // create file first, then open it in requested mode
      // filecreated means 'to be created' in this context ;-)
      if FileCreated then
        FileClose(FileCreate(FFileName))
      else
        raise EPagedFile.CreateFmt(STRING_FILE_NOT_FOUND,[FFileName]);
    end;
    // specify open mode
    case FMode of
      //////////////Изменения/////////////
      //pfExclusiveCreate: fileOpenMode := fmOpenReadWrite or fmShareDenyWrite;
      //pfExclusiveOpen:   fileOpenMode := fmOpenReadWrite or fmShareDenyWrite;
      pfExclusiveCreate: fileOpenMode := fmOpenReadWrite or fmShareExclusive;
      pfExclusiveOpen:   fileOpenMode := fmOpenReadWrite or fmShareExclusive;
      //////////////Изменения/////////////
      //pfReadWriteCreate: fileOpenMode := fmOpenReadWrite or fmShareDenyNone;
     // pfReadWriteOpen:   fileOpenMode := fmOpenReadWrite or fmShareDenyNone;
      pfReadWriteCreate: fileOpenMode := fmOpenReadWrite or fmShareExclusive;
      pfReadWriteOpen:   fileOpenMode := fmOpenReadWrite or fmShareExclusive;
    else    // => readonly
                        // fileOpenMode := fmOpenRead or fmShareDenyNone;
                         fileOpenMode := fmOpenReadWrite or fmShareExclusive;
    end;
    // open file
    FStream := TFileStream.Create(FFileName, fileOpenMode);
    // if creating, then empty file
    if FileCreated then
      FStream.Size := 0;
  end else begin
    if FStream = nil then
    begin
      FMode := pfMemoryCreate;
      FStream := TMemoryStream.Create;
    end;
  end;
  // init size var
  FCachedSize := Stream.Size;
  // update whether we need locking
{$ifdef _DEBUG}
  FNeedLocks := true;
{$else}
  FNeedLocks := IsSharedAccess;
{$endif}
  FActive := true;
end;

Вот кусок кода компонента, я там все переправил на fmOpenReadWrite or fmShareExclusive, но пока еще не перекомпелировали.

Автор: Akella 24.4.2009, 12:06
А если переименовать файл настроек и хранить в другом месте?

Автор: ZBugz 24.4.2009, 12:13
Цитата(Akella @ 24.4.2009,  12:06)
А если переименовать файл настроек и хранить в другом месте?

Ну мысль была такая, но че то видимо не осили программист. Я так и предлагал, что бы каждый раз , к примеру, менялось название файла, ну и само название куда нить шифровать. В итоге был послан на х... smile


Автор: 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
Цитата(CodeMonkey @ 24.4.2009,  13:49)
А ваша программа (основная, не "защитник") на постоянке работает или: запустился, конфиг чё-то почитал, закрылся?

В том то и дело что он постоянно открыт и не закрываеться.

Добавлено через 3 минуты и 6 секунд
Цитата

Проблема ещё может быть в том, что файл настроек может быть заблокирован ДО запуска вашей программы.

Это тоже есть. Но в этом случае ошибка то будет, но программа работает, если файл разлочить.
Хотя я тут вчера тести, залочил файл, все комбинации перепробывал с программой, не падает. Мне уже кажеться, что на самом деле два варианта: или программа в какой то момент файл упускает и закрывает или другая программа тупо портит файл, когда программа его не открыла еще.
Цитата

Можно попробовать ещё вариант с удалением из процессов вражеской программы.

Нельзя, политика фирмы  smile

Добавлено через 5 минут и 25 секунд
Цитата(Valechik2 @ 24.4.2009,  21:28)
А есть такая функция API-  LockFile называется, пока твоя прога держит его хэндл никто ентот файл не откроет

Почитаю на досуге.

В любом случаае мне бы примерчик того, как впихнуть комманду защитнику на разлочивание файла, когда основной программе понадобиться что то туда записать, но только именно ей, а не кому другому.

Автор: CodeMonkey 25.4.2009, 14:00
Цитата(ZBugz @  25.4.2009,  13:14 Найти цитируемый пост)
В том то и дело что он постоянно открыт и не закрываеться.

Вообще-то я про программу спрашивал, а не про файл - дабы предотвратить ситуации когда файл заблокирован ещё до запуска вашей программы.
А в вашей проге и так понятно, что файл нужно открывать с эксклюзивным доступом в самом начале работы и не отпускать его до конца.

Автор: Akella 25.4.2009, 14:16
Цитата(ZBugz @  25.4.2009,  13:14 Найти цитируемый пост)
Нельзя, политика фирмы  smile

я тогда вообще ничего не понимаю, бред какой-то, извините за выражение

Автор: ZBugz 27.4.2009, 07:41
Цитата(Akella @ 25.4.2009,  14:16)
Цитата(ZBugz @  25.4.2009,  13:14 Найти цитируемый пост)
Нельзя, политика фирмы  smile

я тогда вообще ничего не понимаю, бред какой-то, извините за выражение

Да тут к сожалению все сложно для них :( Как говориться ум за разум зашел. smile

Добавлено через 4 минуты и 53 секунды
Цитата(CodeMonkey @ 25.4.2009,  14:00)
Цитата(ZBugz @  25.4.2009,  13:14 Найти цитируемый пост)
В том то и дело что он постоянно открыт и не закрываеться.

Вообще-то я про программу спрашивал, а не про файл - дабы предотвратить ситуации когда файл заблокирован ещё до запуска вашей программы.

А smile Программа запускаеться пользователем, она конечно не запущенна постоянно smile Т.е. когда нужно с ней работать, тогда и запускают.


З.Ы. А по поводу порчи файла до запуска программы тут двояко. Если файл испорчен, то программа не запускаеться. Вроде как и заранее испорчен файл, но в тоже время, когда он еще живой, апускаешь свою программу, запускаеться программа вредитель и наша программа работает, в какой то момент она пишет ошибку, что файл используеться другой программой, ну и после чего падает, так как записать ключи не смогла. Поэтому получаеться что где то она все таки файл отпускает и плохая программа пишет туда что то. Хотя возможен вариант, что просто на лету перехватываеться и модифицируеться ключь, но хз, там все шифрованно.

Автор: CodeMonkey 27.4.2009, 09:57
Цитата
Поэтому получаеться что где то она все таки файл отпускает

Ну так просмотрите код и найдите, где она это делает. Затем исправьте - пусть программа держит файл на всём протяжении работы.

Цитата
на лету перехватываеться и модифицируеться ключь

Мы сейчас говорим о взломе?

Автор: ZBugz 27.4.2009, 15:24
Цитата

Ну так просмотрите код и найдите, где она это делает. Затем исправьте - пусть программа держит файл на всём протяжении работы.

Ну вот только тот кусок кода который я дал, он и открывает. Я поправил, но как всегда еще три года ждать пока программист перекомпилирует.
Цитата

Мы сейчас говорим о взломе?

Да, именно о нем. Т.е. там 100% взлом идет, тырят настройки и т.д. и вот ладно бы тырили бы, так программа падает. Тут главное что бы программа работала, а уж все остальное потом...

Автор: CodeMonkey 27.4.2009, 17:33
Цитата
он и открывает

Ну это понятно, ну а закрывает-то она его где?

Цитата
Т.е. там 100% взлом идет, тырят настройки и т.д.

Не, если речь о взломе, то никакими установками масок доступа вы не отделаетесь. Вам тогда в топики про анти-кряк.

Автор: ZBugz 28.4.2009, 08:03
Цитата

Ну это понятно, ну а закрывает-то она его где?

Закрывает тока при выходе. Вот кусок файла от компонента, там где она его открывает. Я там подправил.
Цитата

Не, если речь о взломе, то никакими установками масок доступа вы не отделаетесь. Вам тогда в топики про анти-кряк.

Ну на взлом пофигу, лишь бы не падало.

Автор: CodeMonkey 28.4.2009, 08:52
Я тогда теперь тоже ничего не понимаю:
1. Вас не волнуют проблемы блокировки файла до запуска программы:

Цитата
>>> Проблема ещё может быть в том, что файл настроек может быть заблокирован ДО запуска вашей программы.
Это тоже есть. Но в этом случае ошибка то будет, но программа работает, если файл разлочить.


2. Вы говорите, что программа держит файл на всём протяжении работы. С учётом того, что даже до исправления код не давал доступ на запись - совершенно непонятно, как могут быть какие-то проблемы.

3. Далее, вы говорите, что "вражина" ломает вашу программу: 
Цитата
там 100% взлом идет, тырят настройки и т.д. и вот ладно бы тырили бы, так программа падает.
 и тут же говорите, что не собираетесь ему противодействовать: 
Цитата
Ну на взлом пофигу, лишь бы не падало. 


Что-то у вас противоречие на противоречии сидит.

Автор: ZBugz 28.4.2009, 14:09
Цитата

Я тогда теперь тоже ничего не понимаю:

Сейчас обьясню необьяснимое smile
Цитата

1. Вас не волнуют проблемы блокировки файла до запуска программы:

Да, не волнует, тут важна работоспособность программы, те.е. когда плохую программу закроют, главаное что бы наша работала, а не падала.
Цитата

2. Вы говорите, что программа держит файл на всём протяжении работы. С учётом того, что даже до исправления код не давал доступ на запись - совершенно непонятно, как могут быть какие-то проблемы.

Ну тут так, это я думаю что так, и программист говорит так, тока выходит в итоге не так получаеться. Вот в этом то и проблемма. Я поэтому и спросил у Вас, может он или я что то не понимаем  smile 
Цитата

3. Далее, вы говорите, что "вражина" ломает вашу программу: 
Цитата
там 100% взлом идет, тырят настройки и т.д. и вот ладно бы тырили бы, так программа падает.
 и тут же говорите, что не собираетесь ему противодействовать: 
Цитата
Ну на взлом пофигу, лишь бы не падало. 


А это политика фирмы такая, я тут ниче поделать не могу, главное работоспособность, а то что тырят, это дело 20-е.

Просто после каждого падения нашей программы, приходиться ее заново ставить, а это накладно.


А в том файле код правильный ? На предмет полный блокировки от изменений из вне ? Или все таки есть какие то срадства, нестандартные, которые могут это обойти ?

Автор: CodeMonkey 28.4.2009, 14:57
Цитата
те.е. когда плохую программу закроют, главаное что бы наша работала, а не падала.

(вздох) Ещё раз: ваша программа работает одновременно с "плохой" или нет? Зачем вообще запускают плохую программу? 
А если плохую программу закрыли, и вы при этом вылетели, то, однозначно же, что ваш файл испортили. 

Цитата
Я поэтому и спросил у Вас, может он или я что то не понимаем

То, что вас тут никто не понимает - это точно ;)

Цитата
А в том файле код правильный ?

fmShareExclusive не даст никому писать в файл, пока вы его держите открытым. Разумеется, речь идёт о легальных путях, а не о взломе. Опять-таки, не ясно, чего вы так печётесь о блокировке, если файл-то открывать больше некому: сами только что сказали, что плохую программу закрывают до запуска вашей.

Автор: ZBugz 29.4.2009, 08:06
Цитата(CodeMonkey @ 28.4.2009,  14:57)


Цитата

(вздох) Ещё раз: ваша программа работает одновременно с "плохой" или нет? Зачем вообще запускают плохую программу? 

А это так надо клиентам. На самом деле есть много программа конкурентов, клиенты пользуют их как хотя, хоть одновременно, хоть по очереди, тут от нас не зависит.
Цитата

А если плохую программу закрыли, и вы при этом вылетели, то, однозначно же, что ваш файл испортили. 

Да, именно так. Причем уже и тем же unlocker все было проверенно, что плохая программа держит наш файл при запуске.
Цитата

То, что вас тут никто не понимает - это точно ;)

 smile Там темная история программиста
Цитата

fmShareExclusive не даст никому писать в файл, пока вы его держите открытым. Разумеется, речь идёт о легальных путях, а не о взломе.

Т.е. я правильно все исправил ?
 
Цитата

Опять-таки, не ясно, чего вы так печётесь о блокировке, если файл-то открывать больше некому: сами только что сказали, что плохую программу закрывают до запуска вашей.

Нет, там и открывают и нет. Все от пользователя зависит. Просто есть моменты, когда пользователю нужно, для удобства, что бы все программы были открыты

Автор: CodeMonkey 29.4.2009, 10:34
Цитата
плохая программа держит наш файл при запуске

КАК она может держать файл, если её ЗАКРЫЛИ???!!!!

Автор: ZBugz 29.4.2009, 13:13
Цитата(CodeMonkey @ 29.4.2009,  10:34)
Цитата
плохая программа держит наш файл при запуске

КАК она может держать файл, если её ЗАКРЫЛИ???!!!!

Не, в этом случае конечно не держит  smile Имееться ввиду что даже если наша программа закрыта, а плохая открылась, она все равно лезет в этот файл.

Автор: ZBugz 4.5.2009, 13:28
Все, большое спасибо всем. Этот кусок исправленного когда помог  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)