IOCTL_STORAGE_QUERY_PROPERTY 如何设定呢?function Ctl_Code(DeviceType, FuncNo, Method, Access: integer): integer;
begin
Result:= (DeviceType shl 16) or (Access shl 14) or (FuncNo shl 2) or (Method)
end;function GetDriveProperty(hDevice:Thandle;pDevDesc:PSTORAGE_DEVICE_DESCRIPTOR):Boolean;
var
Query:STORAGE_PROPERTY_QUERY; // 查询输入参数
dwOutBytes:Dword; // IOCTL输出数据长度
IOCTL_STORAGE_QUERY_PROPERTY:integer;begin
// 指定查询方式
IOCTL_STORAGE_QUERY_PROPERTY:=Ctl_Code(IOCTL_STORAGE_BASE, $0500, METHOD_BUFFERED, FILE_ANY_ACCESS);
Query.PropertyId:= StorageDeviceProperty;
Query.QueryType:= PropertyStandardQuery;
Result:=DeviceIoControl(hDevice, // 设备句柄
IOCTL_STORAGE_QUERY_PROPERTY , // 取设备属性信息
@Query,
sizeof(Query), // 输入数据缓冲区
pDevDesc, // 输出数据缓冲区
pDevDesc.Size, // 输出数据长度
dwOutBytes,
nil); // 用同步I/O
if getlasterror()<>0 then showmessage(inttostr(getlasterror()));
end;
procedure TForm1.Button9Click(Sender: TObject);
var
sDrv: Char;
sDrvLetter: String;
hDevice : THandle;
szBuf: PChar;
pDevDesc: PSTORAGE_DEVICE_DESCRIPTOR;
begin
for sDrv := 'A' to 'Z' do
begin
sDrvLetter := sDrv + ':\';
Case GetDriveType(PChar(sDrvLetter)) of
DRIVE_RAMDISK:
begin
ShowMessage('test');
end;
DRIVE_FIXED :
begin
hDevice := CreateFile(PChar('\\.\' + LowerCase(sDrv) + ':'), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE, 0,
OPEN_EXISTING, 0, 0);
{hDevice:=CreateFile(pchar('\\?\'+LowerCase(sDrv)+':'),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0); }
if (hDevice <> INVALID_HANDLE_VALUE) then begin SetLength(pDevDesc.RawDeviceProperties, 512);
pDevDesc.Size := SizeOf(pDevDesc) + 507; if(GetDriveProperty(hDevice, pDevDesc)) then
begin
if pDevDesc.BusType = BusTypeUsb then
begin
ShowMessage('test');
end;
end; end;
CloseHandle(hDevice);
end;
end;
end;
begin
Result:= (DeviceType shl 16) or (Access shl 14) or (FuncNo shl 2) or (Method)
end;function GetDriveProperty(hDevice:Thandle;pDevDesc:PSTORAGE_DEVICE_DESCRIPTOR):Boolean;
var
Query:STORAGE_PROPERTY_QUERY; // 查询输入参数
dwOutBytes:Dword; // IOCTL输出数据长度
IOCTL_STORAGE_QUERY_PROPERTY:integer;begin
// 指定查询方式
IOCTL_STORAGE_QUERY_PROPERTY:=Ctl_Code(IOCTL_STORAGE_BASE, $0500, METHOD_BUFFERED, FILE_ANY_ACCESS);
Query.PropertyId:= StorageDeviceProperty;
Query.QueryType:= PropertyStandardQuery;
Result:=DeviceIoControl(hDevice, // 设备句柄
IOCTL_STORAGE_QUERY_PROPERTY , // 取设备属性信息
@Query,
sizeof(Query), // 输入数据缓冲区
pDevDesc, // 输出数据缓冲区
pDevDesc.Size, // 输出数据长度
dwOutBytes,
nil); // 用同步I/O
if getlasterror()<>0 then showmessage(inttostr(getlasterror()));
end;
procedure TForm1.Button9Click(Sender: TObject);
var
sDrv: Char;
sDrvLetter: String;
hDevice : THandle;
szBuf: PChar;
pDevDesc: PSTORAGE_DEVICE_DESCRIPTOR;
begin
for sDrv := 'A' to 'Z' do
begin
sDrvLetter := sDrv + ':\';
Case GetDriveType(PChar(sDrvLetter)) of
DRIVE_RAMDISK:
begin
ShowMessage('test');
end;
DRIVE_FIXED :
begin
hDevice := CreateFile(PChar('\\.\' + LowerCase(sDrv) + ':'), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE, 0,
OPEN_EXISTING, 0, 0);
{hDevice:=CreateFile(pchar('\\?\'+LowerCase(sDrv)+':'),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0); }
if (hDevice <> INVALID_HANDLE_VALUE) then begin SetLength(pDevDesc.RawDeviceProperties, 512);
pDevDesc.Size := SizeOf(pDevDesc) + 507; if(GetDriveProperty(hDevice, pDevDesc)) then
begin
if pDevDesc.BusType = BusTypeUsb then
begin
ShowMessage('test');
end;
end; end;
CloseHandle(hDevice);
end;
end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货