Код | function GetFlashSerialFromDrive(const Drive:string):string; const GUID_DEVINTERFACE_VOLUME:TGUID='{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}'; var PnPHandle:HDEVINFO; DevData:TSPDevInfoData; DeviceInterfaceData:TSPDeviceInterfaceData; FunctionClassDeviceData:PSPDeviceInterfaceDetailData; Devn:Integer; BytesReturned:DWORD; Inst:DEVINST; MountPointName:string; Key:HKEY; Buffer:array[0..4095] of Char; function GetVolumeNameForVolumeMountPointString(const Name:string):string; var Volume:array[0..MAX_PATH] of Char; begin FillChar(Volume[0],SizeOf(Volume),0); GetVolumeNameForVolumeMountPoint(PChar(Name),@Volume[0],SizeOf(Volume)); Result:=Volume; end; function ExtractSerial(const SymbolicName:string):string; var Count:DWORD; PC,First:PChar; begin PC:=PChar(SymbolicName); Count:=0; First:=nil; while PC^<>#0 do begin if PC^='#' then begin case Count of 1:First:=PC+1; 2:begin SetString(Result,First,PC-First); Exit; end; end; Inc(Count); end; Inc(PC); end; Result:=''; end; begin Result:=''; PnPHandle:=SetupDiGetClassDevs(@GUID_DEVINTERFACE_VOLUME,nil,0,DIGCF_PRESENT or DIGCF_DEVICEINTERFACE); if PnPHandle<>Pointer(INVALID_HANDLE_VALUE) then ; try MountPointName:=GetVolumeNameForVolumeMountPointString(Drive); DeviceInterfaceData.cbSize:=SizeOf(TSPDeviceInterfaceData); Devn:=0; while SetupDiEnumDeviceInterfaces(PnPHandle,nil,GUID_DEVINTERFACE_VOLUME,Devn,DeviceInterfaceData) do begin DevData.cbSize:=SizeOf(DevData); BytesReturned:=0; SetupDiGetDeviceInterfaceDetail(PnPHandle,@DeviceInterfaceData,nil,0,BytesReturned,@DevData); if (BytesReturned<>0)and(GetLastError=ERROR_INSUFFICIENT_BUFFER) then begin FunctionClassDeviceData:=AllocMem(BytesReturned); try FunctionClassDeviceData.cbSize:=SizeOf(TSPDeviceInterfaceDetailData); if SetupDiGetDeviceInterfaceDetail(PnPHandle,@DeviceInterfaceData,FunctionClassDeviceData,BytesReturned,BytesReturned,@DevData) then begin if GetVolumeNameForVolumeMountPointString(PChar(@FunctionClassDeviceData.DevicePath)+'\')=MountPointName then begin Inst:=DevData.DevInst; CM_Get_Parent(Inst,Inst,0); CM_Get_Parent(Inst,Inst,0); CM_Open_DevNode_Key(Inst,KEY_READ,0,REGDISPOSITION(RegDisposition_OpenExisting),Key,0); Buffer[0]:=#0; if Key<>INVALID_HANDLE_VALUE then begin BytesReturned:=SizeOf(Buffer); if RegQueryValueEx(Key,'SymbolicName',nil,nil,@Buffer[0],@BytesReturned)=0 then begin Result:=ExtractSerial(Buffer); if Pos('&',Result)>0 then Result:=''; end; RegCloseKey(Key); end; Exit; end; end; finally FreeMem(FunctionClassDeviceData); end; end; Inc(Devn); end; finally SetupDiDestroyDeviceInfoList(PnPHandle); end; end;
|
Добавлено через 52 секунды |