文档章节

获取U盘序列号的代码

vga
 vga
发布于 2016/08/09 08:05
字数 483
阅读 36
收藏 0
点赞 0
评论 0

获取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 or
  DIGCF_DEVICEINTERFACE);
if USBHandle = Pointer(INVALID_HANDLE_VALUE) then Exit;
Devn := 0;
repeat
  DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);
  Success := SetupDiEnumDeviceInterfaces(USBHandle, nil, USBGuid, Devn,
    DeviceInterfaceData);
  if Success then
  begin
    DevData.cbSize := SizeOf(DevData);
    BytesReturned := 0;
    SetupDiGetDeviceInterfaceDetailA(USBHandle, @DeviceInterfaceData, nil,
      0, BytesReturned, @DevData);
    if (BytesReturned <> 0) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
    begin
      FunctionClassDeviceData := AllocMem(BytesReturned);
      FunctionClassDeviceData^.cbSize := SizeOf(TSPDeviceInterfaceDetailDataA);
      if SetupDiGetDeviceInterfaceDetailA(USBHandle, @DeviceInterfaceData,
        FunctionClassDeviceData, BytesReturned, BytesReturned, @DevData) then
      begin
        USBPath := StrPas(PChar(@FunctionClassDeviceData.DevicePath));
        if Reg.OpenKeyReadOnly(Format('SYSTEM\CurrentControlSet\Enum%s',
          [StringReplace(Copy(USBPath, 4, Pos('{', USBPath) - 5),
            '#', '\', [rfReplaceAll])])) then
          if UpperCase(Reg.ReadString('ParentIdPrefix')) = Str then
          begin
            Delete(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;

本文转载自:http://www.delphifans.com/infoview/Article_940.html

共有 人打赏支持
vga

vga

粉丝 21
博文 353
码字总数 23746
作品 0
佳木斯
Kenvix/USBCopyer

USBCopyer: 插上U盘自动复制U盘文件 用于在插上目标U盘后自动复制该U盘的文件。"偷U盘文件的神器",支持设置冲突解决方案,支持延迟复制,支持扩展名黑白名单,支持磁盘分区号/序列号黑名单,...

Kenvix
2016/05/21
0
0
U盘中毒或误操作变成raw格式,磁盘显示容量为0修复解决方案

以前碰到到几个坏U盘,U盘格式是raw,磁盘显示容量为0,使用多种修工具 ()后基本上都被修复好。 这几天一个清华紫光U盘也变成raw啦,悲剧呀,弄了几天用尽各种手段都无法修复。最后在U盘之...

长平狐
2013/04/25
796
0
朝鲜红星 Linux 嵌入隐藏标记跟踪用户

对泄露的朝鲜Red Star Linux操作系统的分析发现,系统内置了水印功能可用于跟踪用户。在Red StarLinux中,朝鲜自己构建了一个内核模块叫rtscan,运行多个共享代码的二进制文件,其中一个叫o...

oschina
2015/07/22
5.8K
51
安装64位win7(适合没有4G以上U盘或DVD光驱)

从http://www.wingwy.com/archives/201202993.html 下载wingwy-pe3.1-v2-fix3.iso文件,可以安装到U盘或硬盘,我的2G U盘是以grub4dos启动的,于是把iso文件中的boot,efi,winpe目录和bootmgr文件...

wzk
2012/08/29
0
0
安装黑群晖存储系统详细教程,体验群晖存储功能

最近有个需求,东西太多了想搞个共享系统。本来使用linux系统做一个很容易的,比如Samba服务,vsftp服务等。 或者使用一些开源的存储系统比如,opennas,free4nas,openmediavault等等都可以,...

zisehuainian
06/28
0
0
U盘安装系统(XP 2003)

我用的是老毛桃的winPE系统 安装过程包括以下几个步骤: 1)创建 WinPE 系统的 U盘启动盘; 2)创建或获取操作系统安装盘的镜像文件(.iso文件); 3)修改 BOIS 的启动设置为从 U 盘启动; ...

v289
2016/07/31
0
0
java web系统在高并发和分布式下如何实现订单号生成唯一

方案一:如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单。如果存在并发,且订单号...

刘诗书
2017/11/22
0
0
用Google地图为你的网站添加地图之一

Google地图(http://maps.google.com很可能是最具有完整的Ajax网络应用。他为用户提供的地图可四处移动、缩放以及执行通行证,甚至还有注解。你可以以地图,卫星图片,或者他们混合的方式来显...

晨曦之光
2012/03/09
0
0
Android 获取cpu序列号

我们这一篇主要就是讲我们的android里的智能手机的cpu,其实主要展现的就是我们android是多么的强大。好了代码很少,也应该算很简单了,就不和大家说了。我们还是来看看代码吧: /** 获取CPU...

长平狐
2012/08/09
1K
0
Android 获取cpu序列号

我们这一篇主要就是讲我们的android里的智能手机的cpu,其实主要展现的就是我们android是多么的强大。好了代码很少,也应该算很简单了,就不和大家说了。我们还是来看看代码吧: /** 获取CPU...

长平狐
2012/08/21
133
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
31分钟前
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
0
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
6
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部