如何使用LibC/WINAPI将dvd用作二进制blob?

如何使用LibC/WINAPI将dvd用作二进制blob?,c,winapi,libc,C,Winapi,Libc,我最近在想,每当我使用光盘时,我要么将图像刻录到光盘上,要么格式化并像使用USB一样使用它。我从未将它用作原始存储介质,用于插入字节或从中读取字节 我现在很好奇,是否可以将DVD用作二进制数据块,我可以随心所欲地将位写入其中 据我所知,如果我对DVD进行格式化,那么使用C写入DVD是很简单的,这样我就可以像典型的C或D驱动器一样对其进行接口(如果我愿意,我甚至可以将磁盘名重命名为C或D) 我很好奇我是否可以在不格式化磁盘的情况下执行同样的操作,这样磁盘上的唯一位就是我写入的位,或者是默认位 总之

我最近在想,每当我使用光盘时,我要么将图像刻录到光盘上,要么格式化并像使用USB一样使用它。我从未将它用作原始存储介质,用于插入字节或从中读取字节

我现在很好奇,是否可以将DVD用作二进制数据块,我可以随心所欲地将位写入其中

据我所知,如果我对DVD进行格式化,那么使用C写入DVD是很简单的,这样我就可以像典型的C或D驱动器一样对其进行接口(如果我愿意,我甚至可以将磁盘名重命名为C或D)

我很好奇我是否可以在不格式化磁盘的情况下执行同样的操作,这样磁盘上的唯一位就是我写入的位,或者是默认位

总之,我希望能够在未格式化的DVD-RW上执行以下操作

  • 将偏移量处的一组字节读入内存中的字节池
  • 在不影响磁盘上其他字节的情况下,覆盖内存中字节池偏移量处的一组字节
  • 如何做到这一点


    提前感谢。

    在Linux上,您只需打开块设备并进行充分对齐的写入:

    您只需使用
    DVD+RW格式
    将媒体格式化为DVD+RW一次。这是一个相对简单的过程,因此您可以从该工具的源代码中提取它


    然而,根据内核文档,什么是“充分对齐的写入”在某种程度上取决于规范所说的2kib,但是一些驱动器需要更多的对齐。这一层也没有磨损均衡或扇区重新映射,因此要获得好的结果,确实需要使用磁盘上的数据结构,这反映了这项技术实际上更接近于一次写入,而不是真正的随机访问。

    简而言之,您希望在原始dvd设备上执行I/O。这样做的能力取决于内核向您公开的功能。我不确定Windows API是否向任何人公开了这样的功能,但即使它公开了,你可能会发现它在大多数情况下都不令人满意。我在看,我不确定为什么它会不令人满意。我知道这可能会很慢,但我想,最坏的情况下,应该至少可以将整个dvd读入内存,覆盖其中的一个字节,然后像烧掉启动盘一样将该blob写回磁盘。如果必要的话,我愿意使用COM/.NET来实现这一点(因为它们与C是二进制兼容的,可以通过WINAPI访问)。当然可以将整个DVD映像读入文件(或内存,如果您有足够的话),和/或将整个DVD映像写回DVD设备。有很多软件和工具可以实现这一点,包括IMAPI。但是DVD并不是很好的随机存取存储设备,而这正是你想要使用它们的原因。您可能可以做到这一点,但完全不同的方法可能会更好。同样,在大多数情况下,我知道由于seek/moving部件的原因,速度会相当慢,但我很好奇是否可以以偏移量读/写。我知道它可能会比HDD慢,并且需要群集以获得任何类型的可靠性,但我只对概念验证感兴趣,并且不需要包装现有的COM/.NET解决方案(尽管我找不到任何以偏移量写入的解决方案)是否可行感兴趣。