function Search(hParent: HKEY; var SubKey: ShortString): LongBool;
var
hChild: HKEY;
Index: Cardinal;
Data: ShortString;
begin
Index := 0;
RegOpenKey(hParent, @SubKey[1], hChild);
RegQueryValue(hChild, 'ParentIdPrefix', Data, SizeOf(Data));
Result := not LongBool(lstrcmp(@Data, @Device));
while not Result and (RegEnumKey(hChild, Index, @SubKey[1], SizeOf(SubKey) - 1) = ERROR_SUCCESS) do
begin
Result := Search(hChild, SubKey);
Inc(Index);
end;
RegCloseKey(hChild);
end;
function usbGetSerial;
var
lpSerialNumber: PChar;
hKey: Windows.HKEY;
Index: Integer;
Value: Char;
begin
Result := False;
ValueName[12] := Drive;
RegOpenKey(HKEY_LOCAL_MACHINE, 'SYSTEM\MountedDevices', hKey);
RegQueryValue(hKey, @ValueName, Device, SizeOf(Device));
RegCloseKey(hKey);
Index := 0;
repeat if Device[(Index + 3) * 2 + 54] <> '#' then
Value := Device[Index * 2 + 54] else Value := #0;
Device[Index] := Value;
Inc(Index);
until Value = #0;
SerialNumber[0] := #0;
lstrcpy(@SerialNumber[1], 'SYSTEM\CurrentControlSet\Enum\USBSTOR');
if (Device[0] <> #0) and Search(HKEY_LOCAL_MACHINE, SerialNumber) then
begin
lpSerialNumber := @SerialNumber[1];
repeat Inc(SerialNumber[0]);
Inc(lpSerialNumber);
if lpSerialNumber[0] = '&' then
lpSerialNumber[0] := #0;
until lpSerialNumber[0] = #0;
Result := True;
end;
end;