阅读:5324回复:7
CreateFile 失败的问题
我用FileDisk作为模板写了一个加密虚拟硬盘。碰到奇怪的问题,Windows2000下一切正常,XP下当虚拟盘格式化成NTFS格式时正常,格式化成FAT,FAT32时出现问题。
mount 成功后进行一系列自己定义的DeviceIoctl操作,每次都是用CreateFile得到虚拟盘的句柄,而后调用DeviceIoctl函数,成功后关闭句柄。可是从某一次操作开始(出现在同一次操作),CreateFile失败,GetLastError返回错误代码1(ERROR_INVALID_FUNCTION)。 所有的CreateFile调用格式均为 HANDLE Device = CreateFile( VolumeName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL ); 谁能告诉我为什么会失败或者给点线索? |
|
|
沙发#
发布于:2004-10-09 09:57
你看看驱动程序吧
看看对应的irp_mj_create 打一枪换个地方再放枪,你怎么不灌水啦? |
|
板凳#
发布于:2004-10-09 10:45
处理IRP_MJ_CREATE的代码非常简单。
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = FILE_OPENED; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; 就这么多,应该没什么关系吧。 关键是为什么和虚拟盘被格式化成的格式有关呢?2000下就一切正常,XP下格式化成NTFS也一切正常。 |
|
|
地板#
发布于:2004-10-09 13:06
是不是用独占模式创建的设备,然后createfile后,没有closehandle??
还有这个标志我看有问题FILE_FLAG_NO_BUFFERING,你换成FILE_ATTRIBUTE_NORMAL时时! |
|
地下室#
发布于:2004-10-09 13:34
用FILE_SHARE_READ | FILE_SHARE_WRITE标志打开不是独占的设备啊.
FILE_FLAG_NO_BUFFERING是为了不用处理Cache问题,应该没有关系的,在2000下就没有问题. |
|
|
5楼#
发布于:2004-10-09 13:49
应该没问题的,我在2K/XP/2003下都测试过,而且修改为加密的以后也没问题的。
|
|
|
6楼#
发布于:2004-10-09 14:37
2000下一切OK,XP下NTFS格式也没问题.
当虚拟盘还是裸盘时(mount后没有格式化前)CreateFile都能成功,格式化成NTFS后也没问题,就是其他格式就有问题. 对于FAT32和NTFS,CreateFile的执行过程有什么不同吗? 我解释一下我的流程: 设备维护自己的状态:created/mounted/verified/,只有通过了密码验证才对Read/Write/DeviceIoctl做处理,否则返回错误(分区不能访问) 1.mount,就是把文件mount成一个分区 2.verify, 验证密码 3.access 4.unmount 另外设计了一个nullify函数,用于让密码失效. 出错的地方: mount--success verify--success 格式化--success nullify--success verify--failed--------------------就是这里CreateFile失败的 谁能看出头绪? |
|
|
7楼#
发布于:2004-10-11 09:47
没有人碰到过这个问题吗?
|
|
|