刻录后验证光盘实际上是做什么来验证数据的?

use*_*428 6 windows-7 burning optical-drive

我想这是原始文件和刻录在光盘上的文件之间的某种比较,但有人知道它是如何在低层次上真正完成的吗?

我的意思是,它是否会创建源内容和目标内容的散列,然后比较它们?如果是这样,它是否将刻录内容的哈希值存储在 RAM 中?还是将其保存在硬盘驱动器上的临时文件中?是否有关于正在发生的事情的日志文件?

只是想知道这个功能到底是如何工作的 :) 我指的是 Windows Image Burner。

Fra*_*mas 12

在 Windows API 上查看这些 MSDN 页面以获取IBurnVerification接口和IMAPI_BURN_VERIFICATION_LEVEL枚举。

对于数据磁盘,在快速模式下,它不会对整个磁盘进行校验和,而只是对选定的扇区进行校验。然后确保 API 调用READ_DISC_INFOREAD_TRACK_INFO成功针对新磁盘。

对于完整验证,它会执行上述检查,然后针对新磁盘上的最后一个会话执行完整校验和,对照在被刻录的内存流上计算的校验和。校验和必须存储在 ram 中,但它们可能是短暂的值。请注意,比较是针对 RAM 中的磁盘映像,而不是源媒体本身,因此如果源数据没有正确读取,它将被错误写入。验证不会检测到这一点。

对于音乐磁盘,它侧重于检查READ_TRACK_INFO和磁盘目录,但不执行 Checksum 计算。音乐没有完整的验证模式。


Syn*_*ech 6

Frank 很好地解释了 Windows 特定的验证。我会给出一个更笼统的答案。

刻录后验证光盘实际上是做什么来验证数据的?

我的意思是,它是否会创建源内容和目标内容的散列,然后比较它们?如果是这样,它是否将刻录内容的哈希值存储在 RAM 中?还是将其保存在硬盘驱动器上的临时文件中?是否有关于正在发生的事情的日志文件?

这当然是可以实现比较的一种方式:散列一个文件(希望使用足够大的——读取冲突概率低的算法),对另一个重复,然后比较散列。如果这是实现验证的方式,那么您将能够看到驱动器 LED 闪烁一段时间,然后 CD/DVD-LED 闪烁一段时间。

另一种实现验证的方法是读取一个文件的一个块,然后从另一个文件中读取相同的块,比较它们,然后重复直到到达文件末尾。在这种情况下,您将看到两个驱动器的 LED 来回交替。

当然,如果硬盘驱动器和光驱没有 LED,那么它不会那么明显,但是您仍然可以通过 ProcessMonitor 之类的东西看到它,因为它会记录一系列读取,然后其他要么是单个大爆发,要么是交替的小爆发。

我想这是原始文件和刻录在光盘上的文件之间的某种比较,但有人知道它是如何在低层次上真正完成的吗?

实际上,它真正做的只是刷新驱动器缓存,以便比较功能从实际磁盘而不是内存缓存中读取数据。显然这是一个关键步骤,因为如果验证是从缓存中完成的,那么它并不代表磁盘上的实际内容,因此很容易发生损坏。

您可以通过比较发生的速度来查看比较是从驱动器还是从 RAM 中的缓存完成。如果您手动进行简单的比较(例如,使用 WinDiff 或 WinMerge 或使用散列工具对它们进行散列),您会注意到比较的速度比预期的要快得多,因为它是从内存缓存中读取文件。您必须刷新缓存以强制它从实际磁盘读取。对于光驱(以及其他可移动媒体,如闪存驱动器和存储卡,只需弹出驱动器就足以刷新缓存,但对于硬盘驱动器,它几乎没有那么简单(尽管通常这并不重要,因为新副本是您要测试的副本)。