// 写操作 VOID RamDiskEvtIoWrite(IN WDFQUEUE Queue,IN WDFREQUEST Request,IN size_t Length) { PDEVICE_EXTENSION devExt = QueueGetExtension(Queue)->DeviceExtension; //从队列对象获得设备扩展 NTSTATUS Status = STATUS_INVALID_PARAMETER; WDF_REQUEST_PARAMETERS Parameters; LARGE_INTEGER ByteOffset; WDFMEMORY hMemory; //__analysis_assume(Length > 0); //参数清0 WDF_REQUEST_PARAMETERS_INIT(&Parameters); //从请求中获取信息 WdfRequestGetParameters(Request, &Parameters); //写入偏移 ByteOffset.QuadPart = Parameters.Parameters.Write.DeviceOffset; //检测写入是否合法 if (RamDiskCheckParameters(devExt, ByteOffset, Length)) { // from output to input Status = WdfRequestRetrieveInputMemory(Request, &hMemory); //获得内存状态 if(NT_SUCCESS(Status)) { // Source # offset in Source memory where the copy has to start # destination Status = WdfMemoryCopyToBuffer(hMemory, 0,devExt->DiskImage + ByteOffset.LowPart, Length); // from "from" to "to" } } WdfRequestCompleteWithInformation(Request, Status, (ULONG_PTR)Length); }
VOID RamDiskEvtIoWrite( IN WDFQUEUE Queue, IN WDFREQUEST Request, IN size_t Length ) /*++ Routine Description: This event is invoked when the framework receives IRP_MJ_WRITE request. Arguments: Queue - Handle to the framework queue object that is associated with the I/O request. Request - Handle to a framework request object. Length - Length of the data buffer associated with the request. The default property of the queue is to not dispatch zero length read & write requests to the driver and complete is with status success. So we will never get a zero length request. Return Value: VOID --*/ { PDEVICE_EXTENSION devExt = QueueGetExtension(Queue)->DeviceExtension; NTSTATUS Status = STATUS_INVALID_PARAMETER; WDF_REQUEST_PARAMETERS Parameters; LARGE_INTEGER ByteOffset; WDFMEMORY hMemory; _Analysis_assume_(Length > 0); WDF_REQUEST_PARAMETERS_INIT(&Parameters); WdfRequestGetParameters(Request, &Parameters); ByteOffset.QuadPart = Parameters.Parameters.Write.DeviceOffset; if (RamDiskCheckParameters(devExt, ByteOffset, Length)) { Status = WdfRequestRetrieveInputMemory(Request, &hMemory); if(NT_SUCCESS(Status)){ Status = WdfMemoryCopyToBuffer(hMemory, // Source 0, // offset in Source memory where the copy has to start devExt->DiskImage + ByteOffset.LowPart, // destination Length); } } WdfRequestCompleteWithInformation(Request, Status, (ULONG_PTR)Length); }
//读操作 VOID RamDiskEvtIoRead(IN WDFQUEUE Queue,IN WDFREQUEST Request,IN size_t Length) { PDEVICE_EXTENSION devExt = QueueGetExtension(Queue)->DeviceExtension; //从队列对象获得设备扩展 NTSTATUS Status = STATUS_INVALID_PARAMETER; WDF_REQUEST_PARAMETERS Parameters; LARGE_INTEGER ByteOffset; WDFMEMORY hMemory; //__analysis_assume(Length > 0); //参数清0 WDF_REQUEST_PARAMETERS_INIT(&Parameters); //从请求中获取信息 WdfRequestGetParameters(Request, &Parameters); //读取偏移 ByteOffset.QuadPart = Parameters.Parameters.Read.DeviceOffset; //检测读取是否合法 if (RamDiskCheckParameters(devExt, ByteOffset, Length)) { //获得内存状态 Status = WdfRequestRetrieveOutputMemory(Request, &hMemory); if(NT_SUCCESS(Status)) { // Destination # Offset into the destination # source Status = WdfMemoryCopyFromBuffer(hMemory,0, devExt->DiskImage + ByteOffset.LowPart, Length); } } WdfRequestCompleteWithInformation(Request, Status, (ULONG_PTR)Length); }