Delphi 加快卷上的createFile调用

Delphi 加快卷上的createFile调用,delphi,winapi,disk,Delphi,Winapi,Disk,我正在写一个软件来和一个录音设备通信 如果通过USB连接到pc,则模拟大容量存储设备。 通过通信可以访问该设备上的某些特殊功能 在该设备的特殊扇区上。在windows上访问该扇区 我需要: 打开新到达的驱动器的手柄 通过deviceIOControl和IOCTLVolumeGetVolumeMediskExtents获取物理驱动器号 打开找到的physicaldrive,读写到一个特殊扇区 到目前为止,一切都很好,但第一个开始就开始了 卷句柄可能需要相当长的时间 我所做的基本上是: var

我正在写一个软件来和一个录音设备通信 如果通过USB连接到pc,则模拟大容量存储设备。 通过通信可以访问该设备上的某些特殊功能 在该设备的特殊扇区上。在windows上访问该扇区 我需要:

  • 打开新到达的驱动器的手柄
  • 通过deviceIOControl和IOCTLVolumeGetVolumeMediskExtents获取物理驱动器号
  • 打开找到的physicaldrive,读写到一个特殊扇区
到目前为止,一切都很好,但第一个开始就开始了 卷句柄可能需要相当长的时间

我所做的基本上是:

var hdl : THandle;
    start, stop, freq : INT64;
begin
     hdl := INVALID_HANDLE_VALUE;

     QueryPerformanceFrequency(freq);
     QueryPerformanceCounter(start);

     fHandle := CreateFile( PChar('\\.\' + fDriveLetter + ':'),
                        GENERIC_READ,
                        FILE_SHARE_WRITE or FILE_SHARE_READ,
                        nil,
                        OPEN_EXISTING,
                        0,
                        0);

     QueryPerformanceCounter(stop);
     OutputDebugString( PChar( Format('Open drive took %.3fms', [(stop - start)/freq*1000]) ));

     if hdl = INVALID_HANDLE_VALUE then
        raise EVolumeError.Create( 'Cannot Open Drive: '+fDriveLetter+#13#10+
                               SysErrorMessage(GetLastError));
end;
此呼叫可能需要几秒钟,直到驱动器到达

我的猜测是windows首先读取的是耗时很长的完整FAT 这个小录音设备实际上总是创建 保留完整的磁盘空间(4GB)。 有人知道如何加快这个过程吗?我从来不需要读任何东西 从文件系统,但我需要的是处理获取信息
关于底层physicaldrive编号,并从中执行读写操作。

根据msdn,访问卷时,需要至少添加文件共享写入标志。msdn:“打开卷或软盘时,如果您只想发送
IOCTL\u volume\u GET\u volume\u disk\u extends
,定义为
FILE\u ANY\u ACCESS
,则dwShareMode参数必须具有FILE\u SHARE\u WRITEflag”-您必须使用
FILE\u READ\u属性打开文件,最大值或dwdesired ACCESS中的0。因此,将
GENERIC\u READ
更改为0。这会阻止卷装入,并加速我的错误。我混淆了共享标志
文件共享写入
和访问标志-
文件写入访问
。确实,您需要尝试将访问标志从
GENERIC\u READ
更改为0(
SYNCHRONIZE
)好的,我会尝试。。。同时,我们更改了录制设备中的群集大小,然后将等待时间减少了8倍(从4kB更改为32kB)。这里真正的问题是-您的磁盘设备是否将由文件系统装载。如果您只发送
IOCTL\u VOLUME\u GET\u VOLUME\u DISK\u extends
-您根本不需要filsystem-它无论如何都会将此IOCTL传递给下面的存储设备。如果文件系统装载过程占用了大量时间,您需要避免这种情况。方法-将访问标志更改为最小值-