Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Получение серийника USB


Автор: dee63 3.5.2011, 16:55
Всем привет!
Задача- прочитать серийник  флешки ( а вместе с тем и вендора и пр лабуду).

Делаю так:

Код

uses
 JwaWinIoctl;

function GetFlashSN:String;
var
    Dummy :DWord;
    FHandle :Cardinal; 
    RealPath :String; 
    dg :CHANGER_PRODUCT_DATA;
    Serial,venid,prodid,rev,devtype :String;
    i :byte;
begin
 RealPath:=string(form1.Edit1.text);
//открываем файл (из эдита получаем. использую \\.\G:)
 FHandle:=CreateFile(PChar(RealPath),GENERIC_READ,FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  
Memo1.lines.add('Сообщение CreateFile для '+realpath+' - '+#13+' '+SysErrorMessage(GetLastError)+#13+' '+Inttostr(GetLastError));
  
if  (DeviceIOControl(FHandle,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER, nil, 0, @dg, sizeof(dg), dummy, nil)) then
begin
Serial:='';
venid:='';
prodid:='';
rev:='';
devtype:='';

for i:=0 to 7 do
venid:=venid+'-'+inttostr(dg.VendorId[i]);

for i:=0 to 15 do
prodid:=prodid+'-'+inttostr(dg.ProductId[i]);

for i:=0 to 3 do
rev:=rev+'-'+inttostr(dg.Revision[i]);

for i:=0 to 31 do
Serial:=Serial+'-'+IntToStr(dg.SerialNumber[i]);
      
devtype:=inttostr(dg.devicetype);
end;

  form1.memo1.lines.add('Vendor ID: '+venid);
  form1.memo1.lines.add('Product ID: '+prodid);
  form1.memo1.lines.add('Revision ID: '+rev);
  form1.memo1.lines.add('S\N: '+serial);
  form1.memo1.lines.add('Device Type: '+devType);
end;



Что получаю в итоге.
Вообще результата было 2:
1- первые пол часа проверки с 10 флешками- номера выдавалаись полностью уникальными, и начинались на 0370 и т.д.
2-вторые пол часа проверки (повторный запуск ТОГО ЖЕ кода) стали давать другие номера, и начинались с 0136 и т.д.

И третье-не результат, а просто пустота.

Вопрос-что я не так делаю?
По коду-открытие файла происходит без проблем (о чем свидетельствуетвывод инфы о действии).
А номера вот никакие не приходят ко мне в dg (именно в него и должно приходить все ето безобразие).

Помогите люди добрые-ткните пальцем где косяк

Автор: Geniebal 6.5.2011, 22:47
если я правильно тебя понял, то тебе нужна вся информация о флешке, как ее видит винда? так?

Автор: Riply 7.5.2011, 18:45
dee63,  IOCTL_CHANGER_GET_PRODUCT_DATA <--> CHANGER_PRODUCT_DATA,
а  IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER <--> MEDIA_SERIAL_NUMBER_DATA.

Во всяком случае так MSND говорит smile

Автор: dee63 16.5.2011, 14:27
Спасибо за ответ!
Вообщем так ничего этим методом у меня не выщло.
Реализовал через wmi.
Там просто и более универсально в итоге.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)