vancaho
驱动牛犊
驱动牛犊
  • 注册日期2004-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分574分
  • 威望100点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分0分
阅读:2153回复:7

给sfilter添加IRP_MJ_DIRECTORY_CONTROL的处理隐藏文件.怎么老是重启呢?

楼主#
更多 发布于:2005-05-24 10:10
我给sfilter添加了IRP_MJ_DIRECTORY_CONTROL的处理
现在还没有添加具体的文件要隐藏代码,不知道为什么点开\"我的电脑\"电脑就会挂机
而直接点开其他文件夹没问题。请高手看一下 :
//这是我添加的一个Disptch Function
DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL]=SfDRControl;

//文件控制IRP请求
NTSTATUS SfDRControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS status;
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp );

//    PAGED_CODE();
//    VALIDATE_IRQL(Irp);

    //
    //  If this is for our control device object, fail the operation
    //

    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;
    }

    ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

//判断请求的Minor Function函数
if(irpSp->MinorFunction==IRP_MN_QUERY_DIRECTORY)
{
KEVENT waitEvent;

KeInitializeEvent( &waitEvent, NotificationEvent, FALSE);

IoCopyCurrentIrpStackLocationToNext( Irp );

        IoSetCompletionRoutine(Irp,SfDRControlCompletion,&waitEvent,TRUE,TRUE,TRUE );

        //
        //  Call the next driver in the stack.
        //

        status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );

        //
        //  Wait for the completion routine to be called
        //

   if (STATUS_PENDING == status)
{

            NTSTATUS localStatus = KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, NULL);
   ASSERT(STATUS_SUCCESS == localStatus);
   }

//此处处理相应的文件控制请求信息
DbgPrint(\"Query Directory IRP Hooked!\\n\");
status = Irp->IoStatus.Status;
/*
if( NT_SUCCESS( Irp->IoStatus.Status ) )
{
if(irpSp->Parameters.QueryDirectory.FileInformationClass==FileBothDirectoryInformation)
{
//这里进行隐藏文件处理 }
}
*/
        IoCompleteRequest( Irp, IO_NO_INCREMENT );

        return status;

}
else
{
IoSkipCurrentIrpStackLocation( Irp );

        return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
}

}

NTSTATUS SfDRControlCompletion (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PVOID Context)
{
PKEVENT event = Context;

    UNREFERENCED_PARAMETER( DeviceObject );
    UNREFERENCED_PARAMETER( Irp );

    ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

    KeSetEvent(event, IO_NO_INCREMENT, FALSE);

    return STATUS_MORE_PROCESSING_REQUIRED;
}
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-24 09:51
装个调试工具,再把系统属性里面的自动重新启动前面的勾去掉,看看是什么错误
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-23 11:39
下面是引用vancaho于2005-05-24 10:10发表的给sfilter添加IRP_MJ_DIRECTORY_CONTROL的处理隐藏文件.怎么老是重启呢?:
我给sfilter添加了IRP_MJ_DIRECTORY_CONTROL的处理
现在还没有添加具体的文件要隐藏代码,不知道为什么点开"我的电脑"电脑就会挂机
而直接点开其他文件夹没问题。请高手看一下 :
//这是我添加的一个Disptch Function
DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL]=SfDRControl;
.......


我试了一下,在XP SP2上没死机。(未长期测试)
你的OS是什么?

FILEMON也是这样的处理,说实话,很不稳定,经常兰屏。
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
地板#
发布于:2005-05-31 13:16
Yes, you are right. I missed his completion routine.
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-05-31 12:01
It seems you complete IRP request twice when you processing IRP_MN_QUERY_DIRECTORY. Don\'t call IoCompleteRequest() after IoCallDriver().

Article \"Passing IRPs down the Driver Stack\" in WinDDK document is very helpful.


这个地方就得再complete一次,因为他在完成例程停止了irp的完成。

如果不考虑/**/注释掉的语句,看不出什么问题。
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
5楼#
发布于:2005-05-27 22:56
It seems you complete IRP request twice when you processing IRP_MN_QUERY_DIRECTORY. Don\'t call IoCompleteRequest() after IoCallDriver().

Article \"Passing IRPs down the Driver Stack\" in WinDDK document is very helpful.
liyf_shanghai
驱动牛犊
驱动牛犊
  • 注册日期2005-05-27
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-27 16:29
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp );的后边,要跟IoCopyCurrentIrpStackLocationToNext(Irp);呀。还有,IoCallDriver(((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp);也很重要。我也是新手,呵呵。
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-27 15:53
你加了哪些代码?
到哪里出问题了?
游客

返回顶部