Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Эксклюзивный доступ к файлу, Что бы никто не мог его залочить 
V
    Опции темы
ZBugz
  Дата 24.4.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



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

Заранее спасибо.
PM MAIL   Вверх
Alexeis
Дата 24.4.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Код

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;


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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ZBugz
Дата 24.4.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(Alexeis @ 24.4.2009,  10:55)
Код

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

Ну это точно 100% работает на запись, если вредная программа к нему обратиться ? И как его разлочить на время для моей программы, что бы плохая программа не успела влезть, точнее вообще не могла влезть или пусть лазиет, тока записи не мешает ?
PM MAIL   Вверх
Alexeis
Дата 24.4.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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

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

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

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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ZBugz
Дата 24.4.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(Alexeis @ 24.4.2009,  11:03)
 
Цитата

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



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

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

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

Да вот незнаю, просто программа не моя, даже не знаю как там все работает. 
PM MAIL   Вверх
CodeMonkey
Дата 24.4.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



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

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

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

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

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

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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
ZBugz
Дата 24.4.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(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 


PM MAIL   Вверх
Alexeis
Дата 24.4.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Без вмешательства в код той проги врядли выйдет...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ZBugz
Дата 24.4.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(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, но пока еще не перекомпелировали.

Это сообщение отредактировал(а) Rrader - 28.4.2009, 15:10
PM MAIL   Вверх
Akella
Дата 24.4.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



А если переименовать файл настроек и хранить в другом месте?
PM MAIL   Вверх
ZBugz
Дата 24.4.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



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

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



Это сообщение отредактировал(а) ZBugz - 24.4.2009, 12:16
PM MAIL   Вверх
CodeMonkey
Дата 24.4.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



А ваша программа (основная, не "защитник") на постоянке работает или: запустился, конфиг чё-то почитал, закрылся?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Akella
Дата 24.4.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

Добавлено через 35 секунд
Можно попробовать ещё вариант с удалением из процессов вражеской программы.
PM MAIL   Вверх
Valechik2
Дата 24.4.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



А есть такая функция API-  LockFile называется, пока твоя прога держит его хэндл никто ентот файл не откроет
PM MAIL   Вверх
ZBugz
Дата 25.4.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



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

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

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

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

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

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

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

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

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

В любом случаае мне бы примерчик того, как впихнуть комманду защитнику на разлочивание файла, когда основной программе понадобиться что то туда записать, но только именно ей, а не кому другому.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0929 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.