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

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Как узнать установлен на архиве пароль? 
:(
    Опции темы
Eleet
Дата 9.5.2005, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Необходимо узнать стоит ли на архиве пароль при обращении к архиву из приложения, если стоит, то необходимо выводить окно запроса пароля. Работа с архивом производится через консоль,поэтому перехват функций Windows не очень подходит.
PM MAIL   Вверх
Alex
Дата 9.5.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Перенесено из раздела Дельфи


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


Новичок



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

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



Поясняю : Архив WinRAR, распаковщик используется этот же, т.е. работа идёт с самим WinRar'ом только из командной строки, вопросы по поводу установлен ли сам WinRar уже решены, теперь стоит вопрос как узнать стоит ли на данном архиве пароль?

Это сообщение отредактировал(а) Girder - 10.5.2005, 13:09
PM MAIL   Вверх
kucik
Дата 10.5.2005, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.4.2004
Где: Russia, Murmansk

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



Немножко поправлю Eleet'a:
Используется архиватор WinRAR, а точнее его консольная версия .. модуль Rar.exe
Значится при помощи обращения к этому файлику с определёнными параметрами можно добится архивации и разархивации!
Нужно определить защищён ли архив паролем, так как при разархивации (если на архиве стоит пароль а мы его не вводим) происходит простой:
Привожу код запуска RAR'a (обрезан):
Код

...
 // Запускаем приложение 
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);  
    // Ожидаем завершения приложения ... а оно ждёт пока мы введём пароль :)
  if Result then  
    begin
      WaitForSingleObject(ProcInfo.hProcess, INFINITE);
      CloseHandle(ProcInfo.hProcess);
      CloseHandle(ProcInfo.hThread);
    end;
...

Поэтому надо как то обратится к архиву (непосредственно до архивации) и узнать стоит ли на архиве пароль, чтобы как только пользователь выбрал архив ... его любезно попросили ввести пароль!

Я думаю понятно изложил проблему!
Спасибо за ответы!!!
PM MAIL ICQ   Вверх
Alex
Дата 10.5.2005, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Плохо товарищи читаете замечательный файл Rar.txt, а в нем описан замечательный параметр:
Цитата
-p-    Не спрашивать пароль.

А еще в нем описаны коды возврата:
Цитата
Коды возврата
~~~~~~~~~~~~~

    В случае успешного завершения операции RAR выходит с нулевым (0) кодом
    возврата. Если операция прервана из-за ошибки, то код возврата будет
    ненулевым. (Коды возврата можно, например, использовать в пакетных
    файлах с помощью переменной ERRORLEVEL.)

    255  ПРЕРВАНО        Операция была прервана пользователем.
          ПОЛЬЗОВАТЕЛЕМ

      9  ОШИБКА СОЗДАНИЯ  Ошибка при создании файла

      8  ОШИБКА ПАМЯТИ    Недостаточно памяти для выполнения операции.

      7  ОШИБКА          Ошибка при указании команды/параметра в
          ПОЛЬЗОВАТЕЛЯ    командной строке.

      6  ОШИБКА ОТКРЫТИЯ  Произошла ошибка открытия файла.

      5  ОШИБКА ЗАПИСИ    Произошла ошибка записи на диск.

      4  ЗАБЛОКИРОВАННЫЙ  Попытка изменения архива, заблокированного
          АРХИВ            ранее командой 'k' или ключом '-k'.

      3  ОШИБКА CRC      Во время распаковки обнаружена ошибка CRC.

      2  ФАТАЛЬНАЯ        Произошла критическая ошибка.
          ОШИБКА

      1  ПРЕДУПРЕЖДЕНИЕ  Произошла некритическая ошибка.

      0  УСПЕШНОЕ        Работа завершена без ошибок.
          ЗАВЕРШЕНИЕ

И если вы попытаетесь обратиться к файлу, защищенному паролем с ключом -p-, то вам вернут код возврата 3. Дальше я думаю, объяснять не стоит.

PS:
Если решили работать с rar через консоль, то Rar.txt должен стать вашей настольной книгой.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
kucik
Дата 10.5.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.4.2004
Где: Russia, Murmansk

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



Пасибо Alex!
Насчёт кода возврата не подумал smile а про параметр /p- знаю ...
Только где его ловить этот код возврата? Выполнение этой строчки нам даёт логическое значение
Код

  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);  

т.е. если приложение завершилось, значит Result = True иначе False ...

Это сообщение отредактировал(а) kucik - 10.5.2005, 16:34
PM MAIL ICQ   Вверх
Alex
Дата 10.5.2005, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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





--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
kucik
Дата 10.5.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.4.2004
Где: Russia, Murmansk

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



Спасибо Alex! smile
Вот то, что вышло у меня smile :
Код

...   ...   ...
Function ExecAndWait(const FileName, Params: String; const WinState: Word; Var ExitCode: DWORD): boolean;
                                          // FileName = Имя внешней программы.
                                          // Params = Параметры, необходимые для запуска внешней программы
                                          // WinState = Указывает - как будет показано окно:
                                          //            SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_SHOWNORMAL
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: String;
begin
    // Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  ZeroMemory(@StartInfo, sizeof(StartInfo));
  with StartInfo do
    begin
      cb := SizeOf(StartInfo);
      dwFlags := STARTF_USESHOWWINDOW;
      wShowWindow := WinState;
    end;
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
    // Ожидаем завершения приложения
  if Result then
    begin
      while WaitforSingleObject(ProcInfo.hProcess,200)=WAIT_TIMEOUT do
        Application.ProcessMessages;
    // Получаем код возврата
      GetExitCodeProcess(ProcInfo.hProcess, ExitCode);
          //Free the Handles
      CloseHandle(ProcInfo.hProcess);
      CloseHandle(ProcInfo.hThread);
    end;
end;


Вызываю следующим образом (напишу, дабы у других вопросов не возникло):
Код

...
Var
  ErrCode : DWord;
...
  If ExecAndWait(RarPath, CmdLine, SW_SHOWNORMAL, ErrCode) = False then
    begin
      // Здёсь код, выполняемый при отсутствии запускаемой программы или подобной ошибке
      // (Программа не выполнилась)
    end
  else
    begin
      // Если программа выполнилась, то выполняется всё что здесь
      If ErrCode <= 0 then
        begin
          // Если код возврата <= 0 (т.е. в процессе выполнения сторонней программы ошибок не возникло), то
          // что-то делаем ...
        end
      else
        Case ErrCode of
          1  : begin
                end;
          ... : ... ... ...
        end;
    end;
...

Вопрос исчерпан!
Всё вроде работает!

Только остаётся вопрос по консоли RAR'a ... Как сделать так, чтобы не извлекая из архива его содержимое определить стоит ли пароль или нет? Так как если применить команду
Цитата
Rar.exe e -p- c:\abc.rar

то если на архиве не стоит пароль, то содержимое архива будет извлеченно!

Это сообщение отредактировал(а) kucik - 10.5.2005, 22:29
PM MAIL ICQ   Вверх
kucik
Дата 11.5.2005, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.4.2004
Где: Russia, Murmansk

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



Возник ещё один вопросик ...
В RAR'e есть такой ключик -ierr - перенаправление всех сообщений на стандартное устройство ошибки.
Как принять все эти сообщения?
Прочитал эту тему Запуск внешнего приложения, и слежение за тем, что оно пишет в консоли, но моя проблемма немного в другом (на мой взгляд), т.к. в моём случае информация уже выводится на стандартное устройство ошибки!?
Попробовал такой вариант:
Код

...
  if Result then
    begin
      Line := '';
      REPEAT
        Result := ReadFile(StartInfo.hStdError, Buffer, 255, BytesRead, nil);
        if BytesRead > 0 then
          begin
              // завершаем буфер PChar-ом
            Buffer[BytesRead] := #0;
              // добавляем буфер в общий вывод
            Line := Line + Buffer;
          end;
      UNTIL NOT Result or (BytesRead = 0);

      while WaitforSingleObject(ProcInfo.hProcess,200)=WAIT_TIMEOUT do
        Application.ProcessMessages;
...

... он не проходит, BytesRead всегда 0 smile
Alex Help Please!!!
Thanks!

Это сообщение отредактировал(а) kucik - 11.5.2005, 00:47
PM MAIL ICQ   Вверх
Alex
Дата 11.5.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Модератор: Пожалуйста, один топик - один вопрос. Тема закрыта.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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