+Trace dumps compatible with TraceFS.
[captive.git] / src / libcaptive / cc / copy.c
1 /* $Id$
2  * reactos Cache Manager (Cc*) CcCopy*() handling of libcaptive
3  * Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
4  * 
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
8  * 
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.
13  * 
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
17  */
18
19
20 #include "config.h"
21
22 #include "privatebcbpin.h"
23 #include "reactos/ddk/status.h"
24 #include "captive/macros.h"
25
26
27 /**
28  * CcCopyRead:
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.
42  *
43  * Reads the specified region of @FileObject to the given @Buffer.
44  * No on-demand loading is in effect.
45  *
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.
49  */
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)
52 {
53 CaptiveSharedCacheMapObject *SharedCacheMap;
54
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);
60
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);
63
64         SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
65
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);
68
69         IoStatus->Status=STATUS_SUCCESS;
70         IoStatus->Information=Length;
71
72         return TRUE;
73 }
74
75
76 /**
77  * CcCopyWrite:
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.
89  *
90  * Writes the specified region of the given @Buffer to @FileObject.
91  *
92  * Returns: %TRUE if the region was successfuly written with @Length bytes.
93  */
94 BOOLEAN CcCopyWrite(IN PFILE_OBJECT FileObject,
95                 IN PLARGE_INTEGER FileOffset,IN ULONG Length,IN BOOLEAN Wait,IN PVOID Buffer)
96 {
97 CaptiveSharedCacheMapObject *SharedCacheMap;
98
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);
103
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);
106
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 */
109
110         SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
111
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);
115
116         return TRUE;
117 }
118
119
120 BOOLEAN CcZeroData(IN PFILE_OBJECT FileObject,IN PLARGE_INTEGER StartOffset,IN PLARGE_INTEGER EndOffset,IN BOOLEAN Wait)
121 {
122 CaptiveSharedCacheMapObject *SharedCacheMap;
123
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);
131
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 */
134
135         SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
136
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);
140
141         return TRUE;
142 }