2 * reactos Cache Manager (Cc*) CcCopy*() handling of libcaptive
3 * Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; exactly version 2 of June 1991 is required
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "privatebcbpin.h"
23 #include "reactos/ddk/status.h"
24 #include "captive/macros.h"
29 * @FileObject: Initialized open #FileObject to map.
30 * %NULL value is forbidden.
31 * @FileOffset: The @FileObject file offset from where to map the region from.
32 * Negative value is forbidden.
33 * @Length: Requested length of the region to map from @FileObject.
34 * Value %0 is permitted (no effect of this function call).
35 * @Wait: Whether disk waiting is permitted for this function.
36 * Value %FALSE is currently forbidden by libcaptive as we have no on-demand loading implemented.
37 * @Buffer: Address of memory region with already allocated memory of size @Length.
38 * This address may not be %PAGE_SIZE aligned.
39 * %NULL pointer is forbidden.
40 * @IoStatus: #PIO_STATUS_BLOCK to return status of this operation.
41 * %NULL pointer is forbidden.
43 * Reads the specified region of @FileObject to the given @Buffer.
44 * No on-demand loading is in effect.
46 * Returns: %TRUE if the region was successfuly filled with @Length bytes.
47 * @IoStatus.Status initialized by %STATUS_SUCCESS if successful.
48 * @IoStatus.Information initialized by @Length if successful.
50 BOOLEAN CcCopyRead(IN PFILE_OBJECT FileObject,
51 IN PLARGE_INTEGER FileOffset,IN ULONG Length,IN BOOLEAN Wait,OUT PVOID Buffer,OUT PIO_STATUS_BLOCK IoStatus)
53 CaptiveSharedCacheMapObject *SharedCacheMap;
56 g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcCopyRead: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Wait=%d,Buffer=0x%lX",
57 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Wait,(long)Buffer);
59 g_return_val_if_fail(FileObject!=NULL,FALSE);
60 g_return_val_if_fail(FileOffset!=NULL,FALSE);
61 g_return_val_if_fail(Wait==TRUE,FALSE);
62 g_return_val_if_fail(Buffer!=NULL,FALSE);
63 g_return_val_if_fail(IoStatus!=NULL,FALSE);
65 SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
67 captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,FileOffset->QuadPart,FileOffset->QuadPart+Length);
68 memcpy(Buffer,captive_shared_cache_map_get_buffer(SharedCacheMap)+FileOffset->QuadPart,Length);
70 IoStatus->Status=STATUS_SUCCESS;
71 IoStatus->Information=Length;
74 g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcCopyRead: r=%d,IoStatus->Status=0x%lX,IoStatus->Information=0x%lX",
75 r,(!IoStatus ? -1 : (long)IoStatus->Status),(!IoStatus ? -1 : (long)IoStatus->Information));
83 * @FileObject: Initialized open #FileObject to map.
84 * %NULL value is forbidden.
85 * @FileOffset: The @FileObject file offset from where to map the region from.
86 * Negative value is forbidden.
87 * @Length: Requested length of the region to map from @FileObject.
88 * Value %0 is permitted (no effect of this function call).
89 * @Wait: Whether disk waiting is permitted for this function.
90 * Value %FALSE is currently forbidden by libcaptive as we have no on-demand loading implemented.
91 * @Buffer: Address of memory region with already allocated memory of size @Length.
92 * This address may not be %PAGE_SIZE aligned.
93 * %NULL pointer is forbidden.
95 * Writes the specified region of the given @Buffer to @FileObject.
97 * Returns: %TRUE if the region was successfuly written with @Length bytes.
99 BOOLEAN CcCopyWrite(IN PFILE_OBJECT FileObject,
100 IN PLARGE_INTEGER FileOffset,IN ULONG Length,IN BOOLEAN Wait,IN PVOID Buffer)
102 CaptiveSharedCacheMapObject *SharedCacheMap;
105 g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcCopyWrite: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Wait=%d,Buffer=0x%lX",
106 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Wait,(long)Buffer);
108 g_return_val_if_fail(FileObject!=NULL,FALSE);
109 g_return_val_if_fail(FileOffset!=NULL,FALSE);
110 g_return_val_if_fail(Wait==TRUE,FALSE);
111 g_return_val_if_fail(Buffer!=NULL,FALSE);
113 /* 'FileOffset' may not be PAGE_SIZE aligned */
114 /* 'Length' may not be PAGE_SIZE aligned */
116 SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
118 captive_shared_cache_map_set_data_valid(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length);
119 captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,FileOffset->QuadPart,FileOffset->QuadPart+Length);
120 memcpy(captive_shared_cache_map_get_buffer(SharedCacheMap)+FileOffset->QuadPart,Buffer,Length);
121 captive_shared_cache_map_set_dirty(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length);
124 g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcCopyWrite: r=%d",r);
130 BOOLEAN CcZeroData(IN PFILE_OBJECT FileObject,IN PLARGE_INTEGER StartOffset,IN PLARGE_INTEGER EndOffset,IN BOOLEAN Wait)
132 CaptiveSharedCacheMapObject *SharedCacheMap,*SharedCacheMap_orig;
135 g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcZeroData: FileObject=0x%lX,StartOffset=0x%lX,EndOffset=0x%lX,Wait=%d",
137 (!StartOffset ? -1 : (long)StartOffset->QuadPart),
138 (!EndOffset ? -1 : (long)EndOffset->QuadPart),
141 g_return_val_if_fail(FileObject!=NULL,FALSE);
142 g_return_val_if_fail(StartOffset!=NULL,FALSE);
143 g_return_val_if_fail(EndOffset!=NULL,FALSE);
144 g_return_val_if_fail(StartOffset->QuadPart<=EndOffset->QuadPart,FALSE);
145 g_return_val_if_fail((EndOffset->QuadPart-StartOffset->QuadPart)
146 ==(size_t)(EndOffset->QuadPart-StartOffset->QuadPart),FALSE);
147 /* 'Wait' may be FALSE; used by ext2fsd.sys-v0.10a. */
149 /* 'StartOffset' may not be PAGE_SIZE aligned */
150 /* 'EndOffset' may not be PAGE_SIZE aligned */
152 g_assert(FileObject->SectionObjectPointer);
153 if ((SharedCacheMap_orig=FileObject->SectionObjectPointer->SharedCacheMap))
154 SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
156 CC_FILE_SIZES FileSizes;
157 static const CACHE_MANAGER_CALLBACKS CallBacks;
159 /* ext2fsd.sys-v0.10a calls us on non-SharedCacheMapped object: */
160 FileSizes.AllocationSize=*EndOffset;
161 FileSizes.FileSize=*EndOffset;
162 FileSizes.ValidDataLength=*EndOffset;
163 SharedCacheMap=captive_shared_cache_map_get_ref(
164 FileObject, /* FileObject */
165 &FileSizes, /* FileSizes */
166 FALSE, /* PinAccess */
167 &CallBacks, /* CallBacks */
168 NULL); /* LazyWriterContext */
171 captive_shared_cache_map_set_data_valid(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
173 captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,StartOffset->QuadPart,EndOffset->QuadPart);
175 captive_shared_cache_map_data_validate_noread(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
177 memset(captive_shared_cache_map_get_buffer(SharedCacheMap)+StartOffset->QuadPart,0,EndOffset->QuadPart-StartOffset->QuadPart);
178 captive_shared_cache_map_set_dirty(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
181 if (!SharedCacheMap_orig) {
182 captive_shared_cache_map_flush(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
183 g_object_unref(SharedCacheMap);
184 /* FIXME: Undo captive_shared_cache_map_get_ref:'Currently we never close it.' */
185 g_object_unref(SharedCacheMap);
188 g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcZeroData: r=%d",r);