· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› wanted

Посл.отвђт Сообщенiе


Дата: Ноя 4, 2003 13:43:27

ex: enumerate usb's where removable-media(flash memory) is present and get disk letter.


Дата: Ноя 4, 2003 21:53:13

Have you tried to read through DDK?


Дата: Ноя 5, 2003 00:18:45

??? Если у накопителя уже есть буковка в эксплорере, тогда проще перечислить все внешние диски (removable) и дискриминировать по объёму 3-дюймовых собратьев.


Дата: Ноя 5, 2003 01:55:24

volodya
I'm enumerating the usb's (Setup....), but how to get if there is some device ?

Quantum
Example ?


Дата: Ноя 5, 2003 03:05:42

Ну, хотя бы так:
1. GetLogicalDriveStrings
2. Для каждого полученного дисковода задаёшь GetDriveType
3. Для всех DRIVE_REMOVABLE вызываешь GetDiskFreeSpace чтоб узнать размер.
4. У кого размер не дискетный, тот - флеш-накопитель.

Это всё очень примерно, но в принципе должно работать.


Дата: Ноя 5, 2003 15:20:34

Quantum
А ZIP-Drives и CD-ROM - ведь тоже Removable


Дата: Ноя 5, 2003 17:21:48

DaemoniacaL
CD-ROM, is not, but ZIP it is.

I'm working on that now, if any idea will appear, :)
you're welcomed.

When I'll finish ,I'll share the code.


Дата: Ноя 6, 2003 01:22:27

CD-ROM GetDiskFreeSpace() = 0


Дата: Ноя 6, 2003 02:31:48

comrade
Имеется в виду не размер свободного места на диске, а полный размер диска. Глянь описание этой API-шки в MSDN и сразу станет ясно.

DaemoniacaL
Да, за зипы я и забыл.


Дата: Ноя 6, 2003 11:14:01

Наткнулся я на интересный раздел в МСДН:
Windows Development\Windows Base Services\Device I/O\SDK Documentation\Removable Storage Management
Windows Development\Windows Base Services\Device I/O\SDK Documentation\Device Management

Минипример если это поможет: (правда на С++)
  HANDLE hSession = OpenNtmsSession(NULL, NULL, 0);
  if(hSession != INVALID_HANDLE_VALUE)
  {
    DWORD cbListSize = 0;
    EnumerateNtmsObject(hSession, NULL, NULL, &cbListSize, NTMS_DRIVE, 0);
    if(cbListSize > 0)
    {
      NTMS_GUID *lpList = new NTMS_GUID [cbListSize];
      if(lpList != NULL)
      {
        if(EnumerateNtmsObject(hSession, NULL, lpList, &cbListSize, NTMS_DRIVE, 0) == ERROR_SUCCESS)
        {
          NTMS_OBJECTINFORMATION info = {0};
          info.dwSize = sizeof(NTMS_OBJECTINFORMATION);
          for(DWORD i = 0; i < cbListSize; i++)
          {
            DWORD res = GetNtmsObjectInformation(hSession, &lpList[i], &info);
            if(res == ERROR_SUCCESS)
            {
              cout << i << ": " << info.szDescription << endl;
            }
            else
            {
              cout << i << ": Error = " << res << endl;
            }
          }
          delete lpList;
        }
      }
    }
    CloseNtmsSession(hSession);
  }


Результат:
0: H + H DVD-ROM DVD-410B SCSI CdRom Device
1: TEAC CD-W540E
2: V386 PHANTOM CDROM SCSI CdRom Device
3: USB DISK 2.0 USB Device


Если знать название устройства - то дальше пролем нет. Там где то можно получить имя физического устройства.

Пробовал на других флешках, находит. ПРактически у всех (доступных мне) было слово "USB" в названии.

Использовать поле DeviceType у структуры NTMS_DRIVETYPEINFORMATION нельзя, так как на флешку с возможностью эмуляции HDD он сказал тип FILE_DEVICE_UNKNOWN вместо FILE_DEVICE_DISK.


Дата: Ноя 6, 2003 11:15:42

kID
Как видишь с точки зрения этих функций CD-ROM - Removable :)

Хотя в целом в Windows он фигурирует как отдельный тип устройств


Дата: Ноя 8, 2003 00:04:26 · Поправил: kID

if this will work(this is a part of code) I'll have: can detect storage device connected to usb hub, and do the difference between:
about ~25 flopies types, cdrom, flash-memory . Can't do the difference between flash-memory & ZIP devices. :(


C++ a little bit :)

HANDLE hDevice = CreateFile("\\\\.\\C:",
0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,NULL);
// after this call all it's cool; next:

DISK_GEOMETRY pdg;
DWORD reqSz;
BOOL b=DeviceIoControl(hDevice,
IOCTL_STORAGE_GET_MEDIA_TYPES,
NULL,0,
&pdg,sizeof(pdg),
&reqSz,
(LPOVERLAPPED)NULL);

// from here Ineed "pdg.MediaType", but every time
// pdg contains negative values !!!


Дата: Ноя 8, 2003 06:46:34

IOCTL_STORAGE_GET_MEDIA_TYPES скорее всего используется для устройств-контейнеров (дисководы, приводы CD-ROM и т.п.).
HANDLE hDevice = CreateFile("\\\\.\\ и т.д.

Может IOCTL_STORAGE_GET_HOTPLUG_INFO подойдет?
STORAGE_HOTPLUG_INFO shi;
    DWORD retSz = 0;
    BOOL bRes = DeviceIoControl(hDevice,  IOCTL_STORAGE_GET_HOTPLUG_INFO, NULL,0, &shi, sizeof(shi), &retSz, (LPOVERLAPPED)NULL);  

проверив флаг STORAGE_HOTPLUG_INFO.DeviceHotplug.

Другой вариант:
из МСДН:
The IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER control code retrieves the serial number of a USB device

На устройства отличные от USB выдает код ошибки 1. (Incorrect function)

На мою флешку выдал код ошибки 50(The request is not supported).


Дата: Ноя 8, 2003 16:38:17 · Поправил: kID

DaemoniacaL have you saw the "MEDIA_TYPE" enum, there is a "RemovableMedia" field - Removable media other than floppy. CD-ROM was wliminated before of that code.

any way I want to know why that code(pdg.MediaType) did not return a correct defined value, or "Unknown" - Format is unknown if some thing is wrong.


Дата: Ноя 8, 2003 17:16:01

...why that code(pdg.MediaType) did not return the "Unknown"
Проверь LastError Code после выполнения DeviceIoControl. На С: он возвращает 1 (Incorrect Function) и поля структуры остаются незаполненными. Допустим на флоппик он выдает тип. и код ошибки (More Data Available).

Тебе какие устройства нужно найти-то? Flash Memory Cards? or Any USB Drives? Так как моц USB Disk - не поддерживает никаких Removable Media (судя по коду ошибки), хотя сам им является.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.172