阅读:1436回复:8
遇到一个比较奇怪的问题,希望大家帮帮忙。
我在一台虚拟机上测试我的过滤驱动,现在遇到的问题是,我访问它的共享文件夹的时经常会卡住几十秒,后来经测试发现,是卡在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; //我在这里设中断 } |
|
沙发#
发布于:2007-03-20 12:27
我已经卡在这里好几天了,希望有人能帮帮我。
特别是做过文件过滤驱动的,应该会碰到这个问题吧。 |
|
驱动小牛
|
板凳#
发布于:2007-03-20 12:46
ZwCreateFile会发IRP_MJ_CREATE,可能是重入问题.
try to use IoCreateFileSpecifyDeviceObjectHint ----------------------------------------------------------- 承接各类过滤驱动 YanDong_8212@163.com |
|
地板#
发布于:2007-03-20 13:05
我用Shadows设备打开的,不会重入
|
|
驱动小牛
|
地下室#
发布于:2007-03-20 16:46
不会是内存泄露吧,用POOLTAG查一下.
|
|
5楼#
发布于:2007-03-20 17:26
内存泄露会出现这种情况吗?
因为这个现象很特殊,只有我访问虚拟机共享文件时才会出现,而且几十秒以后还是会返回的。 |
|
驱动小牛
|
6楼#
发布于:2007-03-20 17:30
我以前遇到过类似的情况,还有一种情况可能是OpLock引起的.
|
|
7楼#
发布于:2007-03-20 17:35
网络文件共享,铁定要注意 oplock
多看看 nt文件系统内幕中文版或英文版本中有关oplock的内容 |
|
|
8楼#
发布于:2007-03-20 20:06
非常谢谢两位,我现在用FILE_COMPLETE_IF_OPLOCKED方式打开文件,问题就解决了。我现在想问一下,这样会不会有什么负作用。
|
|