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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оболочка Shell-информация о дисках. 
:(
    Опции темы
tricky
Дата 22.4.2005, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как мне удалось выяснить Win2k/XP получает информацию о дисках, а
именно меня интересует тип диска (CD-ROM, жесткий и т.п.) из функций
библиотеки shell32.dll, а не функцией GetDriveTypeA. У меня такое
ощущение, что инфа о типах диска получается на старте Win2k/WinXP
запоминается и затем в процессе работы винды больше не обновляется.
Т.е. нажатие F5 не приводит к обновлению инфы о типах диска. Эти
сведения я получил след.образом: внедрился в адресное простанство
explorer перехватил функцию SHGetFileInfo, которая возвращает инфу о
типах диска разместил там код windows.beep(500, 100), это означало что должен
был происходить писк в случая обновления инфы о типе диска. Писк я так
и не услышал (перехват выполнен на 100% в этом сомнения нет).

Вопрос: Как заставить обновляться инфу о типах диска в explorer'e во время работы
Win2k/XP
PM MAIL   Вверх
Rouse_
Дата 24.4.2005, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну это очень глупый способ. Перехватил ты что? Что-то но никак не АПИ функцию, которая вполне возможно подгрузилась динамически, а не через IAT. Ну а типы диска определить достаточно просто, не спускаясь на второе кольцо:

Код

procedure TForm1.Button1Click(Sender: TObject);
const
  NameSize = 4;
  VolumeCount = 26;
  TotalSize = NameSize * VolumeCount;
  Report = 'Volume: %s %s';
var
  Buff, Volume: String;
  I, Count: Integer;
begin
  SetLength(Buff, TotalSize);
  Count := GetLogicalDriveStrings(TotalSize, @Buff[1]) div NameSize;
  if Count = 0 then
    Memo1.Lines.Add(SysErrorMessage(GetLastError))
  else
    for I := 0 to Count - 1 do
    begin
      Volume := PChar(@Buff[(I * NameSize) + 1]);
      case GetDriveType(PChar(Volume)) of
        DRIVE_UNKNOWN: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive type cannot be determined.']));
        DRIVE_NO_ROOT_DIR: Memo1.Lines.Add(Format(Report, [Volume,
          'The root path is invalid. For example, no volume is mounted at the path.']));
        DRIVE_REMOVABLE: Memo1.Lines.Add(Format(Report, [Volume,
          'The disk can be removed from the drive.']));
        DRIVE_FIXED: Memo1.Lines.Add(Format(Report, [Volume,
          'The disk cannot be removed from the drive.']));
        DRIVE_REMOTE: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive is a remote (network) drive.']));
        DRIVE_CDROM: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive is a CD-ROM drive.']));
        DRIVE_RAMDISK: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive is a RAM disk.']));
      else
        Memo1.Lines.Add(Format(Report, [Volume, 'Xpen znaet chto :)']));
      end;
    end;
end;


Ну а обновление по всей видимости будем производить по такому вот событию:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, MMSystem;

type
  TForm1 = class(TForm)
  public
    procedure CD(var Msg: TMessage); message WM_DEVICECHANGE;
  end;

const
  CD_DEVICE_ENABLE = $8000;
  CD_DEVICE_DISABLE = $8004;
  NETFOLDER_MAP = CD_DEVICE_ENABLE;
  NETFOLDER_UNMAP = CD_DEVICE_DISABLE;
  DEVICE_FLASH = $7;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.CD(var Msg: TMessage);
begin
  case Msg.WParam of
    DEVICE_FLASH: Caption := 'Flash change';
    CD_DEVICE_ENABLE: Caption := 'CD close with new disk';
    CD_DEVICE_DISABLE: Caption := 'CD open';
    //NETFOLDER_MAP: Caption := 'New network disk maped';
    //NETFOLDER_UNMAP: Caption := 'Network disk unmaped';
  else
    Caption := 'Unknown';
  end;
end;

end.

Маленький коментарий:
При открытии сидирома срабатывает DEVICE_DISABLE, при закрытии DEVICE_ENABLE
При подключении сетевого диска также приходит DEVICE_ENABLE а при отключении DEVICE_DISABLE
При подключении или отключении флэшки срабатывает DEVICE_FLASH...



--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
tricky
  Дата 26.4.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Rouse_ @ 24.4.2005, 23:40)
Ну это очень глупый способ. Перехватил ты что?
............................
флэшки срабатывает DEVICE_FLASH...

Ты неправильно меня понял мне не нужно использовать функцию GetDriveType. Суть состоит в следующем я с помощью своего компонента InterceptorJmp(в скором времени появится на www.torry.net - аналога для DELPHI не существует) осуществляю перехват GetDriveType и вместо жестких дисков возращаю результат CD_ROM после чего файловый менеджер Windows Comander вместо жестких отображает CD-Rom'ы. В мой компьютере так не получится так как процесс explorer не использует GetDriveType а использует shell-функцию. Я могу перехватить эту shell - функцию, но т.к. результат этой функция запоминается один раз при старте системы,
то при дальнейшей ситуации обновлении инфы о дисках не происходит. Как заставить обновится инфу о дисках через shell - функцию.
PM MAIL   Вверх
Rouse_
Дата 27.4.2005, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ничего не пойму, про какую функцию ты говоришь?


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Dr.No_xXx
Дата 27.4.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тебе надо немного изменить содержание dll(shell32.dll)/
PM MAIL   Вверх
Delphist
  Дата 27.4.2005, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


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

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



Цитата(Rouse_ @ 27.4.2005, 08:40)
Ничего не пойму, про какую функцию ты говоришь?

Я перехватываю функцию SHGetFileInfo возращаю результат для всех дисков возвращаю CD. Как заставить принять новую инфу к сведению. У меня вызов MySHGetFileInfo, MySHGetFileInfoA, MySHGetFileInfoW происходит вместо SHGetFileInfo, SHGetFileInfoA, SHGetFileInfoW. Но возвращаемые результаты не принимаются к сведению. Может быть результат возвращаю не в том формате хотя вряд ли. Как заставить принять систему новую инфу.



--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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