阅读:1188回复:3
一个关于virtual cd-rom的问题!
在对付保护光盘时, 他采用了一种技术在扇区标准之间加入一个byte,然后后面的数据后移,我要读它就需要还原成标准格式,必须去掉哪个庸余的字节,然后把后边的数据都前移一个byte.
我现在用的是Direct Buffer方式 fdo->Flags|=DO_DIRECT_IO;读取数据,然而系统一个PAGE_SIZE 是4K,而光盘扇区一个是2K,所以我一次读取最小粒度是4K,而这包含了两个光盘扇区,和中间的一个庸余字节,当我用Retcopymemery(),这个这样我就page falut exception。 所以我想在读的时候如何能够不对中间那个byte读。 各位有什么指点? |
|
|
沙发#
发布于:2002-02-25 15:59
是2048+1+2048吗?
|
|
|
板凳#
发布于:2002-02-25 17:50
高手!是的呀,就是这样的情况有办法解决吗?中间哪个字节是不要的,删除它该如何做?如何操作才能修改被直接锁定的4k页内的数据呢?
谢谢谢谢,希望指教,如果知道,跟您作揖了<<<<< |
|
|
地板#
发布于:2002-02-26 18:30
if you develop your own cdrom driver(like virtual cdrom), of course you can do what you want .
if you only want read this type of media in a common cdrom or exist virtual cdrom, ou need to make a filter driver, realize you filter driver irp_mj_read dispatch routine like following way: 1.analysis read request (if it data mode 1, offset,size will be aligned to 2048 , if data mode , it should be 2336) 2.change orignal request to lba or msf(raw data is 2352 alignment, commonly you need not get subcode area) 3.allocate new irp/mdl and set device io control to IOCTL_CDROM_RAW_READ (build scsi command and set opcode to scsi_op_read_cd is better, but a little difficult) 4. send it to lower driver 5. get data if success, copy what you want back to user buffer. (when copy , of course you can skip that dummy one byte) 6. free mdl, your allocated irp and complete original request in 9x/Me, it should be a layer driver. in 2k/xp, it\'s only a common filer driver. |
|