20楼#
发布于:2002-12-03 13:57
我这个比较特殊,说什么只要有以前的DDK他就会出错(在Readme里特意写出来了不要装以前的DDK,而且它是ME&2K&XP版和在一起的)所以就来个一了百了卸了算了。DDK卸了之后DS也就好多都Build不过了因为IFSKIT少了好多头文件。
|
|
21楼#
发布于:2002-12-03 13:59
哦,可能我的IFSKIT版本比较老
|
|
22楼#
发布于:2002-12-03 14:06
我想是的,老版本的是必须装DDK的。我的这个是从霉国刚刚带回来的$1000呀贵就一个字,我只说一次。 :)1CD+2DVDs
|
|
23楼#
发布于:2002-12-03 14:08
我再按你说的方法试试,不行就还得请教你呀!我写Driver还是菜鸟级,你现在在哪里?
|
|
24楼#
发布于:2002-12-03 14:17
我不在北京,你可以在这问的,人多解决问题容易:)
|
|
25楼#
发布于:2002-12-03 14:40
PDEVICE_OBJECT rawDeviceObject;
PFILE_OBJECT fileObject; RtlInitUnicodeString(&UnicodeString, L\"\\\\Device\\\\CdRom0\"); ntStatus = IoGetDeviceObjectPointer(&UnicodeString, FILE_READ_DATA, &fileObject, &rawDeviceObject); KeInitializeEvent(&event, NotificationEvent, FALSE); SetupCDB(cdb); SetupSRB(srb); irp = IoBuildDeviceIoControlRequest(IOCTL_SCSI_PASS_THROUGH,rawDeviceObject,&srb, sizeof(SCSI_PASS_THROUGH_DIRECT),&srb, sizeof(SCSI_PASS_THROUGH_DIRECT),FALSE, &event, &ioStatus); ntStatus = IoCallDriver(rawDeviceObject, irp); if (ntStatus == STATUS_PENDING){ KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, NULL); ntStatus = ioStatus.Status; } 为什么他就重启动机器了? [编辑 - 12/3/02 by zhangjinsuo] |
|
26楼#
发布于:2002-12-03 14:51
不清楚.
不过你这里应该complete 这个request,而且KeWaitForSingleObject的第二个参数应该是Executive吧. |
|
27楼#
发布于:2002-12-03 15:14
按你说的改了一下问题依旧,你可知道哪里有读光盘扇区的完整源程序?
|
|
28楼#
发布于:2002-12-03 15:28
rawDeviceObject肯定不是NULL?
|
|
29楼#
发布于:2002-12-03 15:38
SetupCDB(cdb);
SetupSRB(srb); irp = IoBuildDeviceIoControlRequest(IOCTL_SCSI_PASS_THROUGH,rawDeviceObject,&srb, sizeof(SCSI_PASS_THROUGH_DIRECT),&srb, sizeof(SCSI_PASS_THROUGH_DIRECT),FALSE, &event, &ioStatus); -> 如果问题不在SetCDB/SetupSRB上,可能这有问题 IOCTL_SCSI_PASS_THROUGH_DIRECT: Parameters.DeviceIoControl.InputBufferLength indicates the size in bytes of the buffer at Irp->AssociatedIrp.SystemBuffer, which must be at least (RequestSenseStorageSize + sizeof (SCSI_PASS_THROUGH_DIRECT)). The size of the SCSI_PASS_THROUGH_DIRECT structure is fixed IOCTL_SCSI_PASS_THROUGH: Parameters.DeviceIoControl.InputBufferLength indicates the size in bytes of the buffer at Irp->AssociatedIrp.SystemBuffer, which must be at least (RequestSenseStorageSize + sizeof (SCSI_PASS_THROUGH)). The size of the SCSI_PASS_THROUGH structure varies, depending on its DataTransferLength specification. 你怎么把IOCTL_SCSI_PASS_THROUGH和SCSI_PASS_THROUGH_DIRECT混在一起了?我没研究过RequestSenseStorageSize 是什么,但可能不是0吧? |
|
30楼#
发布于:2002-12-03 15:46
那可能是我帖贴子的时候弄错了,填写命令这部分不会有错因为我以前在Win32 app里边写过读盘的程序了,是抄过来的。只不过Win32使用CreateFile然后再DeviceIoControl而已。所以现在我总是怀疑我的Device创建的不对或者哪个地方调用的不对。
|
|
31楼#
发布于:2002-12-03 16:08
如果用的是IOCTL_SCSI_PASS_THROUGH_DIRECT
传入的memory必须是system memory |
|
32楼#
发布于:2002-12-03 16:15
关于你的device object:
在fs mount的时候,它作为一个参数被传进来: IrpSp->Parameters.MountVolume.DeviceObject;那时你应该把它保留在某个地方,比如vcb这个数据结构里面. 关于create device object,请参看ddk\\src\\storage\\class\\cdrom\\cdrom.c,里面有个CreateCdRomDeviceObject,而且scsi的检查也可以参考. 其实,仅仅读的话,在cdrom的class driver上用IoBuild FsdRequest就够了,比这简单多了,不用考虑这么多细节. 另外,cd和dvd的读取命令和过程是一样的,二者并没有什么不同. |
|
33楼#
发布于:2002-12-03 16:17
那按你的意思该如何写IoBuildDeviceIoControlRequest呢?今天弄得我头都烫了明天再说吧。 唉破玩艺儿:)
|
|
34楼#
发布于:2002-12-03 16:23
IoBuildDeviceIoControlRequest在cdrom class driver的源码里用的很普遍,你可以参考一下cdrom.c里面的方法. 祝你好运.
|
|
35楼#
发布于:2002-12-03 16:49
先问一下:你们这种DVD在写入的时候,是按照一个block一个block这样加密的吗?
如果是这样,就不用到File System里面做,直接在Storage Stack里面加一个Filter Driver,放在CDROM下面。这样,每次read的时候,你只要把对应的block解密即可。 |
|
|
36楼#
发布于:2002-12-03 19:22
引用:
----------------------------------------------------------- 那可能是我帖贴子的时候弄错了,填写命令这部分不会有错因为我以前在Win32 app里边写过读盘的程序了,是抄过来的。只不过Win32使用CreateFile然后再DeviceIoControl而已。所以现在我总是怀疑我的Device创建的不对或者哪个地方调用的不对。 ----------------------------------------------------------- 如果是这样的话,你先把ntStatus = IoCallDriver(rawDeviceObject, irp);这句话注释掉,看会不会出问题,如果没有的话,你在IoGetDeviceObjectPointer()函数成功返回后,调用一下IoAttachDeviceToDeviceStack()函数,恢复IoCallDriver()。 如果不行的话,就是你抄过来的程序有问题啦。 祝你好运!! |
|
|
37楼#
发布于:2002-12-04 08:28
先问一下:你们这种DVD在写入的时候,是按照一个block一个block这样加密的吗? 我的DVD盘不是按照标准的ISO9660格式刻录的所以要对扇区进行判断然后再找到想要的数据,所以要这样做啊。 |
|
38楼#
发布于:2002-12-04 08:34
多谢各位大哥!我再自己试一试。
特别感谢: yymrhxf的一针见血指点 Coolice的热情帮助 以及liuyan1 、rayyang2000和deltali的参与 我是刚刚接触Driver就搞了这么一个玩艺儿,感觉有些力不从心,看来我还要多向大家学习呀! |
|
39楼#
发布于:2002-12-04 18:04
我这个比较特殊,说什么只要有以前的DDK他就会出错(在Readme里特意写出来了不要装以前的DDK,而且它是ME&2K&XP版和在一起的)所以就来个一了百了卸了算了。DDK卸了之后DS也就好多都Build不过了因为IFSKIT少了好多头文件。 我今天刚拿到这个版本的IFSKIT,和已经安装的DDK不冲突啊,只有网上那个才会提示冲突。 |
|