阅读:1125回复:1
紧急求助,缓冲区无效
我写了一个简单的调用IRP_MJ_WRITE的例程 ,对应的函数为
NTSTATUS DispatchWrite( IN PDEVICE_OBJECT pObject, IN PIRP pIrp) { NTSTATUS status; DEVICE_EXTENSION* pDevExt = (DEVICE_EXTENSION*)pObject->DeviceExtension ; if( pDevExt->devBuffer!=NULL ) { ExFreePool( pDevExt->devBuffer ) ; pDevExt->devBuffer=NULL; pDevExt->devBufferSize=0; } IO_STACK_LOCATION* stl= IoGetCurrentIrpStackLocation( pIrp ); ULONG userbuffersize = stl->Parameters.Write.Length; void * userbuffer = pIrp->AssociatedIrp.SystemBuffer; if( userbuffer == NULL ) { status= STATUS_INSUFFICIENT_RESOURCES; userbuffersize=0; goto next; } pDevExt->devBuffer = ExAllocatePool(PagedPool, userbuffersize ); if( pDevExt->devBuffer == NULL ) { status= STATUS_INSUFFICIENT_RESOURCES; userbuffersize=0; } else { pDevExt->devBufferSize = userbuffersize ; RtlCopyMemory( pDevExt->devBuffer , userbuffer , userbuffersize ) ; status = STATUS_SUCCESS; } next: pIrp->IoStatus.Status=status; pIrp->IoStatus.Information = userbuffersize; IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return status; } 我在测试程序中调用WriteFile() ,可在DispatchWrite()中 pIrp->AssociatedIrp.SystemBuffer 总是 为 0x00000000 , 请各位大虾帮我看一下,我在初始化中设置 pObject->Flags |= DO_BUFFERED_IO ; ////我的测试/// DWORD outCount; int outBuffer[5]={1,2,3,4,5}; outCount=sizeof(int) * 5 ; DWORD bW; WriteFile(handle,outBuffer,outCount,&bW,NULL); |
|
沙发#
发布于:2003-05-05 23:49
在某些情况下确实如此. 如果BUFFER过大,IO MANAGER可能会使用MDL来解决内存使用问题. 我曾经碰到过. 不过MDL要比SYSTEM BUFFER强多了.
|
|
|