ReactOS 0.4.16-dev-1946-g52006dd
fxdmatransactionapi.cpp
Go to the documentation of this file.
1/*++
2
3Copyright (c) Microsoft Corporation
4
5Module Name:
6
7 FxDmaTransactionAPI.cpp
8
9Abstract:
10
11 Base for WDF DMA Transaction APIs
12
13Environment:
14
15 Kernel mode only.
16
17Notes:
18
19
20Revision History:
21
22--*/
23
24#include "fxdmapch.hpp"
25
26extern "C" {
27// #include "FxDmaTransactionAPI.tmh"
28}
29
30//
31// Extern "C" the entire file
32//
33extern "C" {
34
40WDFEXPORT(WdfDmaTransactionCreate)(
41 __in
42 PWDF_DRIVER_GLOBALS DriverGlobals,
43 __in
44 WDFDMAENABLER DmaEnabler,
47 __out
48 WDFDMATRANSACTION * DmaTransactionHandle
49 )
50{
54
58 (PVOID *) &pDmaEnabler,
60
62
64
68 );
70 return status;
71 }
72
74 {
81 break;
82
92 );
93 break;
94
101 break;
102
103 default:
104 NT_ASSERTMSG("Unknown profile for DMA enabler", FALSE);
106 break;
107 }
108
109 return status;
110}
111
114WDFAPI
116NTAPI
117WDFEXPORT(WdfDmaTransactionInitializeUsingRequest)(
118 __in
119 PWDF_DRIVER_GLOBALS DriverGlobals,
120 __in
121 WDFDMATRANSACTION DmaTransaction,
122 __in
123 WDFREQUEST Request,
124 __in
126 __in
128 )
129{
137
141 (PVOID *) &pDmaTrans,
143
145
151 "Initialization of WDFDMATRANSACTION 0x%p using WDFREQUEST %p, "
152 "DmaDirection 0x%x is an invalid value, %!STATUS!",
154 return status;
155 }
156
158 Request,
160 (PVOID *) &pReqObj);
161
162 reqLength = 0;
163
165
166 //
167 // Get the MDL and Length from the request.
168 //
169 switch (stack->MajorFunction) {
170
171 case IRP_MJ_READ:
172
175
177 "Dma direction %!WDF_DMA_DIRECTION! of WDFTRANSACTION "
178 "0x%p doesn't match with the WDFREQUEST 0x%p type "
179 "%!WDF_REQUEST_TYPE! %!STATUS!",
181 stack->MajorFunction, status);
182
183 return status;
184 }
185
186 reqLength = stack->Parameters.Read.Length;
187
189 break;
190
191 case IRP_MJ_WRITE:
192
195
197 "Dma direction %!WDF_DMA_DIRECTION! of WDFTRANSACTION "
198 "0x%p doesn't match with the WDFREQUEST 0x%p type "
199 "%!WDF_REQUEST_TYPE! %!STATUS!",
201 stack->MajorFunction, status);
202
203 return status;
204 }
205
206 reqLength = stack->Parameters.Write.Length;
207
209 break;
210
213
214 switch (METHOD_FROM_CTL_CODE(stack->Parameters.DeviceIoControl.IoControlCode)) {
215 case METHOD_BUFFERED:
216
218 reqLength = stack->Parameters.DeviceIoControl.InputBufferLength;
219 } else {
220 reqLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
221 }
222
223 //
224 // In this case both input buffer and output buffer map
225 // to the same MDL and it's probed for read & write access.
226 // So it's okay for DMA transfer in either direction.
227 //
229 break;
230
231 case METHOD_IN_DIRECT:
232 //
233 // For this type, the output buffer is probed for read access.
234 // So the direction of DMA transfer is WdfDmaDirectionWriteToDevice.
235 //
237
239
242 "Dma direction %!WDF_DMA_DIRECTION! of WDFTRANSACTION "
243 "0x%p doesn't match with WDFREQUEST 0x%p ioctl type "
244 "METHOD_IN_DIRECT %!STATUS!",
246 return status;
247 }
248
249 reqLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
250
252
253 break;
254
256 //
257 // For this type, the output buffer is probed for write access.
258 // So the direction of DMA transfer is WdfDmaDirectionReadFromDevice.
259 //
261
263
266 "Dma direction %!WDF_DMA_DIRECTION! of WDFTRANSACTION "
267 "0x%p doesn't match with WDFREQUEST 0x%p ioctl type "
268 "METHOD_OUT_DIRECT %!STATUS!",
270
271 return status;
272 }
273
274 reqLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
275
277
278 break;
279 default:
280
282
284 "Invalid ioctl code in WDFREQUEST 0x%p %!STATUS!",
285 Request, status);
286
288 break;
289
290 }// End of switch(ioctType)
291 break;
292
293 default:
295 break;
296
297 }
298
299 if (!NT_SUCCESS(status)) {
301 "Couldn't retrieve mdl from WDFREQUEST 0x%p for "
302 "WDFTRANSACTION 0x%p %!STATUS!",
304 return status;
305 }
306
307 if (reqLength == 0) {
311 "Zero length request, %!STATUS!", status);
312 return status;
313 }
314
315 //
316 // If the DMA enabler is packet based, make sure the virtual address and
317 // the length of transfer are within bounds. Basically, we are checking
318 // to see if the length of data to be transferred doesn't span multiple
319 // MDLs, because packet based DMA doesn't support chained MDLs.
320 //
323
325
326 if (reqLength > length) {
330 "WDFREQUEST %p transfer length (%d) is out of bounds of MDL "
331 "Byte count (%d), %!STATUS!",
333
334 return status;
335 }
336 }
337
338 //
339 // Parms appear OK, so initialize this instance.
340 //
343 mdl,
344 0,
345 reqLength);
346
347 if (!NT_SUCCESS(status)) {
349 "WDFTANSACTION 0x%p initialization failed: "
350 "%!STATUS!", DmaTransaction, status);
351 return status;
352 }
353
354 //
355 // Set this Request in the new DmaTransaction. The request will
356 // take a reference on this request when it starts executing.
357 //
359
361}
362
363
366WDFAPI
368NTAPI
369WDFEXPORT(WdfDmaTransactionInitializeUsingOffset)(
370 __in
371 PWDF_DRIVER_GLOBALS DriverGlobals,
372 __in
373 WDFDMATRANSACTION DmaTransaction,
374 __in
376 __in
378 __in
380 __in
381 size_t Offset,
382 __in
384 size_t Length
385 )
386{
387 //
388 // Stub this out by calling the regular initialize method. Eventually
389 // the regular initialize method will call this instead.
390 //
391
392 return WDFEXPORT(WdfDmaTransactionInitialize)(
393 DriverGlobals,
397 Mdl,
399 Length
400 );
401}
402
405WDFAPI
407NTAPI
408WDFEXPORT(WdfDmaTransactionInitialize)(
409 __in
410 PWDF_DRIVER_GLOBALS DriverGlobals,
411 __in
412 WDFDMATRANSACTION DmaTransaction,
413 __in
415 __in
417 __in
418 PMDL Mdl,
419
420 //__drv_when(DmaDirection == WdfDmaDirectionReadFromDevice, __out_bcount(Length))
421 //__drv_when(DmaDirection == WdfDmaDirectionWriteToDevice, __in_bcount(Length))
422 __in
424 __in
426 size_t Length
427 )
428{
431 PUCHAR pVA;
432 ULONG mdlLength;
434
438 (PVOID *) &pDmaTrans,
440
443
444 if (Length == 0) {
447 "Can't initialize WDFDMATRANSACTION 0x%p with "
448 "zero length transfer", DmaTransaction);
449 return status;
450 }
451
457 "Initialization of WDFDMATRANSACTION 0x%p,DmaDirection 0x%x is an "
458 "invalid value, %!STATUS!", DmaTransaction, DmaDirection, status);
459 return status;
460 }
461
462 //
463 // Make sure the VirtualAddress is within the first MDL bounds.
464 //
466 mdlLength = MmGetMdlByteCount(Mdl);
467
468 if (VirtualAddress < pVA ||
469 VirtualAddress >= WDF_PTR_ADD_OFFSET(pVA, mdlLength)) {
473 "VirtualAddress %p is not within the Mdl bounds, StartVA (%p) + "
474 "ByteCount (0x%x), %!STATUS! ",
475 VirtualAddress, pVA, mdlLength, status);
476
477 return status;
478 }
479
480 //
481 // Get the DmaEnabler
482 //
486 (PVOID *) &pDmaTrans);
487
489 //
490 // Make sure the MDL is not a chained MDL by checking
491 // to see if the virtual address and the length
492 // are within bounds.
493 //
495 WDF_PTR_ADD_OFFSET(pVA, mdlLength)) {
499 "VirtualAddress+Length (%p+%I64d) is out of bounds of MDL VA + MDL "
500 "Byte count (max address is %p). "
501 "Possibly a chained MDL, %!STATUS!",
503 WDF_PTR_ADD_OFFSET(pVA, mdlLength), status);
504
505 return status;
506 }
507 }
508
511 Mdl,
515 ),
516 (ULONG) Length);
517
518 if (!NT_SUCCESS(status)) {
520 "WDFTANSACTION 0x%p initialization failed: "
521 "%!STATUS!", DmaTransaction, status);
522 }
523
524 return status;
525}
526
527
530WDFAPI
532NTAPI
533WDFEXPORT(WdfDmaTransactionExecute)(
534 __in
535 PWDF_DRIVER_GLOBALS DriverGlobals,
536 __in
537 WDFDMATRANSACTION DmaTransaction,
540 )
541{
543
547 (PVOID *) &pDmaTrans);
548
550}
551
554WDFAPI
556NTAPI
557WDFEXPORT(WdfDmaTransactionRelease)(
558 __in
559 PWDF_DRIVER_GLOBALS DriverGlobals,
560 __in
561 WDFDMATRANSACTION DmaTransaction
562 )
563{
565
569 (PVOID *) &pDmaTrans);
570
571 //
572 // Release map registers allocated for this specific transaction,
573 // but not map registers which were allocated through
574 // AllocateResources.
575 //
577 return STATUS_SUCCESS;
578}
579
580
582WDFAPI
584NTAPI
585WDFEXPORT(WdfDmaTransactionDmaCompleted)(
586 __in
587 PWDF_DRIVER_GLOBALS DriverGlobals,
588 __in
589 WDFDMATRANSACTION DmaTransaction,
590 __out
592 )
593{
595
599 (PVOID *) &pDmaTrans);
600
602
603
604 //
605 // Indicate this DMA has been completed.
606 //
608}
609
611WDFAPI
613NTAPI
614WDFEXPORT(WdfDmaTransactionDmaCompletedWithLength)(
615 __in
616 PWDF_DRIVER_GLOBALS DriverGlobals,
617 __in
618 WDFDMATRANSACTION DmaTransaction,
619 __in
621 __out
623 )
624{
626
630 (PVOID *) &pDmaTrans);
631
633
634 //
635 // Indicate this DMA transfer has been completed.
636 //
638 pStatus,
640}
641
643WDFAPI
645NTAPI
646WDFEXPORT(WdfDmaTransactionDmaCompletedFinal)(
647 __in
648 PWDF_DRIVER_GLOBALS DriverGlobals,
649 __in
650 WDFDMATRANSACTION DmaTransaction,
651 __in
653 __out
655 )
656{
658
662 (PVOID *) &pDmaTrans);
663
665
666 //
667 // Indicate this DMA FinalLength has completed.
668 //
670 pStatus,
672}
673
674
676WDFAPI
677size_t
678NTAPI
679WDFEXPORT(WdfDmaTransactionGetBytesTransferred)(
680 __in
681 PWDF_DRIVER_GLOBALS DriverGlobals,
682 __in
683 WDFDMATRANSACTION DmaTransaction
684 )
685{
687
691 (PVOID *) &pDmaTrans);
692
694}
695
697WDFAPI
698VOID
699NTAPI
700WDFEXPORT(WdfDmaTransactionSetMaximumLength)(
701 __in
702 PWDF_DRIVER_GLOBALS DriverGlobals,
703 __in
704 WDFDMATRANSACTION DmaTransaction,
705 __in
707 )
708{
710
714 (PVOID *) &pDmaTrans);
715
717}
718
720WDFAPI
721WDFREQUEST
722NTAPI
723WDFEXPORT(WdfDmaTransactionGetRequest)(
724 __in
725 PWDF_DRIVER_GLOBALS DriverGlobals,
726 __in
727 WDFDMATRANSACTION DmaTransaction
728 )
729{
732
736 (PVOID *) &pDmaTrans);
737
739
740 if (pRequest != NULL) {
741 return pRequest->GetHandle();
742 }
743 else {
744 return NULL;
745 }
746}
747
749WDFAPI
750size_t
751NTAPI
752WDFEXPORT(WdfDmaTransactionGetCurrentDmaTransferLength)(
753 __in
754 PWDF_DRIVER_GLOBALS DriverGlobals,
755 __in
756 WDFDMATRANSACTION DmaTransaction
757 )
758{
760
764 (PVOID *) &pDmaTrans);
765
767}
768
769
771WDFAPI
772WDFDEVICE
773NTAPI
774WDFEXPORT(WdfDmaTransactionGetDevice)(
775 __in
776 PWDF_DRIVER_GLOBALS DriverGlobals,
777 __in
778 WDFDMATRANSACTION DmaTransaction
779 )
780{
782
786 (PVOID *) &pDmaTrans);
787
789}
790
792WDFAPI
793VOID
794NTAPI
795WDFEXPORT(WdfDmaTransactionSetChannelConfigurationCallback)(
796 __in
797 PWDF_DRIVER_GLOBALS DriverGlobals,
798 __in
799 WDFDMATRANSACTION DmaTransaction,
804 )
805{
808
812 (PVOID *) &pDmaTrans,
814
815 //
816 // Verify that the transaction belongs to a system profile enabler.
817 //
818
823 "Cannot call %!FUNC! on non-system-profile "
824 "WDFDMATRANSACTION (%p) (transaction profile "
825 "is %!WDF_DMA_PROFILE!).",
827 profile);
829 return;
830 }
831
832 //
833 // Cast the transaction to the right sub-type now that we've verified the
834 // profile.
835 //
836
840}
841
843WDFAPI
844VOID
845NTAPI
846WDFEXPORT(WdfDmaTransactionSetTransferCompleteCallback)(
847 __in
848 PWDF_DRIVER_GLOBALS DriverGlobals,
849 __in
850 WDFDMATRANSACTION DmaTransaction,
855 )
856{
859
863 (PVOID *) &pDmaTrans,
865
866 //
867 // Verify that the transaction belongs to a system profile enabler.
868 //
869
871 if ((profile != WdfDmaProfileSystem) &&
874 "Cannot call %!FUNC! on non-system-profile "
875 "WDFDMATRANSACTION (%p) (transaction profile "
876 "is %!WDF_DMA_PROFILE!).",
878 profile);
880 return;
881 }
882
883 //
884 // Cast the transaction to the right sub-type now that we've verified the
885 // profile.
886 //
887
891
892}
893
895WDFAPI
896VOID
897NTAPI
898WDFEXPORT(WdfDmaTransactionSetDeviceAddressOffset)(
899 __in
900 PWDF_DRIVER_GLOBALS DriverGlobals,
901 __in
902 WDFDMATRANSACTION DmaTransaction,
903 __in
905 )
906{
909
913 (PVOID *) &pDmaTrans,
915
916 //
917 // Verify that the transaction belongs to a system profile enabler.
918 //
919
921 if ((profile != WdfDmaProfileSystem) &&
924 "Cannot call %!FUNC! on non-system-profile "
925 "WDFDMATRANSACTION (%p) (transaction profile "
926 "is %!WDF_DMA_PROFILE!).",
928 profile);
930 return;
931 }
932
933 //
934 // Cast the transaction to the right sub-type now that we've verified the
935 // profile.
936 //
937
940}
941
943WDFAPI
944PVOID
945NTAPI
946WDFEXPORT(WdfDmaTransactionWdmGetTransferContext)(
947 __in
948 PWDF_DRIVER_GLOBALS DriverGlobals,
949 __in
950 WDFDMATRANSACTION DmaTransaction
951 )
952{
955
959 (PVOID *) &pDmaTrans,
961
964 "Cannot call %!FUNC! for WDFDMATRANSACTION %p "
965 "because the parent WDFDMAENABLER (%p) is not "
966 "configured to use DMA version 3.",
970 return NULL;
971 }
972
974
980 "Cannot call %!FUNC! on WDFDMATRANSACTION %p "
981 "becuase it is uninitialized, reused, deleted "
982 "(state is %!FxDmaTransactionState!).",
984 state
985 );
987 return NULL;
988 }
989
991}
992
994WDFAPI
995VOID
996NTAPI
997WDFEXPORT(WdfDmaTransactionGetTransferInfo)(
998 __in
999 PWDF_DRIVER_GLOBALS DriverGlobals,
1000 __in
1001 WDFDMATRANSACTION DmaTransaction,
1002 __out_opt
1004 __out_opt
1006 )
1007{
1010
1014 (PVOID *) &pDmaTrans,
1016
1018}
1019
1020//
1021// Stubbed WDF 1.11 DMA DDIs start here.
1022//
1023
1025WDFAPI
1026VOID
1027NTAPI
1028WDFEXPORT(WdfDmaTransactionSetImmediateExecution)(
1029 __in
1030 PWDF_DRIVER_GLOBALS DriverGlobals,
1031 __in
1032 WDFDMATRANSACTION DmaTransaction,
1033 __in
1035 )
1036{
1039
1043 (PVOID *) &pDmaTrans,
1045
1047 {
1049 "Cannot call %!FUNC! for WDFDMATRANSACTION %p "
1050 "because the parent WDFDMAENABLER (%p) is not "
1051 "configured to use DMA version 3.",
1055 return;
1056 }
1057
1059}
1060
1062WDFAPI
1064NTAPI
1065WDFEXPORT(WdfDmaTransactionAllocateResources)(
1066 __in
1067 PWDF_DRIVER_GLOBALS DriverGlobals,
1068 __in
1069 WDFDMATRANSACTION DmaTransaction,
1070 __in
1072 __in
1074 __in
1076 __in
1078 )
1079{
1082
1084
1088 (PVOID *) &pDmaTrans,
1090
1091 //
1092 // Only valid if DMA V3 is enabled.
1093 //
1094
1096 {
1098
1100 "Cannot call %!FUNC! on WDFDMATRANSACTION %p "
1101 "because WDFDMAENABLER %p was not configured "
1102 "for DMA version 3 - %!STATUS!.",
1105 status);
1107 return status;
1108 }
1109
1110 //
1111 // Only valid for packet or system profile transactions.
1112 //
1118
1120
1122 "Cannot call %!FUNC! on non packet or system "
1123 "profile WDFDMATRANSACTION (%p) (transaction "
1124 "profile is %!WDF_DMA_PROFILE!) - %!STATUS!.",
1126 profile,
1127 status);
1129 return status;
1130 }
1131
1132 //
1133 // Validate the direction value.
1134 //
1140 "Allocation of DMA adapter for WDFDMATRANSACTION 0x%p, "
1141 "DmaDirection 0x%x is an invalid value, %!STATUS!",
1144 return status;
1145 }
1146
1148
1149 status = pDmaTrans->ReserveAdapter(RequiredMapRegisters,
1153
1154 return status;
1155}
1157WDFAPI
1158VOID
1159NTAPI
1160WDFEXPORT(WdfDmaTransactionFreeResources)(
1161 __in
1162 PWDF_DRIVER_GLOBALS DriverGlobals,
1163 __in
1164 WDFDMATRANSACTION DmaTransaction
1165 )
1166{
1169
1173 (PVOID *) &pDmaTrans,
1175
1176 //
1177 // Only valid for packet or system profile transactions.
1178 //
1180 if ((profile != WdfDmaProfilePacket) &&
1185 "Cannot call %!FUNC! on non packet or system "
1186 "profile WDFDMATRANSACTION (%p) (transaction "
1187 "profile is %!WDF_DMA_PROFILE!).",
1189 profile);
1191 return;
1192 }
1193
1194 //
1195 // Only valid if DMA V3 is enabled.
1196 //
1197
1199 {
1201 "Cannot call %!FUNC! on WDFDMATRANSACTION %p "
1202 "because WDFDMAENABLER %p was not configured "
1203 "for DMA version 3",
1207 return;
1208 }
1209
1210 pDmaTrans->ReleaseAdapter();
1211
1212 return;
1213}
1215WDFAPI
1216BOOLEAN
1217NTAPI
1218WDFEXPORT(WdfDmaTransactionCancel)(
1219 __in
1220 PWDF_DRIVER_GLOBALS DriverGlobals,
1221 __in
1222 WDFDMATRANSACTION DmaTransaction
1223 )
1224{
1227
1231 (PVOID *) &pDmaTrans,
1233
1234 //
1235 // Only valid if the enabler uses DMA v3
1236 //
1237
1238 if (pDmaTrans->GetDmaEnabler()->UsesDmaV3() == FALSE) {
1240 "Cannot call %!FUNC! WDFDMATRANSACTION (%p) "
1241 "because enabler is not using DMA version 3",
1244 return FALSE;
1245 }
1246
1248}
1249
1251WDFAPI
1252VOID
1253NTAPI
1254WDFEXPORT(WdfDmaTransactionStopSystemTransfer)(
1255 __in
1256 PWDF_DRIVER_GLOBALS DriverGlobals,
1257 __in
1258 WDFDMATRANSACTION DmaTransaction
1259 )
1260{
1263
1267 (PVOID *) &pDmaTrans,
1269
1270 //
1271 // Verify that the transaction belongs to a system profile enabler.
1272 //
1273
1275 if ((profile != WdfDmaProfileSystem) &&
1278 "Cannot call %!FUNC! on non-system-profile "
1279 "WDFDMATRANSACTION (%p) (transaction profile "
1280 "is %!WDF_DMA_PROFILE!).",
1282 profile);
1284 return;
1285 }
1286
1287 //
1288 // Cast the transaction to the right sub-type now that we've verified the
1289 // profile.
1290 //
1291
1294 return;
1295}
1296
1297
1298
1299} // extern "C"
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
__inline BOOLEAN SupportsChainedMdls(VOID)
BOOLEAN UsesDmaV3(VOID)
__inline WDF_DMA_PROFILE GetProfile(VOID)
__inline WDFDEVICE GetDeviceHandle(VOID)
__inline WDFDMAENABLER GetHandle(VOID)
VOID SetDeviceAddressOffset(__in ULONG Offset)
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in FxDmaEnabler *DmaEnabler, __out WDFDMATRANSACTION *Transaction)
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in FxDmaEnabler *DmaEnabler, __out WDFDMATRANSACTION *Transaction)
static _Must_inspect_result_ NTSTATUS _Create(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in FxDmaEnabler *DmaEnabler, __out WDFDMATRANSACTION *Transaction)
VOID SetConfigureChannelCallback(__in_opt PFN_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL Callback, __in_opt PVOID Context)
VOID SetTransferCompleteCallback(__in_opt PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE Callback, __in_opt PVOID Context)
__forceinline VOID SetMaximumFragmentLength(size_t MaximumFragmentLength)
__forceinline size_t GetCurrentFragmentLength(VOID)
VOID SetImmediateExecution(__in BOOLEAN Value)
__forceinline FxRequest * GetRequest(VOID)
__forceinline VOID SetRequest(__in FxRequest *Request)
VOID ReleaseForReuse(__in BOOLEAN ForceRelease)
__forceinline size_t GetBytesTransferred(VOID)
FxDmaTransactionState GetTransactionState(VOID)
__forceinline FxDmaEnabler * GetDmaEnabler(VOID)
_Must_inspect_result_ NTSTATUS Execute(__in PVOID Context)
VOID GetTransferInfo(__out_opt ULONG *MapRegisterCount, __out_opt ULONG *ScatterGatherElementCount)
_Must_inspect_result_ NTSTATUS Initialize(__in PFN_WDF_PROGRAM_DMA ProgramDmaFunction, __in WDF_DMA_DIRECTION DmaDirection, __in PMDL Mdl, __in size_t Offset, __in ULONG Length)
BOOLEAN CancelResourceAllocation(VOID)
BOOLEAN DmaCompleted(__in size_t TransferredLength, __out NTSTATUS *ReturnStatus, __in FxDmaCompletionType CompletionType)
PIO_STACK_LOCATION GetCurrentIrpStackLocation(VOID)
Definition: fxirpum.cpp:370
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
__inline WDFREQUEST GetHandle(VOID)
FxIrp * GetFxIrp(VOID)
Definition: fxrequest.hpp:957
_Must_inspect_result_ NTSTATUS GetDeviceControlOutputMdl(__out PMDL *pMdl)
_Must_inspect_result_ NTSTATUS GetMdl(__out PMDL *pMdl)
Definition: fxrequestkm.cpp:80
#define __out_opt
Definition: dbghelp.h:65
#define __in
Definition: dbghelp.h:35
#define __in_opt
Definition: dbghelp.h:38
#define __out
Definition: dbghelp.h:62
#define TRACINGDMA
Definition: dbgtrace.h:71
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define __drv_when(cond, annotes)
Definition: driverspecs.h:335
#define __drv_reportError(why)
Definition: driverspecs.h:320
#define __drv_maxIRQL(irql)
Definition: driverspecs.h:291
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
FxVerifierDbgBreakPoint(pFxDriverGlobals)
FxDmaTransactionState
@ FxDmaTransactionStateDeleted
@ FxDmaTransactionStateInvalid
@ FxDmaTransactionStateReleased
@ FxDmaTransactionStateCreated
@ FxDmaCompletionTypeAbort
@ FxDmaCompletionTypePartial
@ FxDmaCompletionTypeFull
MDL * mdl
_Must_inspect_result_ __in WDFDMATRANSACTION DmaTransaction
__in WDFDMATRANSACTION __out_opt ULONG * MapRegisterCount
PIO_STACK_LOCATION stack
__in WDFDMATRANSACTION __in WDF_DMA_DIRECTION __in ULONG __in PFN_WDF_RESERVE_DMA EvtReserveDmaFunction
__in WDFDMATRANSACTION __in_opt PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE DmaCompletionRoutine
__in WDFDMATRANSACTION __in size_t FinalTransferredLength
FxRequest * pReqObj
_Must_inspect_result_ __in WDFDMATRANSACTION __in PFN_WDF_PROGRAM_DMA __in WDF_DMA_DIRECTION __in PMDL Mdl
WDF_DMA_PROFILE profile
__in WDFDMATRANSACTION __in_opt PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE __in_opt PVOID DmaCompletionContext
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), DmaEnabler, FX_TYPE_DMA_ENABLER,(PVOID *) &pDmaEnabler, &pFxDriverGlobals)
_Must_inspect_result_ __in WDFDMATRANSACTION __in WDFREQUEST Request
__in WDFDMATRANSACTION __out_opt ULONG __out_opt ULONG * ScatterGatherElementCount
_Must_inspect_result_ __in WDFDMATRANSACTION __in_opt WDFCONTEXT Context
_Must_inspect_result_ __in WDFDMATRANSACTION __in WDFREQUEST __in PFN_WDF_PROGRAM_DMA __in WDF_DMA_DIRECTION DmaDirection
_Must_inspect_result_ __in WDFDMAENABLER __in_opt WDF_OBJECT_ATTRIBUTES __out WDFDMATRANSACTION * DmaTransactionHandle
ULONG reqLength
return STATUS_SUCCESS
FxRequest * pRequest
__in WDFDMATRANSACTION __in_opt PFN_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL ConfigureRoutine
_Must_inspect_result_ __in WDFDMATRANSACTION __in PFN_WDF_PROGRAM_DMA __in WDF_DMA_DIRECTION __in PMDL __in PVOID VirtualAddress
__in WDFDMATRANSACTION __out NTSTATUS * pStatus
__in WDFDMATRANSACTION __in WDF_DMA_DIRECTION __in ULONG RequiredMapRegisters
FxDmaTransactionBase * pDmaTrans
_Must_inspect_result_ __in WDFDMATRANSACTION __in WDFREQUEST __in PFN_WDF_PROGRAM_DMA EvtProgramDmaFunction
FxDmaEnabler * pDmaEnabler
FxDmaSystemTransaction * systemTransaction
FxObjectHandleGetPtr(pFxDriverGlobals, Request, FX_TYPE_REQUEST,(PVOID *) &pReqObj)
__in WDFDMATRANSACTION __in WDF_DMA_DIRECTION __in ULONG __in PFN_WDF_RESERVE_DMA __in PVOID EvtReserveDmaContext
__in WDFDMATRANSACTION __in_opt PFN_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL __in_opt PVOID ConfigureContext
FxDmaTransactionState state
_Must_inspect_result_ __in WDFDMAENABLER DmaEnabler
__in WDFDMATRANSACTION __in BOOLEAN UseImmediateExecution
_Must_inspect_result_ __in WDFDMAENABLER __in_opt WDF_OBJECT_ATTRIBUTES * Attributes
__in WDFDMATRANSACTION __in size_t TransferredLength
__in WDFDMATRANSACTION __in size_t MaximumLength
_Must_inspect_result_ __in WDFDMATRANSACTION __in PFN_WDF_PROGRAM_DMA __in WDF_DMA_DIRECTION __in PMDL __in size_t Offset
PFX_DRIVER_GLOBALS pFxDriverGlobals
__inline PFX_DRIVER_GLOBALS GetFxDriverGlobals(__in PWDF_DRIVER_GLOBALS DriverGlobals)
Definition: fxglobals.h:597
#define WDFEXPORT(a)
Definition: fxmacros.hpp:157
#define FxPointerNotNull(FxDriverGlobals, Ptr)
Definition: fxmacros.hpp:253
@ FX_TYPE_DMA_TRANSACTION
Definition: fxtypes.h:108
@ FX_TYPE_REQUEST
Definition: fxtypes.h:53
@ FX_TYPE_DMA_ENABLER
Definition: fxtypes.h:107
@ FX_VALIDATE_OPTION_PARENT_NOT_ALLOWED
_Must_inspect_result_ NTSTATUS FxValidateObjectAttributes(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in ULONG Flags=FX_VALIDATE_OPTION_NONE_SPECIFIED)
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
#define _Must_inspect_result_
Definition: no_sal2.h:62
#define METHOD_OUT_DIRECT
Definition: nt_native.h:596
#define METHOD_BUFFERED
Definition: nt_native.h:594
#define METHOD_IN_DIRECT
Definition: nt_native.h:595
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define IRP_MJ_READ
Definition: rdpdr.c:46
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_WRITE
Definition: rdpdr.c:47
#define __success(expr)
Definition: sal_old.h:309
int zero
Definition: sehframes.cpp:29
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
Definition: format.c:80
Definition: ps.c:97
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
uint32_t ULONG_PTR
Definition: typedefs.h:65
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
_Must_inspect_result_ _In_ WDFDMAENABLER DmaEnabler
#define WDF_PTR_GET_OFFSET(_base, _addr)
Definition: wdfcore.h:147
#define WDF_PTR_ADD_OFFSET(_ptr, _offset)
Definition: wdfcore.h:144
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
@ WdfDmaProfileScatterGather
Definition: wdfdmaenabler.h:55
@ WdfDmaProfilePacket
Definition: wdfdmaenabler.h:54
@ WdfDmaProfileScatterGatherDuplex
Definition: wdfdmaenabler.h:58
@ WdfDmaProfileSystem
Definition: wdfdmaenabler.h:60
@ WdfDmaProfileSystemDuplex
Definition: wdfdmaenabler.h:61
@ WdfDmaProfilePacket64
Definition: wdfdmaenabler.h:56
@ WdfDmaProfileScatterGather64Duplex
Definition: wdfdmaenabler.h:59
@ WdfDmaProfileScatterGather64
Definition: wdfdmaenabler.h:57
_In_ WDFDMAENABLER _In_ WDF_DMA_DIRECTION DmaDirection
enum _WDF_DMA_DIRECTION WDF_DMA_DIRECTION
WDF_EXTERN_C_START enum _WDF_DMA_PROFILE WDF_DMA_PROFILE
@ WdfDmaDirectionReadFromDevice
Definition: wdfdmaenabler.h:65
@ WdfDmaDirectionWriteToDevice
Definition: wdfdmaenabler.h:66
_In_ WDFDMATRANSACTION _In_opt_ PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE _In_opt_ PVOID DmaCompletionContext
EVT_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE * PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE
_In_ WDFDMATRANSACTION _In_ size_t FinalTransferredLength
_Must_inspect_result_ _In_ WDFDMAENABLER _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDMATRANSACTION * DmaTransaction
_In_ WDFDMATRANSACTION _In_ WDF_DMA_DIRECTION _In_ ULONG _In_ PFN_WDF_RESERVE_DMA _In_ PVOID EvtReserveDmaContext
_In_ WDFDMATRANSACTION _In_ BOOLEAN UseImmediateExecution
EVT_WDF_PROGRAM_DMA * PFN_WDF_PROGRAM_DMA
_In_ WDFDMATRANSACTION _In_opt_ PFN_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL _In_opt_ PVOID ConfigureContext
EVT_WDF_RESERVE_DMA * PFN_WDF_RESERVE_DMA
_Must_inspect_result_ _In_ WDFDMATRANSACTION _In_ PFN_WDF_PROGRAM_DMA _In_ WDF_DMA_DIRECTION _In_ PMDL _In_ PVOID VirtualAddress
_Must_inspect_result_ _In_ WDFDMATRANSACTION _In_ PFN_WDF_PROGRAM_DMA EvtProgramDmaFunction
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_In_ WDFDMATRANSACTION _In_opt_ PFN_WDF_DMA_TRANSACTION_DMA_TRANSFER_COMPLETE DmaCompletionRoutine
_In_ WDFDMATRANSACTION _In_ size_t MaximumLength
_In_ WDFDMATRANSACTION _In_ WDF_DMA_DIRECTION _In_ ULONG _In_ PFN_WDF_RESERVE_DMA EvtReserveDmaFunction
_In_ WDFDMATRANSACTION _Out_opt_ ULONG * MapRegisterCount
_In_ WDFDMATRANSACTION _In_ WDF_DMA_DIRECTION _In_ ULONG RequiredMapRegisters
_In_ WDFDMATRANSACTION _In_ size_t TransferredLength
EVT_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL * PFN_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL
_In_ WDFDMATRANSACTION _Out_opt_ ULONG _Out_opt_ ULONG * ScatterGatherElementCount
_In_ WDFDMATRANSACTION _In_opt_ PFN_WDF_DMA_TRANSACTION_CONFIGURE_DMA_CHANNEL ConfigureRoutine
#define WDFAPI
Definition: wdftypes.h:53
#define METHOD_FROM_CTL_CODE(ctrlCode)
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define MmGetMdlByteCount(_Mdl)
#define MmGetMdlVirtualAddress(_Mdl)
MDL
Definition: mmtypes.h:117
#define NT_ASSERTMSG
Definition: rtlfuncs.h:3328