Synchronize up to trunk's revision r57689.
[reactos.git] / ntoskrnl / cc / mdl.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/cc/fs.c
5 * PURPOSE: Implements MDL Cache Manager Functions
6 *
7 * PROGRAMMERS: Alex Ionescu
8 */
9
10 /* INCLUDES ******************************************************************/
11
12 #include <ntoskrnl.h>
13 #define NDEBUG
14 #include <debug.h>
15
16 /* FUNCTIONS *****************************************************************/
17
18 /*
19 * @implemented
20 */
21 VOID
22 NTAPI
23 CcMdlRead(
24 IN PFILE_OBJECT FileObject,
25 IN PLARGE_INTEGER FileOffset,
26 IN ULONG Length,
27 OUT PMDL * MdlChain,
28 OUT PIO_STATUS_BLOCK IoStatus
29 )
30 {
31 UNIMPLEMENTED;
32 }
33
34 /*
35 * NAME INTERNAL
36 * CcMdlReadComplete2@8
37 *
38 * DESCRIPTION
39 *
40 * ARGUMENTS
41 * MdlChain
42 * DeviceObject
43 *
44 * RETURN VALUE
45 * None.
46 *
47 * NOTE
48 * Used by CcMdlReadComplete@8 and FsRtl
49 *
50 */
51 VOID
52 NTAPI
53 CcMdlReadComplete2(IN PMDL MemoryDescriptorList,
54 IN PFILE_OBJECT FileObject)
55 {
56 PMDL Mdl;
57
58 /* Free MDLs */
59 while ((Mdl = MemoryDescriptorList))
60 {
61 MemoryDescriptorList = Mdl->Next;
62 MmUnlockPages(Mdl);
63 IoFreeMdl(Mdl);
64 }
65 }
66
67 /*
68 * NAME EXPORTED
69 * CcMdlReadComplete@8
70 *
71 * DESCRIPTION
72 *
73 * ARGUMENTS
74 *
75 * RETURN VALUE
76 * None.
77 *
78 * NOTE
79 * From Bo Branten's ntifs.h v13.
80 *
81 * @implemented
82 */
83 VOID
84 NTAPI
85 CcMdlReadComplete(IN PFILE_OBJECT FileObject,
86 IN PMDL MdlChain)
87 {
88 PDEVICE_OBJECT DeviceObject = NULL;
89 PFAST_IO_DISPATCH FastDispatch;
90
91 /* Get Fast Dispatch Data */
92 DeviceObject = IoGetRelatedDeviceObject(FileObject);
93 FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
94
95 /* Check if we support Fast Calls, and check this one */
96 if (FastDispatch && FastDispatch->MdlReadComplete)
97 {
98 /* Use the fast path */
99 FastDispatch->MdlReadComplete(FileObject,
100 MdlChain,
101 DeviceObject);
102 }
103
104 /* Use slow path */
105 CcMdlReadComplete2(MdlChain, FileObject);
106 }
107
108 /*
109 * @implemented
110 */
111 VOID
112 NTAPI
113 CcMdlWriteComplete(IN PFILE_OBJECT FileObject,
114 IN PLARGE_INTEGER FileOffset,
115 IN PMDL MdlChain)
116 {
117 PDEVICE_OBJECT DeviceObject = NULL;
118 PFAST_IO_DISPATCH FastDispatch;
119
120 /* Get Fast Dispatch Data */
121 DeviceObject = IoGetRelatedDeviceObject(FileObject);
122 FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
123
124 /* Check if we support Fast Calls, and check this one */
125 if (FastDispatch && FastDispatch->MdlWriteComplete)
126 {
127 /* Use the fast path */
128 FastDispatch->MdlWriteComplete(FileObject,
129 FileOffset,
130 MdlChain,
131 DeviceObject);
132 }
133
134 /* Use slow path */
135 CcMdlWriteComplete2(FileObject,FileOffset, MdlChain);
136 }
137
138 VOID
139 NTAPI
140 CcMdlWriteComplete2(
141 IN PFILE_OBJECT FileObject,
142 IN PLARGE_INTEGER FileOffset,
143 IN PMDL MdlChain
144 )
145 {
146 UNIMPLEMENTED;
147 }
148
149 /*
150 * @unimplemented
151 */
152 VOID
153 NTAPI
154 CcMdlWriteAbort (
155 IN PFILE_OBJECT FileObject,
156 IN PMDL MdlChain
157 )
158 {
159 UNIMPLEMENTED;
160 }
161
162 /*
163 * @unimplemented
164 */
165 VOID
166 NTAPI
167 CcPrepareMdlWrite (
168 IN PFILE_OBJECT FileObject,
169 IN PLARGE_INTEGER FileOffset,
170 IN ULONG Length,
171 OUT PMDL * MdlChain,
172 OUT PIO_STATUS_BLOCK IoStatus
173 )
174 {
175 UNIMPLEMENTED;
176 }