⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit7.pas

📁 对U盘读出序列号
💻 PAS
字号:
unit Unit7;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Registry;

type
  TForm7 = class(TForm)
    Button1: TButton;


    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

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 TForm7.Button1Click(Sender: TObject);
var
  Drv, Pid: string;
begin
   Drv := 'G:';
  //if GetDriveType(PChar(Drv + '\')) <> DRIVE_REMOVABLE then
   // Application.MessageBox('癸ぃ癬叫рセ祘

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -