1 /*++ 2 3 Copyright (c) Microsoft. All rights reserved. 4 5 Module Name: 6 7 FxIoTargetUm.hpp 8 9 Abstract: 10 11 Author: 12 13 14 15 Environment: 16 17 18 Revision History: 19 20 --*/ 21 22 #ifndef _FXIOTARGETUM_H_ 23 #define _FXIOTARGETUM_H_ 24 25 __inline 26 FxIoContext::FxIoContext( 27 VOID 28 ) : 29 FxRequestContext(FX_RCT_IO), 30 m_OtherMemory(NULL), 31 m_RestoreState(FALSE) 32 { 33 ZeroMemory(&m_OriginalBufferInfo, sizeof(m_OriginalBufferInfo)); 34 } 35 36 __inline 37 FxIoContext::~FxIoContext( 38 VOID 39 ) 40 { 41 } 42 43 __inline 44 VOID 45 FxIoContext::ReleaseAndRestore( 46 __in FxRequestBase* Request 47 ) 48 { 49 FxIrp* irp = NULL; 50 51 irp = Request->GetSubmitFxIrp(); 52 53 if (m_RestoreState) { 54 irp->GetIoIrp()->RestoreCurrentBuffer(&m_OriginalBufferInfo); 55 m_RestoreState = FALSE; 56 } 57 58 // 59 // Release the 2ndary buffer if we have an outstanding reference 60 // 61 if (m_OtherMemory != NULL) { 62 m_OtherMemory->RELEASE(this); 63 m_OtherMemory = NULL; 64 } 65 66 // 67 // Release the other buffer and all __super related fields 68 // 69 __super::ReleaseAndRestore(Request); 70 } 71 72 __inline 73 VOID 74 FxIoContext::CopyParameters( 75 __in FxRequestBase* Request 76 ) 77 { 78 switch (m_MajorFunction) { 79 case IRP_MJ_WRITE: 80 m_CompletionParams.Parameters.Write.Length = 81 m_CompletionParams.IoStatus.Information; 82 break; 83 84 case IRP_MJ_READ: 85 m_CompletionParams.Parameters.Read.Length = 86 m_CompletionParams.IoStatus.Information; 87 break; 88 89 case IRP_MJ_DEVICE_CONTROL: 90 case UMINT::WdfRequestInternalIoctl: 91 m_CompletionParams.Parameters.Ioctl.Output.Length = 92 m_CompletionParams.IoStatus.Information; 93 break; 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 default: 109 FX_VERIFY(INTERNAL, CHECK("Non Io Irp passed to CopyParameters", FALSE)); 110 } 111 } 112 113 __inline 114 VOID 115 FxIoContext::SwapIrpBuffer( 116 _In_ FxRequestBase* Request, 117 _In_ ULONG NewInputBufferCb, 118 _In_reads_bytes_opt_(NewInputBufferCb) PVOID NewInputBuffer, 119 _In_ ULONG NewOutputBufferCb, 120 _In_reads_bytes_opt_(NewOutputBufferCb) PVOID NewOutputBuffer 121 ) 122 { 123 FxIrp* irp = NULL; 124 125 irp = Request->GetSubmitFxIrp(); 126 127 m_RestoreState = TRUE; 128 irp->GetIoIrp()->SwapCurrentBuffer( 129 true, 130 NewInputBufferCb, 131 NewInputBuffer, 132 NewOutputBufferCb, 133 NewOutputBuffer, 134 &m_OriginalBufferInfo 135 ); 136 } 137 138 __inline 139 BOOLEAN 140 FxIoTarget::HasValidStackSize( 141 VOID 142 ) 143 { 144 145 146 147 148 149 150 return TRUE; 151 } 152 153 __inline 154 VOID 155 FxIoTarget::Send( 156 _In_ MdIrp Irp 157 ) 158 { 159 Forward(Irp); 160 } 161 162 #endif // _FXIOTARGETUM_H_ 163