Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отловить момент подключения USB-флэшки? [Win2K]  (Прочитано 35743 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Monsta
Гость
« : 06-09-2004 13:35 » 

Сабж. Тот момент, после которого винда показывает в трее иконку "Извлечение устройства" (или как его там). Нужно ли писать для этого свой драйвер, или можно обойтись обращением к драйверу самой флэшки?

P.s. не предлагайте, пожалуйста, ловить момент появления иконки. Если до этого в систему был подключен хотя бы один USB-девайс, то иконка уже будет на месте.
Записан
mad
Гость
« Ответ #1 : 07-09-2004 16:01 » 

Сабж. Тот момент, после которого винда показывает в трее иконку "Извлечение устройства" (или как его там). Нужно ли писать для этого свой драйвер, или можно обойтись обращением к драйверу самой флэшки?

Да, придется. Через "обращение в драйвер флешки" не получится получить состояние только по тому что драйвер не будет загружен.

ЗЫ: показ иконки в трее можно и отключить.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 08-09-2004 06:50 » 

Цитата

Сабж. Тот момент, после которого винда показывает в трее иконку "Извлечение устройства" (или как его там). Нужно ли писать для этого свой драйвер, или можно обойтись обращением к драйверу самой флэшки?


Вариант из юзер мода- зарегестрироваться на получение сообщений о смене устройств- RegisterDeviceNotification.

Вариант из кернел мода- драйвер фильтр с отловом сообщений IRP_MN_START_DEVIECE, IRP_MN_QUERY_DEVICE_RELATION. Хотя и там можно зарегистрироваться на получение сообщений.
Записан
mad
Гость
« Ответ #3 : 08-09-2004 07:13 » 

Ух ты! RegisterDeviceNotification. Я такую шнягу еще не видал!
Записан
Monsta
Гость
« Ответ #4 : 08-09-2004 12:48 » 

Цитата: SlavaI
Вариант из юзер мода- зарегестрироваться на получение сообщений о смене устройств- RegisterDeviceNotification.

Во - то, что надо. Только компилироваться не хочет. В MSDN для VS 6.0 такой функции я не нашёл, поэтому взял пример из http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/registering_for_device_notification.asp. Подключил и windows.h, и dbt.h - не компилится. Что ему ещё надо?
Записан
mad
Гость
« Ответ #5 : 08-09-2004 13:26 » 

это в форум про гуи программинг
Записан
Monsta
Гость
« Ответ #6 : 13-09-2004 12:14 » 

А всё-таки? Интересует, получится ли работать с этой функцией в VC++ 6.0?
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #7 : 13-09-2004 22:08 » new

Цитата
А всё-таки? Интересует, получится ли работать с этой функцией в VC++ 6.0?


получиться, только обнови Platform SDK,
раньше его можно было скачать с  microsoft.com
Записан
Monsta
Гость
« Ответ #8 : 14-09-2004 09:12 » 

Да сейчас вроде как тоже можно, только "A server problem has occurred. An attempt to resume the download will occur in 120 seconds."
Одно слово - микрософт... Ага
Записан
Monsta
Гость
« Ответ #9 : 20-09-2004 12:27 » 

Fuck. Файл dbt.h спокойненько нашелся где-то в недрах Visual Studio, хоть компилер его в упор и не видит. Пофиг, перегнал прогу в Билдер - там всё нормально. Как обычно, микросакс со своими заморочками. Ага

Теперь другой вопрос: ф-ция RegisterDeviceNotification требует структурку, в которой надо прописать GUID девайса:
Код:
typedef struct _DEV_BROADCAST_DEVICEINTERFACE
|
  DWORD dbcc_size;
  DWORD dbcc_devicetype;
  DWORD dbcc_reserved;
  GUID dbcc_classguid;
  TCHAR dbcc_name[1(;
" DEV_BROADCAST_DEVICEINTERFACE *PDEV_BROADCAST_DEVICEINTERFACE;

Как и откуда этот GUID можно узнать?
Записан
Серж
Гость
« Ответ #10 : 20-09-2004 13:53 » 

Monsta,
GUID класса USB-устройства можно получить, открыв ключ реестра
HKLM\System\CurrentControlSet\Enum\USB\... и подключ любого устройства,
GUID будет везде одинаков, а из программы с помощью ф-ии
SetupDiGetDeviceInfoListDetail
Записан
Серж
Гость
« Ответ #11 : 21-09-2004 06:50 » 

Вообще-то, если искать в реестре из программы, то надо перебирать ветки реестра HKLM\System\CurrentControlSet\Control\Class\...  и выбрать ту из них,
для которой значения параметра Class = "USB"
Записан
Monsta
Гость
« Ответ #12 : 21-09-2004 07:38 » 

Ну я, собсно говоря, из реестра все это и вытащил, только ручками Улыбаюсь
Вот про SetupDiGetDeviceInfoListDetail я уже в MSDN почитал, надо попробовать.
Записан
Monsta
Гость
« Ответ #13 : 21-09-2004 12:18 » 

Вот ещё вариант нашёл:

Код:

#include <setupapi.h>

...

// получаем список девайсов по enumerator'у "USBSTOR"
HDEVINFO usbinfo = SetupDiGetClassDevs)NULL, "USBSTOR", NULL, DIGCF_ALLCLASSES:;

// получаем структурку с данными о конкретном девайсе
SP_DEVINFO_DATA devdata;
devdata.cbSize = sizeof)SP_DEVINFO_DATA:;
SetupDiEnumDeviceInfo)usbinfo, 0, &devdata:; // 0 - индекс элемента


После этого в devdata.ClassGuid будет лежать GUID нулевого элемента массива всех девайсов, которые относятся к HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR. Остальные элементы можно не смотреть, так как GUID у них тот же.
Записан
Monsta
Гость
« Ответ #14 : 23-09-2004 11:54 » 

Новая проблема возникла. Сообщение WM_DEVICECHANGE (при возникновении событий DBT_DEVICEARRIVAL и DBT_DEVICEREMOVECOMPLETE) посылается всем окнам по дефолту, так что RegisterDeviceNotification вызывать не требуется. Но в этих событиях не различаются флэшка и, например, диск, только что засунутый в CD-ROM.
Вопрос: какое событие надо отлавливать, чтобы определить, что подключилась именно флэшка? Есть вариант DBT_DEVNODES_CHANGED, но в MSDN заявлено, что в 98-й винде это не работает. Кроме того, по этому событию невозможно узнать, какая буква присвоена подключённому диску.
Записан
Серж
Гость
« Ответ #15 : 23-09-2004 12:18 » 

Monsta,  вот текст из MSDN:
The WM_DEVICECHANGE Device Change Message
The main Win32 interface to Plug and Play is via a new message, WM_DEVICECHANGE, available as an ID under WM_COMMAND. This new Device Change Message has various event codes that give more details about change in the device, if it is being added, if it is about to be removed, it if was just removed, and so on.

In the main window procedure, use switch statements similar to the ones below to obtain information on the Plug and Play Device Change Message and its parameters.

    LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM uParam,
                              LPARAM lParam)
    {
        int wmId, wmEvent;
        /* ... other procedure initialization overhead ... */
   
        switch (message) {
   
            case WM_COMMAND:
                wmId    = LOWORD(uParam);
                wmEvent = HIWORD(uParam);
   
                switch (wmId) {
   
                    case WM_DEVICECHANGE:
                         /* ... Plug and Play specifics here! ... */
                        break;
     /* ... rest of message handling window procedure ... */

At this point, the event code points to one of various DBT_* event codes that contain different kinds of information. The Windows 95 Software Development Kit’s DBT.H header file goes into good detail on these messages, the main ones of which are summarized below.

The DBT_DEVTYP_* Event Codes
Before going on to describe the main DBT_* event codes, it is useful to understand the kinds of devices that these messages can represent. The main DBT_* event codes carry information as to the type of hardware, contained in the DBT_DEVTYP_* values. The lParam points to the PDEV_BROADCAST_HDR structure, and this structure’s dbch_devicetype field contains this information. For example:

((PDEV_BROADCAST_HDR)lParam)->dbch_devicetype)

Values of DBT_DEVTYP_* values are:

DBT_DEVTYP_OEM OEM-defined device type
DBT_DEVTYP_DEVNODE devnode number (specific to Windows 95)
DBT_DEVTYP_VOLUME logical volume (drive)
DBT_DEVTYP_PORT serial or parallel port
DBT_DEVTYP_NET network resource (UNC)


Of these device type values, DBT_DEVTYP_VOLUME is arguably the most useful: It shows when a drive letter (local or remote) is coming or going. The DBT_DEVTYP_DEVNODE is specific to Windows 95, and would not be available in Windows NT.

По второму параметру определяется Drive,  а с помощью GetDriveType определяется съемный диск.
Записан
Николай
Гость
« Ответ #16 : 23-09-2004 16:13 » 

В DDK можно найти пример c USB ( NTDDK\src\wdm\usb\usbview.c). В этом файле как раз есть эта функция, она для этого сделана, чтоб при подключении USB устройства, вызывалась нужная функция, она работает, так что пользуй.
Удачи!
Записан
Monsta
Гость
« Ответ #17 : 24-09-2004 08:20 » 

В общем, мысль про GetDriveType хорошая, но не получится ли так, что тип  DRIVE_REMOVABLE будет возвращаться для других внешних USB-девайсов? Например, внешние винчестеры или карт-ридеры?

Можно как-нибудь узнать GUID подключенного диска? Только не через реестр...
Записан
Серж
Гость
« Ответ #18 : 24-09-2004 09:54 » 

Monsta,  есть еще набор функций API. которые работают со съемными дисками, заголовки этих функций находятся в ntmsapi.h.  Думаю среди этих функций ты найдешь нужную информацию, есть описания в MSDN. Я использовал какие-то из них для определения стримеров, с USB дела не имел.
Записан
Monsta
Гость
« Ответ #19 : 28-09-2004 12:04 » 

Цитата: Серж
Monsta,  есть еще набор функций API. которые работают со съемными дисками, заголовки этих функций находятся в ntmsapi.h.  Думаю среди этих функций ты найдешь нужную информацию, есть описания в MSDN. Я использовал какие-то из них для определения стримеров, с USB дела не имел.

А как насчёт таких же ф-ций, но чтобы работали в Win98? Я с таким же успехом могу ловить GUID через событие DBT_DEVNODES_CHANGED, которое тоже в 98-й не работает. Не у всех 2K или XP установлены...

Всё, что мне нужно - это как-то узнать GUID дискового устройства по его букве. Это возможно?
Записан
Серж
Гость
« Ответ #20 : 28-09-2004 14:52 » 

Monsta, я думаю, что это можно сделать только через реестр.
Скорее всего, это ветка HKLM\SYSTEM\MountedDevices. A функции API для этого написаны только для 2000 и XP. 98-ю и NT Microsoft уже давно забросили.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines