tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
阅读:14830回复:49

终于搞定隐藏文件、目录了,好高兴啊!!!!!哈哈

楼主#
更多 发布于:2004-01-09 16:48
可以过滤掉目录下的所有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;
}

最新喜欢:

SamSunSamSun sijinsijin linshierlinshi... zhuwgzhuwg
wy79807545
驱动牛犊
驱动牛犊
  • 注册日期2010-04-29
  • 最后登录2013-10-01
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-01-05 09:45
后来仔细看了一下,已经没有bug了:) 此代码没问题:)
chenguanghuaxue
驱动牛犊
驱动牛犊
  • 注册日期2009-02-20
  • 最后登录2011-01-21
  • 粉丝2
  • 关注5
  • 积分15分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-12-20 21:31
谢谢tooflat提供的方法
wyhero
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2016-02-02
  • 粉丝0
  • 关注0
  • 积分67分
  • 威望563点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-12-10 00:06
引用第24楼llj2655506于2007-04-07 21:47发表的  :
有点理解的不清楚,当newlength=0的时候是什么意思?为什么又要掉用一个完成例程序,这是什么情况,请LZ指点


有谁能解释一下吗,不太明白?
swc4848a
驱动牛犊
驱动牛犊
  • 注册日期2008-06-11
  • 最后登录2009-04-14
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-11-06 10:12
楼主,能不能发一份代码给我研究研究啊?谢谢了
swc4848a@gmail.com
beiujm
驱动小牛
驱动小牛
  • 注册日期2005-11-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分983分
  • 威望129点
  • 贡献值0点
  • 好评度98点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-12-06 08:46
也是一种进步。
http://beiyu.bokee.com
fancylf
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2016-06-21
  • 粉丝1
  • 关注0
  • 积分61分
  • 威望501点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-08-31 22:04
最近刚好在学习这方面的东西,可以把你的代码发给我参考一下么,谢谢LZ!
EMAIL: fancylf@163.com
starsrain
驱动牛犊
驱动牛犊
  • 注册日期2005-02-20
  • 最后登录2008-08-08
  • 粉丝0
  • 关注0
  • 积分260分
  • 威望26点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-08-08 15:55
不错,学习中
sebstar
驱动牛犊
驱动牛犊
  • 注册日期2007-07-22
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分240分
  • 威望25点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-08-01 11:56
楼主把源文件传上来把
没什么不可以
fantaidu
驱动牛犊
驱动牛犊
  • 注册日期2007-04-02
  • 最后登录2008-11-21
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望27点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-08-01 10:28
我也想要一份代码 能不能给我发一份呢 谢谢!!
wanghonglun1983@163.com
sebstar
驱动牛犊
驱动牛犊
  • 注册日期2007-07-22
  • 最后登录2009-05-21
  • 粉丝0
  • 关注0
  • 积分240分
  • 威望25点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-07-29 16:59
正在学习驱动呢!楼主可以给我发份源代码么?
282865468@qq.com
多谢啦!
没什么不可以
carwin
驱动牛犊
驱动牛犊
  • 注册日期2007-05-27
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分304分
  • 威望71点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-07-26 16:42
楼主,我最近刚好也在做这个程序。
我要隐藏的是指定路径下的文件,
在隐藏文件的时候,我用的是HOOK  ZwQueryDirectoryFile 这个函数,但是我遇到一个问题,就是在显示文件路径的时候,打印出来的是这样的路径:\Device\HarddiskVolume1\Documents and Settings\All Users\,也就是说不带盘符的,我上网查了一下,都没有真正看到怎样转化的代码,可以给点建议么,谢谢!我的邮箱:yunfandayi◎163.com,
wanfustudio
驱动牛犊
驱动牛犊
  • 注册日期2006-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分720分
  • 威望73点
  • 贡献值0点
  • 好评度72点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-07-20 15:44
wcsnicmp 比较可能在某些及其会出现蓝屏 现象
wanfustudio
驱动牛犊
驱动牛犊
  • 注册日期2006-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分720分
  • 威望73点
  • 贡献值0点
  • 好评度72点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-07-12 13:25
[Quote]  (_wcsnicmp(HIDDEN_DIRECTORY, dirInfo->FileName, dirInfo->FileNameLength / sizeof(WCHAR)) == 0)) {[/Quote]

这样比较在某些机器上会出现蓝屏,按一个字符串的长度去比较,也很可能比较就没进行完成
=======
1.check IsDirectory
2.check string length is equal
wisebo
驱动小牛
驱动小牛
  • 注册日期2006-04-13
  • 最后登录2012-07-18
  • 粉丝0
  • 关注1
  • 积分825分
  • 威望218点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-07-11 16:22
可以给我一份吗wiseboy601710@163.com
I love niu
sssslin
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分260分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-06-28 15:20
麻烦也给我发一份代码学习吧
slq724@163.com
straggler
驱动牛犊
驱动牛犊
  • 注册日期2006-11-28
  • 最后登录2010-08-23
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-06-27 15:46
楼主,能不能发一份代码给我研究研究啊?谢谢了!
zhxi987654@163.com
pandaforum
驱动小牛
驱动小牛
  • 注册日期2007-02-13
  • 最后登录2011-09-06
  • 粉丝0
  • 关注0
  • 积分728分
  • 威望282点
  • 贡献值1点
  • 好评度66点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-06-20 14:27
楼主,发我一份让我学习研究一下可以不?多谢了!
pandaemail@163.com
Braveheart3
驱动牛犊
驱动牛犊
  • 注册日期2005-12-11
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分260分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-06-20 14:16
楼主,厉害,能发份代码给我吗?huanglovesun3@yahoo.com.cn
wshchb
驱动小牛
驱动小牛
  • 注册日期2006-05-14
  • 最后登录2015-03-05
  • 粉丝1
  • 关注0
  • 积分1005分
  • 威望385点
  • 贡献值1点
  • 好评度97点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-06-01 16:36
ding......
学习中。。。。

牛人, 能否把代码发份给我?不甚感激! varrui@163.com
上一页
游客

返回顶部