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;
55 g_return_val_if_fail(FileObject!=NULL,FALSE);
56 g_return_val_if_fail(FileOffset!=NULL,FALSE);
57 g_return_val_if_fail(Wait==TRUE,FALSE);
58 g_return_val_if_fail(Buffer!=NULL,FALSE);
59 g_return_val_if_fail(IoStatus!=NULL,FALSE);
61 g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: FileObject=%p,FileOffset=0x%llX,Length=0x%lX,Wait=%d",G_STRLOC,
62 FileObject,(guint64)FileOffset->QuadPart,(gulong)Length,(gint)Wait);
64 SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
66 captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,FileOffset->QuadPart,FileOffset->QuadPart+Length);
67 memcpy(Buffer,captive_shared_cache_map_get_buffer(SharedCacheMap)+FileOffset->QuadPart,Length);
69 IoStatus->Status=STATUS_SUCCESS;
70 IoStatus->Information=Length;
78 * @FileObject: Initialized open #FileObject to map.
79 * %NULL value is forbidden.
80 * @FileOffset: The @FileObject file offset from where to map the region from.
81 * Negative value is forbidden.
82 * @Length: Requested length of the region to map from @FileObject.
83 * Value %0 is permitted (no effect of this function call).
84 * @Wait: Whether disk waiting is permitted for this function.
85 * Value %FALSE is currently forbidden by libcaptive as we have no on-demand loading implemented.
86 * @Buffer: Address of memory region with already allocated memory of size @Length.
87 * This address may not be %PAGE_SIZE aligned.
88 * %NULL pointer is forbidden.
90 * Writes the specified region of the given @Buffer to @FileObject.
92 * Returns: %TRUE if the region was successfuly written with @Length bytes.
94 BOOLEAN CcCopyWrite(IN PFILE_OBJECT FileObject,
95 IN PLARGE_INTEGER FileOffset,IN ULONG Length,IN BOOLEAN Wait,IN PVOID Buffer)
97 CaptiveSharedCacheMapObject *SharedCacheMap;
99 g_return_val_if_fail(FileObject!=NULL,FALSE);
100 g_return_val_if_fail(FileOffset!=NULL,FALSE);
101 g_return_val_if_fail(Wait==TRUE,FALSE);
102 g_return_val_if_fail(Buffer!=NULL,FALSE);
104 g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: FileObject=%p,FileOffset=0x%llX,Length=0x%lX,Wait=%d",G_STRLOC,
105 FileObject,(guint64)FileOffset->QuadPart,(gulong)Length,(gint)Wait);
107 g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(FileOffset->QuadPart,PAGE_SIZE)); /* NOT YET IMPLEMENTED */
108 g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING(Length,PAGE_SIZE)); /* NOT YET IMPLEMENTED */
110 SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
112 captive_shared_cache_map_set_data_valid(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length);
113 memcpy(captive_shared_cache_map_get_buffer(SharedCacheMap)+FileOffset->QuadPart,Buffer,Length);
114 captive_shared_cache_map_set_dirty(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length);
120 BOOLEAN CcZeroData(IN PFILE_OBJECT FileObject,IN PLARGE_INTEGER StartOffset,IN PLARGE_INTEGER EndOffset,IN BOOLEAN Wait)
122 CaptiveSharedCacheMapObject *SharedCacheMap;
124 g_return_val_if_fail(FileObject!=NULL,FALSE);
125 g_return_val_if_fail(StartOffset!=NULL,FALSE);
126 g_return_val_if_fail(EndOffset!=NULL,FALSE);
127 g_return_val_if_fail(StartOffset->QuadPart<=EndOffset->QuadPart,FALSE);
128 g_return_val_if_fail((EndOffset->QuadPart-StartOffset->QuadPart)
129 ==(size_t)(EndOffset->QuadPart-StartOffset->QuadPart),FALSE);
130 g_return_val_if_fail(Wait==TRUE,FALSE);
132 g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(StartOffset->QuadPart,PAGE_SIZE)); /* NOT YET IMPLEMENTED */
133 g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(EndOffset->QuadPart,PAGE_SIZE)); /* NOT YET IMPLEMENTED */
135 SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
137 captive_shared_cache_map_set_data_valid(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
138 memset(captive_shared_cache_map_get_buffer(SharedCacheMap)+StartOffset->QuadPart,0,EndOffset->QuadPart-StartOffset->QuadPart);
139 captive_shared_cache_map_set_dirty(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);