[英]how to mount partitions from USB drives in Windows using Delphi?
I want to mount all partitions from USB drives in Windows (XP). 我想从Windows(XP)中的USB驱动器挂载所有分区。 I mean I want to assign to each of them drive letters (when they don't have one).
我的意思是我想给他们每个人分配驱动器号(如果他们没有一个)。 The OS is doing this automatically but there are situations when such a program is useful.
操作系统会自动执行此操作,但在某些情况下此类程序很有用。
I know how to find if a drive is on USB or not. 我知道如何查找驱动器是否在USB上。 My code so far is:
到目前为止,我的代码是:
type
STORAGE_QUERY_TYPE = (PropertyStandardQuery = 0, PropertyExistsQuery, PropertyMaskQuery, PropertyQueryMaxDefined);
TStorageQueryType = STORAGE_QUERY_TYPE;
STORAGE_PROPERTY_ID = (StorageDeviceProperty = 0, StorageAdapterProperty);
TStoragePropertyID = STORAGE_PROPERTY_ID;
STORAGE_PROPERTY_QUERY = packed record
PropertyId: STORAGE_PROPERTY_ID;
QueryType: STORAGE_QUERY_TYPE;
AdditionalParameters: array[0..9] of AnsiChar;
end;
TStoragePropertyQuery = STORAGE_PROPERTY_QUERY;
STORAGE_BUS_TYPE = (BusTypeUnknown = 0, BusTypeScsi, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre,
BusTypeUsb, BusTypeRAID, BusTypeiScsi, BusTypeSas, BusTypeSata, BusTypeMaxReserved = $7F);
TStorageBusType = STORAGE_BUS_TYPE;
STORAGE_DEVICE_DESCRIPTOR = packed record
Version: DWORD;
Size: DWORD;
DeviceType: Byte;
DeviceTypeModifier: Byte;
RemovableMedia: Boolean;
CommandQueueing: Boolean;
VendorIdOffset: DWORD;
ProductIdOffset: DWORD;
ProductRevisionOffset: DWORD;
SerialNumberOffset: DWORD;
BusType: STORAGE_BUS_TYPE;
RawPropertiesLength: DWORD;
RawDeviceProperties: array[0..0] of AnsiChar;
end;
TStorageDeviceDescriptor = STORAGE_DEVICE_DESCRIPTOR;
const
IOCTL_STORAGE_QUERY_PROPERTY = $002D1400;
var i: Integer;
H: THandle;
USBDrives: array of Byte;
Query: TStoragePropertyQuery;
dwBytesReturned: DWORD;
Buffer: array[0..1023] of Byte;
sdd: TStorageDeviceDescriptor absolute Buffer;
begin
SetLength(UsbDrives, 0);
SetErrorMode(SEM_FAILCRITICALERRORS);
for i := 0 to 99 do
begin
H := CreateFile(PChar('\\.\PhysicalDrive' + IntToStr(i)), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if H <> INVALID_HANDLE_VALUE then
begin
try
dwBytesReturned := 0;
FillChar(Query, SizeOf(Query), 0);
FillChar(Buffer, SizeOf(Buffer), 0);
sdd.Size := SizeOf(Buffer);
Query.PropertyId := StorageDeviceProperty;
Query.QueryType := PropertyStandardQuery;
if DeviceIoControl(H, IOCTL_STORAGE_QUERY_PROPERTY, @Query, SizeOf(Query), @Buffer, SizeOf(Buffer), dwBytesReturned, nil) then
if sdd.BusType = BusTypeUsb then
begin
SetLength(USBDrives, Length(USBDrives) + 1);
UsbDrives[High(USBDrives)] := Byte(i);
end;
finally
CloseHandle(H);
end;
end;
end;
for i := 0 to High(USBDrives) do
begin
//
end;
end.
But I don't know how to access partitions on each drive and mounts them. 但是我不知道如何访问每个驱动器上的分区并挂载它们。 Can you please help me?
你能帮我么?
Have a look at the volume management functions - http://msdn.microsoft.com/en-us/library/aa365730%28v=vs.85%29.aspx 看一下卷管理功能-http://msdn.microsoft.com/zh-cn/library/aa365730%28v=vs.85%29.aspx
FirstFirstVolume, FindNextVolume, FindVolumeClose will list off the partitions as \\\\?\\Volume{Guid} names. FirstFirstVolume,FindNextVolume,FindVolumeClose将以\\\\?\\ Volume {Guid}名称列出分区。
Createfile should be able to option the volume names so your code above can check it's USB. Createfile应该可以选择卷名,以便上面的代码可以检查它的USB。
SetVolumeMountPoint lets you mount a Volume as a drive letter or a folder mount point. SetVolumeMountPoint允许您将卷挂载为驱动器号或文件夹挂载点。
This blog entry talks about Volume names - http://blogs.msdn.com/b/adioltean/archive/2005/04/16/408947.aspx 此博客文章讨论卷名-http://blogs.msdn.com/b/adioltean/archive/2005/04/16/408947.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.