привет всем! тут возникла такая проблема, немогу разобраться почему DeviceIOcontrol не "подключается" к флешке поэтому структира пустая и немогу получить серийный! серийный номер у флешки есть! так как пробовал через WMI VID PID и серийный получаю, но хочу реализовать безе WMI, вот процедура Код (Text): Procedure TForm1.GetSerialNumber; var RealPath :String; dg:CHANGER_PRODUCT_DATA; Dummy :DWord; hDevice:HWND; Med:MEDIA_SERIAL_NUMBER_DATA; Serial,sd:String; i:byte; begin RealPath:='\\.\C:'; hDevice:=CreateFile(PansiChar('\\.\PhysicalDrive1'),GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); {'\\.\PhysicalDrive0'} if DeviceIOControl(hDevice,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER, nil, 0, @dg, sizeof(dg), dummy, nil) then begin Serial:=''; for i:=0 to 31 do Serial:=Serial+IntToStr(dg.SerialNumber[i]); sd:=Serial; end; ShowMessage(sd); CloseHandle(hDevice); end; PMEDIASERIALNUMBERDATA=^MEDIA_SERIAL_NUMBER_DATA; MEDIA_SERIAL_NUMBER_DATA= packed record SerialNumberLength:Ulong; Result:Ulong; SerialNumberData:char; end; const SERIAL_NUMBER_LENGTH = 32; {$EXTERNALSYM SERIAL_NUMBER_LENGTH} PRODUCT_ID_LENGTH = 16; {$EXTERNALSYM PRODUCT_ID_LENGTH} REVISION_LENGTH = 4; VENDOR_ID_LENGTH = 8; {$EXTERNALSYM VENDOR_ID_LENGTH} METHOD_BUFFERED = 0; FILE_ANY_ACCESS = 0; FILE_DEVICE_MASS_STORAGE = $0000002d; IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE; IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER = ( (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or ($0304 shl 2) or METHOD_BUFFERED); во вложении пример откуда все это взял, но там модуль и Jedi библеотеки с нима вообще не робит, так что из него взял нужные константы. В чем может быть ошибка?
transserg > не "подключается" к флешке ... CreateFile(PansiChar('\\.\PhysicalDrive1') Причем тут флешка? Успешно ли выполняется CreateFile? Если нет, что сообщает GetLastError? Успешно ли выполняется DeviceIOControl? Если нет, что сообщает GetLastError?
createfile отрабатывает без ошибок,а вот deviceioconrol с ошибкой позже скажу какая(как приду домой) phisicaldrive1 это флешка!
в общем deviseiocontrol getlasterror возвращает ошибку 50! тоесть нельзя согдать запрос! почему? в чем ошибка?
Ну судя по всему, потому что нету такого обработчика у драйвера устройства, для запроса, который ты посылаешь. Ты уверен на счет IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER ? Попробуй что нибудь другое, из своего примера..
Да и у тебя должно быть ошибка в коде, хотя в дельфях я не силен, могу ошибаться... Переменную dummy, по ссылке надо передавать...
wertyman Не обязательно. Если в декларации функции она описана как var, то она будет передана по ссылке автоматически.
transserg 1) Структура MEDIA_SERAL_NUMBER_DATA должна иметь 5 членов, у тебя только три Код (Text): typedef struct _MEDIA_SERAL_NUMBER_DATA { ULONG msn_SerialNumberLength; // offset 00 ULONG msn_Result; // offset 04 ULONG msn_AuthCommand; // offset 08 ULONG msn_Reserved; // offset 12 UCHAR msn_SerialNumberData[1]; // offset 16 } MEDIA_SERIAL_NUMBER_DATA, *PMEDIA_SERIAL_NUMBER_DATA; 2) Насколько я понял, после вызова DeviceIoControl, серийный номер возвращается в структуре MEDIA_SERAL_NUMBER_DATA, а не в CHANGER_PRODUCT_DATA. Ты же вызываешь почему-то: Код (Text): DeviceIOControl(hDevice,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER, nil, 0, @dg, sizeof(dg), dummy, nil) , где @dg - это CHANGER_PRODUCT_DATA 3) Всё же попробуй вызвать CreateFile с указанием имени диска (например, \\.\E, вместо гипотетического PhysicalDrive
да тактоже пробовал) писал '\\.\H:' и нужную структуру справил все поля на месте но результат тот же ошибка 50
вот то что я делаю констаты и структура Код (Text): const METHOD_BUFFERED = 0; FILE_ANY_ACCESS = 0; FILE_DEVICE_MASS_STORAGE = $0000002d; IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE; IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER = ( (IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or ($0304 shl 2) or METHOD_BUFFERED); type PMEDIASERIALNUMBERDATA=^MEDIA_SERIAL_NUMBER_DATA; MEDIA_SERIAL_NUMBER_DATA= packed record SerialNumberLength:Cardinal; Result:Cardinal; AuthCommand:Cardinal; Reserved:Cardinal; SerialNumberData:Byte; end; вот процедура Код (Text): Procedure TForm1.GetSerialNumber; var RealPath :String; Dummy :DWord; hDevice:HWND; Med:PMEDIASERIALNUMBERDATA; Serial:String; begin RealPath:='\\.\G:'; hDevice:=CreateFile(PAnsiChar(RealPath),GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); {'\\.\PhysicalDrive0'} ShowMessage('CreateFile'+#13+SysErrorMessage(GetLastError)+#13+Inttostr(GetLastError)); GetMem(med,Sizeof(med)); if DeviceIOControl(hDevice,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER, nil, 0, med, sizeof(med), dummy, nil) then begin Serial:=''; serial:=serial+(Med^.SerialNumberData); ShowMessage(Serial); end; ShowMessage('DeviceIOControl'+#13+SysErrorMessage(GetLastError)+#13+Inttostr(GetLastError)); CloseHandle(hDevice); Freemem(med); end;