阅读:1370回复:1
toaster filter ZwWriteFile蓝屏。。
我用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, ¤tIrpStack->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, ¤tIrpStack->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了。。。。 我现在想知道为什么,我不加上第二段代码时,就会出错的问题。。。 请高手帮我看一下。。。。。弄了几天了。。谢谢 |
|
最新喜欢:![]() |
沙发#
发布于: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); } |
|