阅读:15096回复:49
终于搞定隐藏文件、目录了,好高兴啊!!!!!哈哈
可以过滤掉目录下的所有entry,不需要重新构造irp
NTSTATUS DispatchDirectoryControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PDEVICE_EXTENSION devExt = DeviceObject->DeviceExtension; PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp); KEVENT waitEvent; NTSTATUS status; PWSTR fileNameBuffer; ULONG bufferLength; ULONG newLength; ULONG offset; ULONG currentPosition; PFILE_BOTH_DIR_INFORMATION dirInfo = NULL; PFILE_BOTH_DIR_INFORMATION preDirInfo = NULL; PAGED_CODE(); if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INVALID_DEVICE_REQUEST; } if (Irp->RequestorMode == KernelMode) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(((PDEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp); } if (FileBothDirectoryInformation != irpSp->Parameters.QueryDirectory.FileInformationClass) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(((PDEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp); } KeInitializeEvent(&waitEvent, NotificationEvent, FALSE); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, DirectoryControlCompletion, &waitEvent, //context parameter TRUE, TRUE, TRUE ); status = IoCallDriver(devExt->AttachedToDeviceObject, Irp); // // Wait for the operation to complete // if (STATUS_PENDING == status) { status = KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, NULL ); ASSERT(STATUS_SUCCESS == status); } if (!NT_SUCCESS(status) ||(0 == irpSp->Parameters.QueryFile.Length)) { IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } fileNameBuffer =(PWSTR) ExAllocatePoolWithTag(NonPagedPool, MAX_PATH * sizeof(WCHAR), POOL_TAG); if (!fileNameBuffer) { IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } RtlZeroMemory(fileNameBuffer, MAX_PATH * sizeof(WCHAR)); if (!NT_SUCCESS(GetFileName(DeviceObject, irpSp->FileObject, fileNameBuffer))) { ExFreePoolWithTag(fileNameBuffer, POOL_TAG); IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } if (0 != _wcsicmp(fileNameBuffer, L"\\")) { ExFreePoolWithTag(fileNameBuffer, POOL_TAG); IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } while (TRUE) { bufferLength = irpSp->Parameters.QueryDirectory.Length; newLength = bufferLength; currentPosition = 0; dirInfo =(PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer; preDirInfo = dirInfo; if ((!dirInfo) ||(dirInfo->NextEntryOffset > bufferLength)) { IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } do { offset = dirInfo->NextEntryOffset; if ((dirInfo->FileNameLength > 0) && (_wcsnicmp(HIDDEN_DIRECTORY, dirInfo->FileName, dirInfo->FileNameLength / sizeof(WCHAR)) == 0)) { if (0 == offset) { // the last one preDirInfo->NextEntryOffset = 0; newLength = currentPosition; } else { if (preDirInfo != dirInfo) { preDirInfo->NextEntryOffset += dirInfo->NextEntryOffset; dirInfo = (PFILE_BOTH_DIR_INFORMATION) ((PUCHAR) dirInfo + offset); } else { RtlMoveMemory((PUCHAR) dirInfo,(PUCHAR) dirInfo + offset, bufferLength - currentPosition - offset); newLength -= offset; } } // break; } else { currentPosition += offset; preDirInfo = dirInfo; dirInfo =(PFILE_BOTH_DIR_INFORMATION)((PUCHAR) dirInfo + offset); } } while(0 != offset); if (0 == newLength) { KeResetEvent(&waitEvent); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, DirectoryControlCompletion, &waitEvent, //context parameter TRUE, TRUE, TRUE ); status = IoCallDriver(devExt->AttachedToDeviceObject, Irp); // // Wait for the operation to complete // if (STATUS_PENDING == status) { status = KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, NULL ); ASSERT(STATUS_SUCCESS == status); } if (!NT_SUCCESS(status) ||(0 == Irp->IoStatus.Information)) { break; } } else { Irp->IoStatus.Information = newLength; break; } } ExFreePoolWithTag(fileNameBuffer, POOL_TAG); Irp->IoStatus.Information = newLength; IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } NTSTATUS DirectoryControlCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { UNREFERENCED_PARAMETER(DeviceObject); UNREFERENCED_PARAMETER(Irp); KeSetEvent((PKEVENT) Context, IO_NO_INCREMENT, FALSE); return STATUS_MORE_PROCESSING_REQUIRED; } |
|
沙发#
发布于:2004-01-09 17:29
能说具体一点吗
|
|
板凳#
发布于:2004-01-09 21:23
和以前HOOK 那个QUERYSYSTEMFILE的方法差不多吧,如果是要隐藏的,就把后面的东西,覆盖掉前面的,可能他用IFS做,更好点。。。。。
|
|
|
地板#
发布于:2004-01-09 22:36
不错,前面测试下确实可以。。。。。
|
|
|
地下室#
发布于:2004-01-13 14:45
过滤掉目录中所有的entry也可以
|
|
5楼#
发布于:2005-04-04 15:09
有bug,在ntfs分区上,有时只是查询单一的文件目录,这个方法隐藏不了.. 大家需要讨论一下。
|
|
|
6楼#
发布于:2005-04-04 15:46
if (0 == offset) // the last one 这个隐藏不了最后的文件夹或ntfs上的某些文件夹 特别是ntfs,骗不过去:( |
|
|
7楼#
发布于:2005-07-10 16:15
能否把代码发给我一份 ,谢谢!wang_song_shan@sohu.com
|
|
8楼#
发布于:2005-07-10 23:27
这个代码bug不小,如果查询的是当前第一个目录的话,那么后面的目录隐藏就会有问题。
隐藏超过两个文件有问题。。 检查了一下 关键是里面的querybuffer有问题,隐藏后应该重新决断是否改变。。 |
|
|
9楼#
发布于:2005-07-11 16:07
我一直都用这种方法,没有发现任何问题
|
|
10楼#
发布于:2005-07-12 16:19
后来仔细看了一下,已经没有bug了:) 此代码没问题:)
|
|
|
11楼#
发布于:2005-07-14 19:40
可以的话也给我发一份代码学习学习,谢谢afengsoft@163.com
|
|
12楼#
发布于:2005-07-15 12:27
恭喜亚,恭喜亚
|
|
|
13楼#
发布于:2005-07-16 00:38
下面是引用tooflat于2005-07-11 16:07发表的: 过滤一个文件就break问题不大,但是如果利用这个隐藏一次查询中得若干文件得话,就有麻烦. pos += offset; PreQueryBuffer = QueryBuffer; QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) ((PUCHAR) QueryBuffer + offset); 这段代码要修改一下. pos += offset; if(!bMiddleFilter) PreQueryBuffer = QueryBuffer; else bMiddleFilter = FALSE; if(!bFirstFilter) QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) ((PUCHAR) QueryBuffer + offset); else bFirstFilter = FALSE; 如果已经隐藏的是中间文件的话,PreQueryBuffer不变 如果已经隐藏的是第一个文件的话,QueryBuffer不变. 如果不这么做的话,在隐藏多文件时,可能会出现奇怪的问题,比如只能隐藏第一个文件,或者意外隐藏了别的文件. |
|
|
14楼#
发布于:2005-07-17 01:53
搂主和各位老大好,我是驱动开发文盲,一直没有涉足系统底层的开发,最近有一个项目要求很高,必须隐藏文件于无声无息之中,搂主给的两个函数对于我来说太高深了,能给一段调用这两个函数的具体代码吗?不胜感激!再次感谢搂主和各位老大的无私奉献!
|
|
15楼#
发布于:2005-07-18 09:48
下面是引用cardmagic于2005-07-16 00:38发表的: 兄台所言极是 |
|
16楼#
发布于:2005-07-19 11:00
斑竹怎么可以对我的话不闻不问呢?太伤心了
|
|
17楼#
发布于:2005-08-02 16:24
tooflat 大,有几个问题想请教你..
1. 这段码可直接加入到sfilter的sample code,指定HIDDEN_DIRECTORY,就可以work了吗? 2. 如果是,那GetFileName在码里的作用跟SfGetFileName一样吗? 因为两者参数不太一样.. 小弟想学习IFS的部分....希望大大不吝赐教 |
|
18楼#
发布于:2005-08-02 18:08
这种很烂的隐藏技术有人用吗?用很多windows的软件都能找到隐藏的文件的,比如Winhex
|
|
19楼#
发布于:2005-08-02 20:48
下面是引用yuanyuan于2005-08-02 18:08发表的: 那你告诉我们一个好的技术 |
|
上一页
下一页