2019独角兽企业重金招聘Python工程师标准>>>

获取U盘序列号的代码 日期:2007年10月29日 作者:laihongbo 人气:4679 查看:[大字体 中字体 小字体] const DIGCF_PRESENT = $00000002; DIGCF_DEVICEINTERFACE = $00000010; ANYSIZE_ARRAY = 1; SetupAPI = 'SetupAPI.DLL';

type HDEVINFO = Pointer; ULONG_PTR = DWORD;

PSPDevInfoData = ^TSPDevInfoData; SP_DEVINFO_DATA = packed record cbSize: DWORD; ClassGuid: TGUID; DevInst: DWORD; Reserved: ULONG_PTR; end; {$EXTERNALSYM SP_DEVINFO_DATA} TSPDevInfoData = SP_DEVINFO_DATA;

PSPDeviceInterfaceData = ^TSPDeviceInterfaceData; SP_DEVICE_INTERFACE_DATA = packed record cbSize: DWORD; InterfaceClassGuid: TGUID; Flags: DWORD; Reserved: ULONG_PTR; end; {$EXTERNALSYM SP_DEVICE_INTERFACE_DATA} TSPDeviceInterfaceData = SP_DEVICE_INTERFACE_DATA;

PSPDeviceInterfaceDetailDataA = ^TSPDeviceInterfaceDetailDataA; SP_DEVICE_INTERFACE_DETAIL_DATA_A = packed record cbSize: DWORD; DevicePath: array[0..ANYSIZE_ARRAY - 1] of AnsiChar; end; {$EXTERNALSYM SP_DEVICE_INTERFACE_DETAIL_DATA_A} TSPDeviceInterfaceDetailDataA = SP_DEVICE_INTERFACE_DETAIL_DATA_A;

function SetupDiGetClassDevsA(ClassGuid: PGUID; const Enumerator: PAnsiChar; hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall; external SetupAPI;

function SetupDiEnumDeviceInterfaces(DeviceInfoSet: HDEVINFO; DeviceInfoData: PSPDevInfoData; const InterfaceClassGuid: TGUID; MemberIndex: DWORD; var DeviceInterfaceData: TSPDeviceInterfaceData): BOOL; stdcall; external SetupAPI; {$EXTERNALSYM SetupDiEnumDeviceInterfaces}

function SetupDiGetDeviceInterfaceDetailA(DeviceInfoSet: HDEVINFO; DeviceInterfaceData: PSPDeviceInterfaceData; DeviceInterfaceDetailData: PSPDeviceInterfaceDetailDataA; DeviceInterfaceDetailDataSize: DWORD; var RequiredSize: DWORD; Device: PSPDevInfoData): BOOL; stdcall; external SetupAPI;

function SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO): BOOL; stdcall; external SetupAPI;

function GetUSBDiskID(const DiskID: string; var PID: string): Boolean; var USBGuid: TGUID; USBHandle: HDEVINFO; Success: LongBool; Devn: Integer; DevData: TSPDevInfoData; DeviceInterfaceData: TSPDeviceInterfaceData; FunctionClassDeviceData: PSPDeviceInterfaceDetailDataA; BytesReturned: DWORD; Reg: TRegistry; RegData: array of Char; i, RegSize: Integer; Str, USBPath: string; begin Result := false; Pid := ''; Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('SYSTEM\MountedDevices', false); RegSize := Reg.GetDataSize(Format('\DosDevices%s', [DiskID])); SetLength(RegData, RegSize + 1); Reg.ReadBinaryData(Format('\DosDevices%s', [DiskID]), RegData[0], RegSize + 1); for i := 0 to RegSize - 1 do if RegData[i] <> #0 then Str := Str + RegData[i]; Str := Copy(Str, Pos('#RemovableMedia#', Str) + 16, Length(Str)); Str := Copy(Str, 1, Pos('RM', Str) - 2); Str := UpperCase(Str); Reg.CloseKey;

USBGuid := StringToGUID('{53f56307-b6bf-11d0-94f2-00a0c91efb8b}');
USBHandle := SetupDiGetClassDevsA(@USBGuid, nil, 0, DIGCF_PRESENT orDIGCF_DEVICEINTERFACE);
if USBHandle = Pointer(INVALID_HANDLE_VALUE) then Exit;
Devn := 0;
repeatDeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);Success := SetupDiEnumDeviceInterfaces(USBHandle, nil, USBGuid, Devn,DeviceInterfaceData);if Success thenbeginDevData.cbSize := SizeOf(DevData);BytesReturned := 0;SetupDiGetDeviceInterfaceDetailA(USBHandle, @DeviceInterfaceData, nil,0, BytesReturned, @DevData);if (BytesReturned <> 0) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) thenbeginFunctionClassDeviceData := AllocMem(BytesReturned);FunctionClassDeviceData^.cbSize := SizeOf(TSPDeviceInterfaceDetailDataA);if SetupDiGetDeviceInterfaceDetailA(USBHandle, @DeviceInterfaceData,FunctionClassDeviceData, BytesReturned, BytesReturned, @DevData) thenbeginUSBPath := StrPas(PChar(@FunctionClassDeviceData.DevicePath));if Reg.OpenKeyReadOnly(Format('SYSTEM\CurrentControlSet\Enum%s',[StringReplace(Copy(USBPath, 4, Pos('{', USBPath) - 5),'#', '\', [rfReplaceAll])])) thenif UpperCase(Reg.ReadString('ParentIdPrefix')) = Str thenbeginDelete(USBPath, 1, Pos('#', USBPath));PID := Copy(USBPath, Pos('#', USBPath) + 1, Length(USBPath));PID := Copy(PID, 1, Pos('#{', PID) - 1);PID := UpperCase(StringReplace(PID, '&', '', [rfReplaceAll]));Result := True;Break;end;Reg.CloseKey;Inc(Devn);end;FreeMem(FunctionClassDeviceData);end;end;
until not Success;
SetupDiDestroyDeviceInfoList(USBHandle);

finally Reg.Free; end; end; 使用方法: procedure TForm1.Button1Click(Sender: TObject); var Drv, Pid: string; begin Drv := ExtractFileDrive(ParamStr(0)); if GetDriveType(PChar(Drv + '')) <> DRIVE_REMOVABLE then Application.MessageBox('对不起,请把本程序放至到优盘上使用!', 'Error', MB_ICONHAND) else if GetUSBDiskID(Drv, Pid) then ShowMessage(Pid); end;

转载于:https://my.oschina.net/u/582827/blog/729811

获取U盘序列号的代码相关推荐

  1. linux c程序获取u盘序列号,linux下怎么用c获取硬盘物理序列号

    波斯汪 1.在Linux系统中通过C语言获取硬盘序列号,可以借助于ioctl()函数,该函数原型如下:1int ioctl(int fd, unsigned long request, ...); 1 ...

  2. 获取u盘序列号 linux,linux usbmon获取的U盘数据

    urb标志 ep->id 时间戳 ep->tstamp 事件类型(S-submission, C-Callback, E-submission error) ep->type 端点类 ...

  3. C++封装dll供C#调用获取U盘/磁盘序列号信息

    本文中只讲C++中获取U盘序列号信息的核心代码以及返回值,参数传递的问题,具体封装细节可以查看楼主的一篇其他帖子,里面有具体的封装过程,提供参考(如果使用我这种方法建议一定要看我下面的帖子,因为关于项 ...

  4. 『原创』+『参考』使用WMI在C#下获取U盘的永久不变的物理序列号

    近几天想做个只能在优盘里使用的程序,查了很多相关的获取优盘物理序列号的文章,发现基本没有几个现存的,于是就从一英文网站抄了个过来,原文名称:Retrieving Non-Volatile USB Se ...

  5. 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...

    本文将带你了解Android应用开发Android获取手机品牌.手机型号.手机唯一序列号的代码教程,希望本文对大家学Android有所帮助. Android获取手机品牌.手机型号.手机唯一序列号的代码 ...

  6. bat脚本中获取上级目录_批处理bat命令 获取当前盘符和当前目录和上级目录的代码...

    批处理命令获取当前盘符和当前目录 当前盘符:%~d0 当前路径:%cd% 当前执行命令行:%0 当前bat文件路径:%~dp0 当前bat文件短路径:%~sdp0 测试 echo 当前盘符:%~d0 ...

  7. 通过Windows注册表获取U盘、移动硬盘和USB读卡器等设备的PID、VID和序列号

    通过Windows注册表获取U盘.移动硬盘和USB读卡器等设备的PID.VID和序列号 http://blog.csdn.net/trustbo/article/details/50057463 LP ...

  8. c# 获取路径的盘符_c#获取驱动器盘符

    在编写某些Windows管理应用程序时,能够从自定义的驱动器选择列表框中进行选择无疑是非常专业的,使用Delphi或者C++的早期版本时我们都必须使用Win32所提供的许多关于获取磁盘信息的API函数 ...

  9. 通过DeviceIoControl获取U盘或移动硬盘的出品商、制造商和版本号等信息

    在U盘.移动硬盘.USB HUB和各种USB读卡器的主控芯片板上,都存有设备的出品商(vender).制造商(producter).版本号(version)和序列号(SN)信息,前两者一般是英文单词记 ...

最新文章

  1. Cosmos的基石:IL2CPU编译器--.net/C#开源操作系统学习系列三
  2. 30多岁程序员老W,无奈选择转行!问题出在哪?
  3. 20个Nginx Web服务器最佳安全实践
  4. 【转】C语言的位运算的优势
  5. 初等数论--原根--原根间的关系,原根个数
  6. Linux读写锁释放,Linux读写锁的使用
  7. 关于搭建php电商环境时缺少fileinfo、数据库安装出错问题解决办法
  8. 树莓派4b上安装tensorflow+keras
  9. esper_Twitter4j和Esper:在Twitter上跟踪用户情绪
  10. hp服务器硬盘ultra320,惠普/hp 300GB 1.5万转 3.5寸 SAS服务器硬盘 P/N:431944-B21
  11. BootStrap笔记-popover的使用(popover中放验证码,点击更新)
  12. Batch Normalization论文笔记
  13. 使用WMS海外仓储系统可以改变仓储管理的哪些方面?
  14. linux 中select()函数的使用
  15. PAIP.MYSQL数据库比较
  16. android平板识别光驱,平板电脑看不了光盘?一个ORICO外置光驱就可以轻松搞定
  17. 用php搭建微信公众号淘客三合一系统
  18. 次世代3D建模高低模的搭配方式你知道吗?
  19. UE4 Take Recorder的使用
  20. java实现短视频拍摄_短视频 SDK 6大功能技术实现方式详解

热门文章

  1. 教懂你什么是 “ 流量劫持 ”
  2. 技术引路,设计领跑!三星下半场的“破浪”双桨
  3. 【函数递归】简单递归的5个经典例子,你都会吗?
  4. java unsafe 告警,Java安全之Unsafe类
  5. Anaconda和canda简介及区别
  6. 服务器添加广告信息服务,在客户端上插入广告
  7. 推荐7个大学生学习实用的良心网站,值得收藏(网站篇)
  8. KMeans 算法复习
  9. myBatis自定义jdbcType类型
  10. DapaSnap简介