阅读:1456回复:3
请教:关于filedisk读请求分配内存的问题。
case IRP_MJ_READ:
system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); if (system_buffer == NULL) { irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; irp->IoStatus.Information = 0; break; } buffer = (PUCHAR) ExAllocatePool(PagedPool, io_stack->Parameters.Read.Length); if (buffer == NULL) { irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; irp->IoStatus.Information = 0; break; } ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, buffer, io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); RtlCopyMemory(system_buffer, buffer, io_stack->Parameters.Read.Length); ExFreePool(buffer); break; 这里为什么要分配内存,而不直接使用system_buffer ,希望大家可以给出一个好的说法。 |
|
沙发#
发布于:2009-02-12 09:23
补充:如果不分配内存,会引起缓存管理器将读出来的数据,修改为脏页数据,将延迟写到磁盘上。
|
|
板凳#
发布于:2009-02-20 21:07
这让做不仅安全,
速度也会比较快. |
|
地板#
发布于:2009-02-26 10:32
我找到的答案:
直接调用ZwReadFile()会lock一个MDL出来,实际上这个buf已经是文件系统LOCK一次的了。两次lock一个buf就会导致数据被认为是脏页数据,回写到磁盘上。 解决:直接构造IRP call RAW这个驱动,相当于直接CALL物理磁盘驱动,这样就不会lock两次,问题得到解决。 |
|