Как можете да разберете модела на USB-устройството
Дефинирам серийния номер на USB устройството, както следва: var VolumeName, FileSystemName : array [0..MAX_PATH-1] of Char; Сериен номер на том: DWord; MaxComponentLength,FileSystemFlags: Cardinal; begin GetVolumeInformation("J:\",VolumeName,MAX_PATH,@VolumeSerialNo, MaxComponentLength,FileSystemFlags, FileSystemName,MAX_PATH); Memo1.Lines.Add("SerialNo = $"+IntToHex(VolumeSerialNo,8)); И как мога да разбера (допълнително) неговия модел? (Напр.: "Kingston DataTraveler (DTI/512)")
←→Правилно Вася ( 2007-06-14 15:26 ) [1]
копайте в системния регистър LocalMachine\system\currentcontrolset
←→Рал'ф ( 2007-06-14 16:04 ) [2]
и благодаря за което!
←→Рал'ф ( 2007-06-15 13:49 ) [3]
Да, след форматиране на VolumeSerialНяма промени (
Опитах се да потърся в регистъра - намерих го! Там има нещо като идентификатор на устройство, но има! Но тогава как да направя връзка в програмата - запис в регистъра и буква на устройството?
Сега въпросът е дори - как можете да идентифицирате външно устройство (било то флашка, плексор или карта с памет)?
Ето, за да ви помогна. Току-що се определят типът на устройството, моделът и серийният номер.
IdeInfo2 - вземете различна информация за IDE устройство(http://home.earthlink.net/
akonshin/files/IdeInfo2.zip, 30 юли 2000 г., 27K, D3+) Използвайки SMART Ioctl API, можете да получите модела, версията на фърмуера, серийния номер, състоянията на различни броячи на IDE твърди дискове. Тестван на Windows 98, Windows NT 4.0 и Windows 2000.
IdeSN - вземете серийния номер на първото IDE устройство(http://home.earthlink.net/
akonshin/files/IdeSN.zip, 30 юли 2000 г., 4K, D3+) Пример, показващ как да получите серийния номер на първия IDE твърд диск.Тестван на Windows 98, Windows NT 4.0 и Windows 2000.
IdeSN2 - получаване на серийния номер на първия IDE диск(нов пример) (http://home.earthlink.net/
akonshin/files/IdeSN2.zip, 22 октомври 2003 г., 5K, D5+) Пример, показващ как да получите серийния номер на първия IDE твърд диск. Тестван на Windows 98, Windows NT 4.0, Windows 2000 и Windows XP.
Да, забравих да отбележа. USB устройствата (флаш устройства, USB винтове) в системата стават сменяеми твърди дискове, така че могат да бъдат достъпни чрез CreateFile, следователно горните примери се отнасят за тях.
←→Рал'ф ( 2007-06-15 15:32 ) [6]
> IdeInfo2 - получаване на различна информация за IDE диска- това, от което се нуждаете, НО не работи в XP (а сега тази ОС е почти навсякъде)
> IdeSN2 - получаване на серийния номер на първото IDE устройство- Не ми трябва първото!
←→Рал'ф ( 2007-06-15 15:33 ) [7]
Всичко ми работи под ХР. Наскоро проверих и взех някои неща от там за моята програма.
←→Рал'ф ( 2007-06-15 21:37 ) [9]
Твърдият диск на компютъра ми е разделен на два дяла: C и D Когато пиша: if Win32Platform=VER_PLATFORM_WIN32_NT then begin // Windows NT, Windows 2000 Str(ControllerNumber,s); hDevice := CreateFile(PChar("\\.\С:"), // или D включете флаш, напишете “F” и не получавате нищо!
Тези кодове могат да получат информация само за вътрешни устройства: HDD, DVD-ROM…
Или трябва да добавя нещо, така че да разбира и външни (usb)?
P.S. пробвах както IdeInfo2, така и IdeSN2!
Написах, че всички флашки стават сменяеми твърди дискове. Така че не е нужно да се свързвате с тях.CreateFile(PChar("\\.\С:") , но като физическо устройство, т.е. CreateFile(PChar("\\.\PhysicalDriveX") , където X е номерът на физическото устройство.
Написах, че всички флашки стават сменяеми твърди дискове. Това означава, че те не трябва да бъдат достъпвани CreateFile(PChar("\\.\C:"), а като физическо устройство, т.е. CreateFile(PChar("\\.\PhysicalDriveX"), където X е номерът на физическото устройство.
←→Рал'ф ( 2007-06-16 08:54 ) [12]
> те не трябва да бъдат CreateFile(PChar("\\.\С:"), а като физическо устройство
Предполагам, че не съм опитвал.
Намерете книгата "Използване на USB интерфейс и практика на програмиране" Автор: Павел Агуров. Издател: Санкт Петербург "BHV-Петербург" 2005 г
- има почти всичко за USB
←→Рал'ф ( 2007-06-16 12:56 ) [14]
И така трябва да се направи! Надявайки се на бърз. :-)))
Засега вероятно ще използвам етикета за обем, но можете да видите какво мога да извадя!
Вярно е, че докато търсих, многократно срещах съобщения за NoName устройства, изглежда, че сега отказват серийни номера по целия свят. Така че може би не си струва да се свързвате с него!
Можете да получите това, което търсите, приблизително така: много е трудно да го извадите от проекта. Ще опиша само клопките, на които се натъкнах Първият проблем: несъответствието на размера между структурните параметри от C++ заглавните файлове и Delphi. Ето моята версия на неговото решение (не съм сигурен дали е правилно, но работи :) Промяната на коментара не се препоръчва :) Не го предпочитах навсякъде (но въведете допълнително поле _Fill: array[0..2] of Byte; в _STORAGE_DEVICE_DESCRIPTOR и променете измерението на AdditionalParameters: array[0..9] of Byte в STORAGE_PROPERTY _QUERY защото . беше необходимо да се поддържа"съвместимост размери» и в др. запроси и структури. тип // PSTORAGE_QUERY_TYPE = ^STORAGE_QUERY_TYPE; _STORAGE_QUERY_TYPE = (PropertyStandardQuery = 0, // Извлича дескриптора PropertyExistsQuery, // Използва се за проверка дали дескрипторът се поддържа Правилен tyMaskQuery, // Използва се за извличане на маска от записваеми полета в дескриптора PropertyQueryMaxDefined); // използва се за валидиране на стойността STORAGE_QUERY_TYPE = _STORAGE_QUERY_TYPE; //
тип // PSTORAGE_PROPERTY_ > _STORAGE_PROPERTY_ > STORAGE_PROPERTY_ >//
тип PSTORAGE_PROPERTY_QUERY = ^STORAGE_PROPERTY_QUERY; _STORAGE_PROPERTY_QUERY = пакетиран запис PropertyId: STORAGE_PROPERTY_ID; Тип заявка: STORAGE_QUERY_TYPE; Допълнителни параметри: масив [0..9] от байт; край; STORAGE_PROPERTY_QUERY = _STORAGE_PROPERTY_QUERY;
тип PSTORAGE_BUS_TYPE = ^STORAGE_BUS_TYPE; _STORAGE_BUS_TYPE = (BusTypeUnknown = 0, BusTypeScsi, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb, BusTypeRAID, BusTypeiScsi, BusTypeSas, Bus TypeSata, BusTypeMaxReserved = $7F); STORAGE_BUS_TYPE = _STORAGE_BUS_TYPE;
Разбрахме се с размерите на полюсите, преминавайки към опит за получаване, необходимите ни данни: Следващ сюрприз: при нашата заявка, ако сме задали твърде малък буфер за приемане на данни, малко това, че този поросенок (DeviceIoControl :) се връща True, така че още и GetLastError ни връща ERROR_SUCCESS :) В заявката има значение ERROR_MORE_DATA и нашия ERROR_INSUFFICIENT_BUFFER, GetLastError, защо-то да издаде не иска :) Схема, как се опитах да се боря с това "всички в ред" по-долу.
const IOCTL_STORAGE_QUERY_PROPERTY = ((IOCTL_STORAGE_BASE shl 16) или (FILE_ANY_ACCESS shl 14) или ($0500 shl 2) илиMETHOD_BUFFERED); const DEVICE_DESCRIPTOR_INC = 512 - SizeOf(STORAGE_DEVICE_DESCRIPTOR);
функция StorageQueryProperty(const hDevice: THandle; var pDescript: PSTORAGE_DEVICE_DESCRIPTOR; var cbDescript, cbReturned: DWord): DWord; var PropQuery: STORAGE_PROPERTY_QUERY; begin FillChar(PropQuery, SizeOf(STORAGE_PROPERTY_Q UERY), 0); PropQuery.Property > PropQuery.QueryType := PropertyStandardQuery;
докато DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, @PropQuery, SizeOf(STORAGE_PROPERTY_QUERY), pDescript, cbDescript, cbReturned, nil) do begin Result := GetLastError; case Резултат от ERROR_SUCCESS: if (pDescript.Size >= cbReturned) then begin cbDescript := pDescript.Size + DEVICE_DESCRIPTOR_INC; ReallocMem(pDescript, cbDescript); end else Break; // ERROR_MORE_DATA: // begin // if cbReturned > cbDescript then cbDescript := cbReturned else inc(cbDescript, IO_BUFFER_SIZE_INC); // ReallocMem(pDescript, cbDescript); // end; // ERROR_INSUFFICIENT_BUFFER: // begin // inc(cbDescript, IO_BUFFER_SIZE_INC); // Real locMem(pDescript, cbDescript); // край; // else Break; Вот, вроде и всичко. Разработваме със смещения в STORAGE_DEVICE_DESCRIPTOR и превеждаме нашите данни на "човешки език" оставяме във вид на домашното задание :) P.S. Выдергивалось и подгонялось "на коленке", така че строго не съди. Няма принцип запазен :) Вот кусочек, възвръщаемите данни: RemovableMedia: True CommandQueueing: False BusType: BusTypeUsb VendorId: C-ONE-5.0 ProductId: 128MB Aqua ProductRevision: 1.03
Вот още нарил. Дешего и сърдито. Плюс чтение/запис има до кучи, с демками.