brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5324回复:7

CreateFile 失败的问题

楼主#
更多 发布于:2004-10-09 09:01
我用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-04-23
  • 最后登录2010-06-17
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-09 09:57
你看看驱动程序吧
看看对应的irp_mj_create
打一枪换个地方再放枪,你怎么不灌水啦?
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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也一切正常。
打一枪……换个地方……再打一枪……
ildee
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-09 13:06
是不是用独占模式创建的设备,然后createfile后,没有closehandle??
还有这个标志我看有问题FILE_FLAG_NO_BUFFERING,你换成FILE_ATTRIBUTE_NORMAL时时!
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-09 13:34
用FILE_SHARE_READ | FILE_SHARE_WRITE标志打开不是独占的设备啊.
FILE_FLAG_NO_BUFFERING是为了不用处理Cache问题,应该没有关系的,在2000下就没有问题.
打一枪……换个地方……再打一枪……
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2004-10-09 13:49
应该没问题的,我在2K/XP/2003下都测试过,而且修改为加密的以后也没问题的。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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失败的

谁能看出头绪?
打一枪……换个地方……再打一枪……
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-10-11 09:47
没有人碰到过这个问题吗?
打一枪……换个地方……再打一枪……
游客

返回顶部