4 #define RxSetIoStatusStatus(R, S) (R)->CurrentIrp->IoStatus.Status = (S)
5 #define RxSetIoStatusInfo(R, I) (R)->CurrentIrp->IoStatus.Information = (I)
7 #define RxShouldPostCompletion() ((KeGetCurrentIrql() >= DISPATCH_LEVEL))
9 #define RX_REGISTERMINI_FLAG_DONT_PROVIDE_UNCS 0x00000001
10 #define RX_REGISTERMINI_FLAG_DONT_PROVIDE_MAILSLOTS 0x00000002
11 #define RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH 0x00000004
12 #define RX_REGISTERMINI_FLAG_DONT_INIT_PREFIX_N_SCAVENGER 0x00000008
17 _Out_ PRDBSS_DEVICE_OBJECT
*DeviceObject
,
18 _Inout_ PDRIVER_OBJECT DriverObject
,
19 _In_ PMINIRDR_DISPATCH MrdrDispatch
,
21 _In_ PUNICODE_STRING DeviceName
,
22 _In_ ULONG DeviceExtensionSize
,
23 _In_ DEVICE_TYPE DeviceType
,
24 _In_ ULONG DeviceCharacteristics
);
29 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
);
34 _In_ PRX_CONTEXT RxContext
,
35 _Out_ PBOOLEAN PostToFsp
);
40 _In_ PRX_CONTEXT RxContext
,
41 _Out_ PBOOLEAN PostToFsp
);
46 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
51 (NTAPI
*PMRX_CALLDOWN
) (
52 _Inout_ PRX_CONTEXT RxContext
);
56 (NTAPI
*PMRX_CALLDOWN_CTX
) (
57 _Inout_ PRX_CONTEXT RxContext
,
58 _Inout_ PRDBSS_DEVICE_OBJECT RxDeviceObject
);
62 (NTAPI
*PMRX_CHKDIR_CALLDOWN
) (
63 _Inout_ PRX_CONTEXT RxContext
,
64 _In_ PUNICODE_STRING DirectoryName
);
68 (NTAPI
*PMRX_CHKFCB_CALLDOWN
) (
72 typedef enum _RX_BLOCK_CONDITION
{
73 Condition_Uninitialized
= 0,
74 Condition_InTransition
,
79 } RX_BLOCK_CONDITION
, *PRX_BLOCK_CONDITION
;
81 #define StableCondition(X) ((X) >= Condition_Good)
85 (NTAPI
*PMRX_NETROOT_CALLBACK
) (
86 _Inout_ PMRX_CREATENETROOT_CONTEXT CreateContext
);
90 (NTAPI
*PMRX_EXTRACT_NETROOT_NAME
) (
91 _In_ PUNICODE_STRING FilePathName
,
92 _In_ PMRX_SRV_CALL SrvCall
,
93 _Out_ PUNICODE_STRING NetRootName
,
94 _Out_opt_ PUNICODE_STRING RestOfName
);
96 typedef struct _MRX_CREATENETROOT_CONTEXT
98 PRX_CONTEXT RxContext
;
99 PV_NET_ROOT pVNetRoot
;
101 NTSTATUS VirtualNetRootStatus
;
102 NTSTATUS NetRootStatus
;
103 RX_WORK_QUEUE_ITEM WorkQueueItem
;
104 PMRX_NETROOT_CALLBACK Callback
;
105 } MRX_CREATENETROOT_CONTEXT
, *PMRX_CREATENETROOT_CONTEXT
;
109 (NTAPI
*PMRX_CREATE_V_NET_ROOT
) (
110 _Inout_ PMRX_CREATENETROOT_CONTEXT Context
);
114 (NTAPI
*PMRX_UPDATE_NETROOT_STATE
) (
115 _Inout_ PMRX_NET_ROOT NetRoot
);
117 typedef struct _MRX_SRVCALL_CALLBACK_CONTEXT
119 PMRX_SRVCALLDOWN_STRUCTURE SrvCalldownStructure
;
120 ULONG CallbackContextOrdinal
;
121 PRDBSS_DEVICE_OBJECT RxDeviceObject
;
123 PVOID RecommunicateContext
;
124 } MRX_SRVCALL_CALLBACK_CONTEXT
, *PMRX_SRVCALL_CALLBACK_CONTEXT
;
128 (NTAPI
*PMRX_SRVCALL_CALLBACK
) (
129 _Inout_ PMRX_SRVCALL_CALLBACK_CONTEXT Context
);
131 typedef struct _MRX_SRVCALLDOWN_STRUCTURE
134 LIST_ENTRY SrvCalldownList
;
135 PRX_CONTEXT RxContext
;
136 PMRX_SRV_CALL SrvCall
;
137 PMRX_SRVCALL_CALLBACK CallBack
;
138 BOOLEAN CalldownCancelled
;
139 ULONG NumberRemaining
;
141 ULONG BestFinisherOrdinal
;
142 PRDBSS_DEVICE_OBJECT BestFinisher
;
143 MRX_SRVCALL_CALLBACK_CONTEXT CallbackContexts
[1];
144 } MRX_SRVCALLDOWN_STRUCTURE
, *PMRX_SRVCALLDOWN_STRUCTURE
;
148 (NTAPI
*PMRX_CREATE_SRVCALL
) (
149 _Inout_ PMRX_SRV_CALL SrvCall
,
150 _Inout_ PMRX_SRVCALL_CALLBACK_CONTEXT SrvCallCallBackContext
);
154 (NTAPI
*PMRX_SRVCALL_WINNER_NOTIFY
)(
155 _Inout_ PMRX_SRV_CALL SrvCall
,
156 _In_ BOOLEAN ThisMinirdrIsTheWinner
,
157 _Inout_ PVOID RecommunicateContext
);
161 (NTAPI
*PMRX_DEALLOCATE_FOR_FCB
) (
162 _Inout_ PMRX_FCB Fcb
);
166 (NTAPI
*PMRX_DEALLOCATE_FOR_FOBX
) (
167 _Inout_ PMRX_FOBX Fobx
);
171 (NTAPI
*PMRX_IS_LOCK_REALIZABLE
) (
172 _Inout_ PMRX_FCB Fcb
,
173 _In_ PLARGE_INTEGER ByteOffset
,
174 _In_ PLARGE_INTEGER Length
,
175 _In_ ULONG LowIoLockFlags
);
179 (NTAPI
*PMRX_FORCECLOSED_CALLDOWN
) (
180 _Inout_ PMRX_SRV_OPEN SrvOpen
);
184 (NTAPI
*PMRX_FINALIZE_SRVCALL_CALLDOWN
) (
185 _Inout_ PMRX_SRV_CALL SrvCall
,
190 (NTAPI
*PMRX_FINALIZE_V_NET_ROOT_CALLDOWN
) (
191 _Inout_ PMRX_V_NET_ROOT VirtualNetRoot
,
192 _In_ PBOOLEAN Force
);
196 (NTAPI
*PMRX_FINALIZE_NET_ROOT_CALLDOWN
) (
197 _Inout_ PMRX_NET_ROOT NetRoot
,
198 _In_ PBOOLEAN Force
);
202 (NTAPI
*PMRX_EXTENDFILE_CALLDOWN
) (
203 _Inout_ PRX_CONTEXT RxContext
,
204 _Inout_ PLARGE_INTEGER NewFileSize
,
205 _Out_ PLARGE_INTEGER NewAllocationSize
);
209 (NTAPI
*PMRX_CHANGE_BUFFERING_STATE_CALLDOWN
) (
210 _Inout_ PRX_CONTEXT RxContext
,
211 _Inout_ PMRX_SRV_OPEN SrvOpen
,
212 _In_ PVOID MRxContext
);
216 (NTAPI
*PMRX_PREPARSE_NAME
) (
217 _Inout_ PRX_CONTEXT RxContext
,
218 _In_ PUNICODE_STRING Name
);
222 (NTAPI
*PMRX_GET_CONNECTION_ID
) (
223 _Inout_ PRX_CONTEXT RxContext
,
224 _Inout_ PRX_CONNECTION_ID UniqueId
);
228 (NTAPI
*PMRX_COMPUTE_NEW_BUFFERING_STATE
) (
229 _Inout_ PMRX_SRV_OPEN SrvOpen
,
230 _In_ PVOID MRxContext
,
231 _Out_ PULONG NewBufferingState
);
233 typedef enum _LOWIO_OPS
{
237 LOWIO_OP_EXCLUSIVELOCK
,
239 LOWIO_OP_UNLOCK_MULTIPLE
,
242 LOWIO_OP_NOTIFY_CHANGE_DIRECTORY
,
249 (NTAPI
*PLOWIO_COMPLETION_ROUTINE
) (
250 _In_ PRX_CONTEXT RxContext
);
252 typedef LONGLONG RXVBO
;
254 typedef struct _LOWIO_LOCK_LIST
256 struct _LOWIO_LOCK_LIST
* Next
;
260 BOOLEAN ExclusiveLock
;
262 } LOWIO_LOCK_LIST
, *PLOWIO_LOCK_LIST
;
264 typedef struct _XXCTL_LOWIO_COMPONENT
272 ULONG InputBufferLength
;
274 ULONG OutputBufferLength
;
277 } XXCTL_LOWIO_COMPONENT
;
279 typedef struct _LOWIO_CONTEXT
283 PLOWIO_COMPLETION_ROUTINE CompletionRoutine
;
285 ERESOURCE_THREAD ResourceThreadId
;
295 PNON_PAGED_FCB NonPagedFcb
;
301 PLOWIO_LOCK_LIST LockList
;
308 XXCTL_LOWIO_COMPONENT FsCtl
;
309 XXCTL_LOWIO_COMPONENT IoCtl
;
313 ULONG CompletionFilter
;
314 ULONG NotificationBufferLength
;
315 PVOID pNotificationBuffer
;
316 } NotifyChangeDirectory
;
320 #define LOWIO_CONTEXT_FLAG_SYNCCALL 0x01
321 #define LOWIO_CONTEXT_FLAG_SAVEUNLOCKS 0x2
322 #define LOWIO_CONTEXT_FLAG_LOUDOPS 0x04
323 #define LOWIO_CONTEXT_FLAG_CAN_COMPLETE_AT_DPC_LEVEL 0x08
325 #define LOWIO_READWRITEFLAG_PAGING_IO 0x01
326 #define LOWIO_READWRITEFLAG_EXTENDING_FILESIZE 0x02
327 #define LOWIO_READWRITEFLAG_EXTENDING_VDL 0x04
329 #define RDBSS_MANAGE_SRV_CALL_EXTENSION 0x01
330 #define RDBSS_MANAGE_NET_ROOT_EXTENSION 0x02
331 #define RDBSS_MANAGE_V_NET_ROOT_EXTENSION 0x04
332 #define RDBSS_MANAGE_FCB_EXTENSION 0x08
333 #define RDBSS_MANAGE_SRV_OPEN_EXTENSION 0x10
334 #define RDBSS_MANAGE_FOBX_EXTENSION 0x20
335 #define RDBSS_NO_DEFERRED_CACHE_READAHEAD 0x1000
337 typedef struct _MINIRDR_DISPATCH
339 NODE_TYPE_CODE NodeTypeCode
;
340 NODE_BYTE_SIZE NodeByteSize
;
342 ULONG MRxSrvCallSize
;
343 ULONG MRxNetRootSize
;
344 ULONG MRxVNetRootSize
;
346 ULONG MRxSrvOpenSize
;
348 PMRX_CALLDOWN_CTX MRxStart
;
349 PMRX_CALLDOWN_CTX MRxStop
;
350 PMRX_CALLDOWN MRxCancel
;
351 PMRX_CALLDOWN MRxCreate
;
352 PMRX_CALLDOWN MRxCollapseOpen
;
353 PMRX_CALLDOWN MRxShouldTryToCollapseThisOpen
;
354 PMRX_CALLDOWN MRxFlush
;
355 PMRX_CALLDOWN MRxZeroExtend
;
356 PMRX_CALLDOWN MRxTruncate
;
357 PMRX_CALLDOWN MRxCleanupFobx
;
358 PMRX_CALLDOWN MRxCloseSrvOpen
;
359 PMRX_DEALLOCATE_FOR_FCB MRxDeallocateForFcb
;
360 PMRX_DEALLOCATE_FOR_FOBX MRxDeallocateForFobx
;
361 PMRX_IS_LOCK_REALIZABLE MRxIsLockRealizable
;
362 PMRX_FORCECLOSED_CALLDOWN MRxForceClosed
;
363 PMRX_CHKFCB_CALLDOWN MRxAreFilesAliased
;
364 PMRX_CALLDOWN MRxOpenPrintFile
;
365 PMRX_CALLDOWN MRxClosePrintFile
;
366 PMRX_CALLDOWN MRxWritePrintFile
;
367 PMRX_CALLDOWN MRxEnumeratePrintQueue
;
368 PMRX_CALLDOWN MRxClosedSrvOpenTimeOut
;
369 PMRX_CALLDOWN MRxClosedFcbTimeOut
;
370 PMRX_CALLDOWN MRxQueryDirectory
;
371 PMRX_CALLDOWN MRxQueryFileInfo
;
372 PMRX_CALLDOWN MRxSetFileInfo
;
373 PMRX_CALLDOWN MRxSetFileInfoAtCleanup
;
374 PMRX_CALLDOWN MRxQueryEaInfo
;
375 PMRX_CALLDOWN MRxSetEaInfo
;
376 PMRX_CALLDOWN MRxQuerySdInfo
;
377 PMRX_CALLDOWN MRxSetSdInfo
;
378 PMRX_CALLDOWN MRxQueryQuotaInfo
;
379 PMRX_CALLDOWN MRxSetQuotaInfo
;
380 PMRX_CALLDOWN MRxQueryVolumeInfo
;
381 PMRX_CALLDOWN MRxSetVolumeInfo
;
382 PMRX_CHKDIR_CALLDOWN MRxIsValidDirectory
;
383 PMRX_COMPUTE_NEW_BUFFERING_STATE MRxComputeNewBufferingState
;
384 PMRX_CALLDOWN MRxLowIOSubmit
[LOWIO_OP_MAXIMUM
+1];
385 PMRX_EXTENDFILE_CALLDOWN MRxExtendForCache
;
386 PMRX_EXTENDFILE_CALLDOWN MRxExtendForNonCache
;
387 PMRX_CHANGE_BUFFERING_STATE_CALLDOWN MRxCompleteBufferingStateChangeRequest
;
388 PMRX_CREATE_V_NET_ROOT MRxCreateVNetRoot
;
389 PMRX_FINALIZE_V_NET_ROOT_CALLDOWN MRxFinalizeVNetRoot
;
390 PMRX_FINALIZE_NET_ROOT_CALLDOWN MRxFinalizeNetRoot
;
391 PMRX_UPDATE_NETROOT_STATE MRxUpdateNetRootState
;
392 PMRX_EXTRACT_NETROOT_NAME MRxExtractNetRootName
;
393 PMRX_CREATE_SRVCALL MRxCreateSrvCall
;
394 PMRX_CREATE_SRVCALL MRxCancelCreateSrvCall
;
395 PMRX_SRVCALL_WINNER_NOTIFY MRxSrvCallWinnerNotify
;
396 PMRX_FINALIZE_SRVCALL_CALLDOWN MRxFinalizeSrvCall
;
397 PMRX_CALLDOWN MRxDevFcbXXXControlFile
;
398 PMRX_PREPARSE_NAME MRxPreparseName
;
399 PMRX_GET_CONNECTION_ID MRxGetConnectionId
;
400 ULONG ScavengerTimeout
;
401 } MINIRDR_DISPATCH
, *PMINIRDR_DISPATCH
;