lancelet
驱动牛犊
驱动牛犊
  • 注册日期2006-01-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分420分
  • 威望43点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
阅读:1436回复:8

遇到一个比较奇怪的问题,希望大家帮帮忙。

楼主#
更多 发布于:2007-03-20 08:13
  我在一台虚拟机上测试我的过滤驱动,现在遇到的问题是,我访问它的共享文件夹的时经常会卡住几十秒,后来经测试发现,是卡在ZwCreateFile,因为我会在IRP_MJ_CREATE传给下一层驱动之前,用ZwCreateFile先打开这个文件,就卡在这里了。奇怪的是,共享在访问一个文件时会打开四次,也就是说我收到四次的IRP_MJ_CREATE,一般前三次可以顺利调用ZwCreateFile,就卡在最后一次。用!locks命令没发现锁。好象这个情况只有在别的机子访问虚拟机共享内存的时候出现,其他情况正常。比如说我在访问虚拟机的共享D盘时,虚拟机(2000/XP)通过系统进程一般在第四次打开d:\Recycled\desktop.ini卡住,但不是针对只这个文件,其他目录的其他文件也一样。下面是我在IRP_MJ_CREATE里打开文件的代码

        LARGE_INTEGER liBeginTime;
        LARGE_INTEGER liCreateTime;
        LARGE_INTEGER liReadTime;
        LARGE_INTEGER liCloseTime;

        int nShadowsFileOpenType = 0;

        KeQuerySystemTime(&liBeginTime);

        //打开这个猜的路径文件
        GetShadowsDeviceName(pExtend->cDeviceName, &strShadowsDeviceName);
        AppendPath(&strShadowsDeviceName, &strGuessPath);

        if (bRootPath)
        {
            nShadowsFileOpenType = FILE_DIRECTORY_FILE;
        }
        else
        {
            DelPathEndLine(&strShadowsDeviceName);
        }

        InitializeObjectAttributes(&objectAttributes, &strShadowsDeviceName, OBJ_KERNEL_HANDLE, NULL, NULL);
        ntstatus = ZwCreateFile(&hFile, FILE_READ_DATA|SYNCHRONIZE, &objectAttributes, &ioStatus, 0, 0,
                                    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, FILE_OPEN, nShadowsFileOpenType,
                                    NULL, 0);
        
        KeQuerySystemTime(&liCreateTime);

        KeQuerySystemTime(&liCloseTime);

        if ((liCloseTime.QuadPart - liBeginTime.QuadPart) > 10000000)
        {
            int i = 0;   //我在这里设中断
        }
lancelet
驱动牛犊
驱动牛犊
  • 注册日期2006-01-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分420分
  • 威望43点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-20 12:27
我已经卡在这里好几天了,希望有人能帮帮我。
特别是做过文件过滤驱动的,应该会碰到这个问题吧。
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
板凳#
发布于:2007-03-20 12:46
ZwCreateFile会发IRP_MJ_CREATE,可能是重入问题.
try to use IoCreateFileSpecifyDeviceObjectHint

-----------------------------------------------------------
承接各类过滤驱动
YanDong_8212@163.com
商务MSN:YanDong_8212@163.com
lancelet
驱动牛犊
驱动牛犊
  • 注册日期2006-01-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分420分
  • 威望43点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-20 13:05
我用Shadows设备打开的,不会重入
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
地下室#
发布于:2007-03-20 16:46
不会是内存泄露吧,用POOLTAG查一下.
商务MSN:YanDong_8212@163.com
lancelet
驱动牛犊
驱动牛犊
  • 注册日期2006-01-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分420分
  • 威望43点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-03-20 17:26
内存泄露会出现这种情况吗?
因为这个现象很特殊,只有我访问虚拟机共享文件时才会出现,而且几十秒以后还是会返回的。
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
6楼#
发布于:2007-03-20 17:30
我以前遇到过类似的情况,还有一种情况可能是OpLock引起的.
商务MSN:YanDong_8212@163.com
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
7楼#
发布于:2007-03-20 17:35
网络文件共享,铁定要注意 oplock


多看看 nt文件系统内幕中文版或英文版本中有关oplock的内容
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
lancelet
驱动牛犊
驱动牛犊
  • 注册日期2006-01-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分420分
  • 威望43点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-03-20 20:06
非常谢谢两位,我现在用FILE_COMPLETE_IF_OPLOCKED方式打开文件,问题就解决了。我现在想问一下,这样会不会有什么负作用。
游客

返回顶部