C 以最大速度从DVD读取数据

C 以最大速度从DVD读取数据,c,winapi,dd,dvd,disk-io,C,Winapi,Dd,Dvd,Disk Io,我正试图在Windows上用C语言制作一个磁盘转储程序(如dd)。 程序即将完成,但有一个问题:从DVD读取数据非常慢。 根据规范,我的电脑的DVD驱动器支持高达8倍的读取速率,但我的程序读取速度约为5 MB/秒(约4倍)。我想以最大速度读取数据 我的程序的算法很简单:使用win32api CreateFile和ReadFile,如 src=CreateFileA("\\\\.\\E:",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRIT

我正试图在Windows上用C语言制作一个磁盘转储程序(如dd)。 程序即将完成,但有一个问题:从DVD读取数据非常慢。 根据规范,我的电脑的DVD驱动器支持高达8倍的读取速率,但我的程序读取速度约为5 MB/秒(约4倍)。我想以最大速度读取数据

我的程序的算法很简单:使用win32api CreateFile和ReadFile,如

src=CreateFileA("\\\\.\\E:",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(src,buf,buffer_size,&read_ret,NULL);
缓冲区大小可以设置为20-100MB。我试着用DeviceIoControl设置速度,比如

cdromSetSpeed.RequestType = CdromSetSpeed;
cdromSetSpeed.ReadSpeed = 0xFFFF; // max speed
cdromSetSpeed.WriteSpeed = 0xFFFF; // max speed
cdromSetSpeed.RotationControl = CdromDefaultRotation;
DeviceIoControl(src,IOCTL_CDROM_SET_SPEED,&cdromSetSpeed,sizeof(cdromSetSpeed),NULL,0,NULL,NULL);
但没有效果


请告诉我是否有办法以最大速度从DVD读取数据。

如果速度设置正确,可能会有一个最佳缓冲区大小可供使用。可能有一个API调用来确定这一点。如果没有(或者即使有这样的API调用),您可能希望尝试不同的缓冲区大小(例如4096的倍数)。它可以是64KB或1MB或其他值。看看有没有效果。否则,请再次检查速度设置代码。可能会有电话返回实际/当前速度。您可能希望在设置之后执行此操作,以查看它实际使用[trust--but verify;-)]的速度。这本小册子可能夸大了一些事情……DVD读取呼叫可能被阻塞[同样,对磁盘的写入呼叫也是如此]。您可能需要查看是否存在异步选项[或事件驱动]。或者,您可能需要将读卡器代码与写卡器代码放在一个单独的线程中。或者,您可能需要告诉系统您需要连续/顺序读取(例如,它不会试图停止DVD驱动器,因为它认为您正在偶尔读取)。您可能需要使用多个缓冲区,并在两个线程之间来回传递它们。也就是说,您可以立即开始下一次读取,而不是等待编写器完成。事实上,为了帮助隔离问题,您可以临时禁用任何对读取来说并非绝对必要的处理或编写代码。保持此选项处于禁用状态,直到达到完全读取速度。这将告诉您写入代码是否是问题的一部分。您的驱动器是否有可能在模式下运行?您是否尝试过使用
FILE\u FLAG\u OVERLAPPED
异步模式读取或
FILE\u FLAG\u SEQUENTIAL\u SCAN
顺序读取