|
|
| Посл.отвђт | Сообщен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 |