sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
阅读:1369回复:1

toaster filter ZwWriteFile蓝屏。。

楼主#
更多 发布于:2007-08-18 19:40
我用toaster filter 改写了一下...把他挂在卷上..一切都成功了.....
然后我可以在驱动中看到上层逻辑盘的读写信息..
我在FilterPass中对读写进行处理。。。代码如下:

if(currentIrpStack->MajorFunction == IRP_MJ_WRITE&&
        deviceExtension->m_part_num==2)//m_part_num是分区号
    {
                                    ZwWriteFile(file_handle,///FILE——HANDLE是一个文件的句柄,我是让所有的写转到这里。。
            NULL,
            NULL,
            NULL,
            &IoStatus,//MmGetSystemAddressForMdlSafe
            MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority),
            currentIrpStack->Parameters.Write.Length,
            &currentIrpStack->Parameters.Write.ByteOffset,
            NULL
            );
        Irp->IoStatus.Information = m_w_n;
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp,IO_DISK_INCREMENT);
        IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp);
        return STATUS_SUCCESS;
}
///如果只拦截写的话。。只要过一会儿,系统就会蓝屏。。错误码为:0x00000024。。说NTFS。SYS出错。。。

如果说我再把写也跳传的话。。就不会有问题。。加上如下代码:

if ( currentIrpStack->MajorFunction == IRP_MJ_READ&&deviceExtension->m_part_num==2 )
        {
system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
            if (system_buffer == NULL)
            {
                Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                Irp->IoStatus.Information = 0;
                
                IoCompleteRequest(Irp,IO_NO_INCREMENT);
                IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp);
                return STATUS_INSUFFICIENT_RESOURCES;
            }
            buffer = (PUCHAR) ExAllocatePool(NonPagedPool, currentIrpStack->Parameters.Read.Length);
            if (buffer == NULL)
            {
                Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                Irp->IoStatus.Information = 0;
                
                IoCompleteRequest(Irp,IO_NO_INCREMENT);
                IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp);
                return STATUS_INSUFFICIENT_RESOURCES;
            }
ZwReadFile(
        file_handle,
        NULL,
        NULL,
        NULL,
        &Irp->IoStatus,
        buffer,
        currentIrpStack->Parameters.Read.Length,
        &currentIrpStack->Parameters.Read.ByteOffset,
        NULL
        );
RtlCopyMemory(system_buffer, buffer, currentIrpStack->Parameters.Read.Length);
ExFreePool(buffer);
Irp->IoStatus.Information = currentIrpStack->Parameters.Read.Length;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp,IO_DISK_INCREMENT);
IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp);
return STATUS_SUCCESS;

    }
///如果说加上后,一切正常。就有点像FILEDISK了。。。。
我现在想知道为什么,我不加上第二段代码时,就会出错的问题。。。
请高手帮我看一下。。。。。弄了几天了。。谢谢

最新喜欢:

LeopardLeopar...
sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-19 10:26
那位老大看到了,帮我一下呀..谢谢..

打开文件的代码为:
UNICODE_STRING                  ufile_name;
    WCHAR buf[125];
    OBJECT_ATTRIBUTES               object_attributes;
    IO_STATUS_BLOCK IoStatus;
    NTSTATUS                        status;
    PDEVICE_EXTENSION               device_extension;
    PAGED_CODE();


    RtlInitEmptyUnicodeString(&ufile_name,buf,125);
    
    RtlInitUnicodeString(&ufile_name,L"\\??\\D:\\abc.dat");
    InitializeObjectAttributes(
        &object_attributes,
        &ufile_name,
        OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
        NULL,
        NULL
        );
    
    status = ZwCreateFile(
        &file_handle,
        GENERIC_WRITE|SYNCHRONIZE|GENERIC_READ,
        &object_attributes,
        &IoStatus,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        0,
         FILE_SHARE_READ|FILE_SHARE_WRITE,
        FILE_OPEN,
           FILE_NON_DIRECTORY_FILE |
           FILE_RANDOM_ACCESS |
          FILE_NO_INTERMEDIATE_BUFFERING |
       FILE_SYNCHRONOUS_IO_NONALERT,
        NULL,
        0
        );

    if (!NT_SUCCESS(status))
    {
         DbgPrint("OPEN FILE IS NOT OK!%08X\r\n",status);
        
        return FALSE;
    }
    else
    {
DbgPrint("OPEN FILE IS  OK!%08X\r\n",status);
    }
游客

返回顶部