test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
阅读:1224回复:6

有谁遇到过这种现象???(devia大侠我已经将代码贴出来了)

楼主#
更多 发布于:2007-05-21 18:56
我在set_information的处理函数中已经发现了文件的删除操作,并且将文件删除的IRP返回状态STATUS_ACCESS_DENIED,当加载驱动后,对文件进行删除时,系统会弹出提示框“要删除的文件路径不对或文件不存在”,此时会发现系统已经将该文件删除了,这是怎么回事?
真是奇怪!!!
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
沙发#
发布于:2007-05-22 08:14
代码贴上来,这和细节有关,:-)
人总在矛盾中徘徊。。。
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-22 09:25
引用第1楼devia于2007-05-22 08:14发表的  :
代码贴上来,这和细节有关,:-)


NTSTATUS
SfSetInformation (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
  NTSTATUS status;
  PIO_STACK_LOCATION irpSp;
  PUNICODE_STRING name;
  GET_NAME_CONTROL nameControl;
  int cmpresult;
  wchar_t* testDirPath = L"\\Device\\HarddiskVolume1\\test";

  irpSp = IoGetCurrentIrpStackLocation(Irp);
  if(irpSp->Parameters.SetFile.FileInformationClass == FileDispositionInformation)
    {
        DbgPrint("----------------------禁止删除文件--------------------\n");
        name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl );
        cmpresult = wcsncmp( name->Buffer, testDirPath, wcslen( testDirPath ) );
        if( cmpresult == 0 )
        {
              DbgPrint("===========比较结果一致==========\n");
              Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
              Irp->IoStatus.Information = 0;
              IoCompleteRequest(Irp, IO_NO_INCREMENT);
              return STATUS_ACCESS_DENIED;
        }
  }
  IoSkipCurrentIrpStackLocation( Irp );
  return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
}
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
地板#
发布于:2007-05-22 09:43
1. 在IRP_MJ_CREATE中检查文件打开时是否有:
    DELETE、FILE_DELETE_ON_CLOSE标志, 如果有应该禁止打开操作;
2. wcsncmp是区分大小写比较,请改正;
人总在矛盾中徘徊。。。
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-22 10:01
好的!多谢devia大侠,我现在将wcsncmp换成wcsstr了,这样就不存在大小写的问题了。
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
5楼#
发布于:2007-05-22 12:20
wcsstr是区分大小写的!
人总在矛盾中徘徊。。。
yaolixing
驱动小牛
驱动小牛
  • 注册日期2006-06-27
  • 最后登录2010-07-15
  • 粉丝1
  • 关注0
  • 积分991分
  • 威望135点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-05-22 23:35
NTSTATUS
HookZwSetInformationFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID FileInformation,
IN ULONG FileInformationLength,
IN FILE_INFORMATION_CLASS FileInformationClass
)
{
    NTSTATUS rc = STATUS_UNSUCCESSFUL;
    
    PAGED_CODE();
    
    if ( FileHandle != NULL && FileInformationClass == FileDispositionInformation )
    {

        NTSTATUS nts = STATUS_UNSUCCESSFUL;
        IO_STATUS_BLOCK iosb ={ 0,0 };
        PWCHAR pstring = NULL;
        ANSI_STRING    ansiUndeleteFileName ;
        UNICODE_STRING  usFileName ={ 0,0,0 };
        PFILE_NAME_INFORMATION pFileInfo = NULL;

        
        RtlInitEmptyUnicodeString( &usFileName,'\0',0 );
        RtlInitAnsiString( &ansiUndeleteFileName, ANSI_STRING_HIDE_FILE_NAME );
        pFileInfo = (PFILE_NAME_INFORMATION) ExAllocatePool(
                                                             PagedPool,
                                                             sizeof(FILE_NAME_INFORMATION) + MAXPATHLENGTH_W
                                                           );

        if ( NULL == pFileInfo )
        {
           return STATUS_INSUFFICIENT_RESOURCES;
        
        }//if ( NULL == pfni )
          
        RtlZeroMemory( pFileInfo ,sizeof(FILE_NAME_INFORMATION) + MAXPATHLENGTH_W );
            

        nts = ZwQueryInformationFile(   FileHandle,
                                        &iosb,
                                        pFileInfo,
                                        sizeof(FILE_NAME_INFORMATION) + MAXPATHLENGTH_W,
                                        FileNameInformation
                                     );

        
        if ( !NT_SUCCESS(nts) )
        {
            ExFreePool(pFileInfo);
            pFileInfo = NULL;
            return nts;  
        }
        else
        {
            ANSI_STRING ansiDesFileName={0,0,0}, ansiSrcFileName={0,0,0};
            PWSTR pwstr=NULL;
            ULONG len =0;
            
            pwstr= wcsrchr( pFileInfo->FileName, L'\\' );
            RtlInitUnicodeString(&usFileName, pwstr+1); // uniFileName 不用释放

            
            RtlUnicodeStringToAnsiString(&ansiDesFileName, &usFileName, TRUE); // TRUE, 必须释放
            RtlUnicodeStringToAnsiString(&ansiSrcFileName, &usFileName, TRUE);
            RtlUpperString(&ansiDesFileName, &ansiSrcFileName);
            
            // 打印结果, 用 debugview 可以查看打印结果
            KdPrint(("ansiFileName :%s\n", ansiDesFileName.Buffer));
            KdPrint(("HideFileName :%s\n", ansiUndeleteFileName.Buffer));
            len = ansiUndeleteFileName.Length;
            if( len > ansiDesFileName.Length )
            {
                KdPrint((" Danger!!\n" ));
                len =  ansiDesFileName.Length;  
            }
            //此处的ansiDesFileName长度可能大于ansiUndeleteFileName,从而造成BSOD
            if( RtlCompareMemory(ansiDesFileName.Buffer, ansiUndeleteFileName.Buffer, len ) == ansiUndeleteFileName.Length)
            {
            
                RtlFreeAnsiString(&ansiSrcFileName);  
                RtlFreeAnsiString(&ansiDesFileName);
                ExFreePool(pFileInfo);
                pFileInfo = NULL;
                return STATUS_UNSUCCESSFUL;
            }
            
            RtlFreeAnsiString(&ansiSrcFileName);
            RtlFreeAnsiString(&ansiDesFileName);
        }

        
        ExFreePool(pFileInfo);
        pFileInfo = NULL;

    }//if ( FileHandle != NULL && FileInforma

    rc = ((REALZWSETINFORMATIONFILE)(RealZwSetInformationFile))(
                                                                 FileHandle,
                                                                 IoStatusBlock,
                                                                 FileInformation,
                                                                 FileInformationLength,
                                                                 FileInformationClass
                                                               );

    return rc;
}
游客

返回顶部