2 * Debugging tracer of IRPs and Cc* (Cache Manager) calls for W32
\r
3 * Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
\r
5 * This program is free software; you can redistribute it and/or modify
\r
6 * it under the terms of the GNU General Public License as published by
\r
7 * the Free Software Foundation; exactly version 2 of June 1991 is required
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License
\r
15 * along with this program; if not, write to the Free Software
\r
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
22 #define CACHE_SIZE 0x200
\r
25 #define G_N_ELEMENTS(arr) (sizeof(arr)/sizeof((arr)[0]))
\r
27 NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath);
\r
30 #pragma alloc_text (INIT, DriverEntry)
\r
33 static FAST_MUTEX lock_mutex;
\r
35 static void lock_init(void)
\r
37 ExInitializeFastMutex(&lock_mutex);
\r
40 static void lock(void)
\r
42 ExAcquireFastMutex(&lock_mutex);
\r
45 static void unlock(void)
\r
47 ExReleaseFastMutex(&lock_mutex);
\r
50 #define DBGPREFIX "TraceFS(0x%08lX/0x%08lX): "
\r
51 #define DBGARG PsGetCurrentProcess(),PsGetCurrentThread()
\r
53 static int dbgindent=0;
\r
55 /* lock() will protect dbg_unicode_string() static buffer. */
\r
56 #define DBGSINGLE6(fmt,arg1,arg2,arg3,arg4,arg5,arg6) \
\r
57 do { lock(); DbgPrint("%*s" DBGPREFIX fmt "\n",dbgindent,"",DBGARG,arg1,arg2,arg3,arg4,arg5,arg6); unlock(); } while (0)
\r
58 #define DBGSINGLE5(fmt,arg1,arg2,arg3,arg4,arg5) DBGSINGLE6(fmt,arg1,arg2,arg3,arg4,arg5,0)
\r
59 #define DBGSINGLE4(fmt,arg1,arg2,arg3,arg4) DBGSINGLE5(fmt,arg1,arg2,arg3,arg4,0)
\r
60 #define DBGSINGLE3(fmt,arg1,arg2,arg3) DBGSINGLE4(fmt,arg1,arg2,arg3,0)
\r
61 #define DBGSINGLE2(fmt,arg1,arg2) DBGSINGLE3(fmt,arg1,arg2,0)
\r
62 #define DBGSINGLE1(fmt,arg1) DBGSINGLE2(fmt,arg1,0)
\r
63 #define DBGSINGLE0(fmt) DBGSINGLE1(fmt,0)
\r
64 #define DBGSINGLEENTER6(fmt,arg1,arg2,arg3,arg4,arg5,arg6) \
\r
65 do { DBGSINGLE6("enter: " fmt,arg1,arg2,arg3,arg4,arg5,arg6); dbgindent++; } while (0)
\r
66 #define DBGSINGLEENTER5(fmt,arg1,arg2,arg3,arg4,arg5) DBGSINGLEENTER6(fmt,arg1,arg2,arg3,arg4,arg5,0)
\r
67 #define DBGSINGLEENTER4(fmt,arg1,arg2,arg3,arg4) DBGSINGLEENTER5(fmt,arg1,arg2,arg3,arg4,0)
\r
68 #define DBGSINGLEENTER3(fmt,arg1,arg2,arg3) DBGSINGLEENTER4(fmt,arg1,arg2,arg3,0)
\r
69 #define DBGSINGLEENTER2(fmt,arg1,arg2) DBGSINGLEENTER3(fmt,arg1,arg2,0)
\r
70 #define DBGSINGLEENTER1(fmt,arg1) DBGSINGLEENTER2(fmt,arg1,0)
\r
71 #define DBGSINGLEENTER0(fmt) DBGSINGLEENTER1(fmt,0)
\r
72 #define DBGSINGLELEAVE3(fmt,arg1,arg2,arg3) \
\r
73 do { dbgindent--; DBGSINGLE3("leave: " fmt,arg1,arg2,arg3); } while (0)
\r
74 #define DBGSINGLELEAVE2(fmt,arg1,arg2) DBGSINGLELEAVE3(fmt,arg1,arg2,0)
\r
75 #define DBGSINGLELEAVE1(fmt,arg1) DBGSINGLELEAVE2(fmt,arg1,0)
\r
76 #define DBGSINGLELEAVE0(fmt) DBGSINGLELEAVE1(fmt,0)
\r
79 /* We cannot use DbgPrint("%wZ",...) as it must have IRQL PASSIVE_LEVEL which
\r
82 static const char *dbg_unicode_string(UNICODE_STRING *unicode_string)
\r
84 static char buf[0x100];
\r
88 if (!unicode_string || !unicode_string->Buffer)
\r
92 for (s=unicode_string->Buffer;s<unicode_string->Buffer+(unicode_string->Length/2);s++) {
\r
93 if (d>=buf+sizeof(buf)-4)
\r
102 NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
\r
105 DEVICE_OBJECT *device_object;
\r
109 DBGSINGLEENTER1("DriverEntry: RegistryPath=%s",dbg_unicode_string(RegistryPath));
\r
110 DBGSINGLE1("DriverEntry: %s","$Id$");
\r
112 DriverObject, /* DriverObject */
\r
113 0, /* DeviceExtensionSize */
\r
114 NULL, /* DeviceName; optional */
\r
115 FILE_DEVICE_UNKNOWN, /* DeviceType */
\r
116 0, /* DeviceCharacteristics */
\r
117 FALSE, /* Exclusive */
\r
118 &device_object); /* DeviceObject */
\r
119 DBGSINGLELEAVE1("DriverEntry: r=0x%lX",(long)r);
\r
123 static const char *const irp_mj_dump_FILE_SYSTEM_CONTROL_MinorFunction_names[]={
\r
124 "IRP_MN_USER_FS_REQUEST",
\r
125 "IRP_MN_MOUNT_VOLUME",
\r
126 "IRP_MN_VERIFY_VOLUME",
\r
127 "IRP_MN_LOAD_FILE_SYSTEM",
\r
128 "IRP_MN_KERNEL_CALL",
\r
131 /* Compatibility with DDK; the structures match. */
\r
132 #define FileSystemControl DeviceIoControl
\r
133 #define FsControlCode IoControlCode
\r
134 #ifndef FSCTL_REQUEST_BATCH_OPLOCK
\r
135 #define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2,METHOD_BUFFERED,FILE_ANY_ACCESS)
\r
137 #ifndef FSCTL_LOCK_VOLUME
\r
138 #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6,METHOD_BUFFERED,FILE_ANY_ACCESS)
\r
140 #ifndef FSCTL_UNLOCK_VOLUME
\r
141 #define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7,METHOD_BUFFERED,FILE_ANY_ACCESS)
\r
143 #ifndef FSCTL_DISMOUNT_VOLUME
\r
144 #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8,METHOD_BUFFERED,FILE_ANY_ACCESS)
\r
146 #ifndef FSCTL_MARK_VOLUME_DIRTY
\r
147 #define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,12,METHOD_BUFFERED,FILE_ANY_ACCESS)
\r
149 #ifndef FSCTL_INVALIDATE_VOLUMES
\r
150 #define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,21,METHOD_BUFFERED,FILE_ANY_ACCESS)
\r
152 #ifndef FSCTL_IS_VOLUME_DIRTY
\r
153 #define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,30,METHOD_BUFFERED,FILE_ANY_ACCESS)
\r
155 #ifndef FSCTL_FILE_PREFETCH
\r
156 #define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM,72,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
\r
159 static void irp_mj_dump(struct _DEVICE_OBJECT *DeviceObject,struct _IRP *Irp)
\r
161 IO_STACK_LOCATION *IoStackLocation;
\r
162 FILE_OBJECT *FileObject;
\r
165 DBGSINGLE0("Irp==NULL");
\r
168 IoStackLocation=IoGetCurrentIrpStackLocation(Irp);
\r
169 if (!IoStackLocation) {
\r
170 DBGSINGLE0("IoStackLocation==NULL");
\r
173 if (!(FileObject=IoStackLocation->FileObject))
\r
174 DBGSINGLE0("FileObject=NULL");
\r
176 DBGSINGLE5("FileObject=0x%lX: FileName=%s,Flags=0x%lX,SectionObjectPointer=0x%lX,->SharedCacheMap=0x%lX",
\r
178 dbg_unicode_string(&FileObject->FileName),FileObject->Flags,
\r
179 (long)FileObject->SectionObjectPointer,
\r
180 (!FileObject->SectionObjectPointer ? -1 : (long)FileObject->SectionObjectPointer->SharedCacheMap));
\r
181 switch (IoStackLocation->MajorFunction) {
\r
183 DBGSINGLE2("READ: ByteOffset=0x%lX,Length=0x%lX",
\r
184 (long)IoStackLocation->Parameters.Read.ByteOffset.QuadPart,
\r
185 IoStackLocation->Parameters.Read.Length);
\r
188 DBGSINGLE2("WRITE: ByteOffset=0x%lX,Length=0x%lX",
\r
189 (long)IoStackLocation->Parameters.Write.ByteOffset.QuadPart,
\r
190 IoStackLocation->Parameters.Write.Length);
\r
192 case IRP_MJ_FILE_SYSTEM_CONTROL:
\r
193 DBGSINGLE2("FILE_SYSTEM_CONTROL: MinorFunction=%s (%d)",
\r
195 && IoStackLocation->MinorFunction>=0
\r
196 && IoStackLocation->MinorFunction<G_N_ELEMENTS(irp_mj_dump_FILE_SYSTEM_CONTROL_MinorFunction_names))
\r
197 ? irp_mj_dump_FILE_SYSTEM_CONTROL_MinorFunction_names[IoStackLocation->MinorFunction] : "???"),
\r
198 IoStackLocation->MinorFunction);
\r
199 switch (IoStackLocation->MinorFunction) {
\r
200 case IRP_MN_USER_FS_REQUEST: {
\r
201 const char *FsControlCode_name;
\r
202 switch (IoStackLocation->Parameters.FileSystemControl.FsControlCode) {
\r
203 case FSCTL_REQUEST_BATCH_OPLOCK: FsControlCode_name="FSCTL_REQUEST_BATCH_OPLOCK"; break;
\r
204 case FSCTL_LOCK_VOLUME: FsControlCode_name="FSCTL_LOCK_VOLUME"; break;
\r
205 case FSCTL_UNLOCK_VOLUME: FsControlCode_name="FSCTL_UNLOCK_VOLUME"; break;
\r
206 case FSCTL_DISMOUNT_VOLUME: FsControlCode_name="FSCTL_DISMOUNT_VOLUME"; break;
\r
207 case FSCTL_MARK_VOLUME_DIRTY: FsControlCode_name="FSCTL_MARK_VOLUME_DIRTY"; break;
\r
208 case FSCTL_INVALIDATE_VOLUMES: FsControlCode_name="FSCTL_INVALIDATE_VOLUMES"; break;
\r
209 case FSCTL_IS_VOLUME_DIRTY: FsControlCode_name="FSCTL_IS_VOLUME_DIRTY"; break;
\r
210 case FSCTL_FILE_PREFETCH: FsControlCode_name="FSCTL_FILE_PREFETCH"; break;
\r
211 default: FsControlCode_name="???"; break;
\r
213 DBGSINGLE2("USER_FS_REQUEST: FsControlCode=%s (%d)",FsControlCode_name,
\r
214 IoStackLocation->Parameters.FileSystemControl.FsControlCode);
\r
220 #define TRACEFS_MAJORS \
\r
221 TRACEFS_MAJOR(IRP_MJ_CREATE) \
\r
222 TRACEFS_MAJOR(IRP_MJ_CREATE_NAMED_PIPE) \
\r
223 TRACEFS_MAJOR(IRP_MJ_CLOSE) \
\r
224 TRACEFS_MAJOR(IRP_MJ_READ) \
\r
225 TRACEFS_MAJOR(IRP_MJ_WRITE) \
\r
226 TRACEFS_MAJOR(IRP_MJ_QUERY_INFORMATION) \
\r
227 TRACEFS_MAJOR(IRP_MJ_SET_INFORMATION) \
\r
228 TRACEFS_MAJOR(IRP_MJ_QUERY_EA) \
\r
229 TRACEFS_MAJOR(IRP_MJ_SET_EA) \
\r
230 TRACEFS_MAJOR(IRP_MJ_FLUSH_BUFFERS) \
\r
231 TRACEFS_MAJOR(IRP_MJ_QUERY_VOLUME_INFORMATION) \
\r
232 TRACEFS_MAJOR(IRP_MJ_SET_VOLUME_INFORMATION) \
\r
233 TRACEFS_MAJOR(IRP_MJ_DIRECTORY_CONTROL) \
\r
234 TRACEFS_MAJOR(IRP_MJ_FILE_SYSTEM_CONTROL) \
\r
235 TRACEFS_MAJOR(IRP_MJ_DEVICE_CONTROL) \
\r
236 TRACEFS_MAJOR(IRP_MJ_INTERNAL_DEVICE_CONTROL) \
\r
237 TRACEFS_MAJOR(IRP_MJ_SHUTDOWN) \
\r
238 TRACEFS_MAJOR(IRP_MJ_LOCK_CONTROL) \
\r
239 TRACEFS_MAJOR(IRP_MJ_CLEANUP) \
\r
240 TRACEFS_MAJOR(IRP_MJ_CREATE_MAILSLOT) \
\r
241 TRACEFS_MAJOR(IRP_MJ_QUERY_SECURITY) \
\r
242 TRACEFS_MAJOR(IRP_MJ_SET_SECURITY) \
\r
243 TRACEFS_MAJOR(IRP_MJ_POWER) \
\r
244 TRACEFS_MAJOR(IRP_MJ_SYSTEM_CONTROL) \
\r
245 TRACEFS_MAJOR(IRP_MJ_DEVICE_CHANGE) \
\r
246 TRACEFS_MAJOR(IRP_MJ_QUERY_QUOTA) \
\r
247 TRACEFS_MAJOR(IRP_MJ_SET_QUOTA) \
\r
248 TRACEFS_MAJOR(IRP_MJ_PNP)
\r
251 #define TRACEFS_MAJOR(irp_mj_name) \
\r
252 static NTSTATUS (*tracefs_major_##irp_mj_name##_orig)(IN struct _DEVICE_OBJECT *DeviceObject,IN struct _IRP *Irp); \
\r
253 static NTSTATUS tracefs_major_##irp_mj_name(IN struct _DEVICE_OBJECT *DeviceObject,IN struct _IRP *Irp) \
\r
257 DBGSINGLEENTER0( #irp_mj_name ); \
\r
258 irp_mj_dump(DeviceObject,Irp); \
\r
259 r=(*tracefs_major_##irp_mj_name##_orig)(DeviceObject,Irp); \
\r
260 DBGSINGLELEAVE1( #irp_mj_name ": r=0x%lX",(long)r); \
\r
266 #undef TRACEFS_MAJOR
\r
269 VOID IoRegisterFileSystem(IN OUT PDEVICE_OBJECT DeviceObject);
\r
270 VOID ToRegisterFileSystem(IN OUT PDEVICE_OBJECT DeviceObject)
\r
272 DBGSINGLEENTER0("IoRegisterFileSystem");
\r
274 #define TRACEFS_MAJOR(irp_mj_name) do { \
\r
275 tracefs_major_##irp_mj_name##_orig=DeviceObject->DriverObject->MajorFunction[irp_mj_name]; \
\r
276 DeviceObject->DriverObject->MajorFunction[irp_mj_name]=tracefs_major_##irp_mj_name; \
\r
281 #undef TRACEFS_MAJOR
\r
283 IoRegisterFileSystem(DeviceObject);
\r
284 DBGSINGLELEAVE0("IoRegisterFileSystem");
\r
288 static char PsCreateSystemThread_bogusthread;
\r
290 NTSTATUS TsCreateSystemThread(
\r
291 OUT PHANDLE ThreadHandle,
\r
292 IN ULONG DesiredAccess,
\r
293 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
\r
294 IN HANDLE ProcessHandle OPTIONAL,
\r
295 OUT PCLIENT_ID ClientId OPTIONAL,
\r
296 IN PKSTART_ROUTINE StartRoutine,
\r
297 IN PVOID StartContext
\r
300 DBGSINGLEENTER1("PsCreateSystemThread: StartRoutine=0x%lX",(long)StartRoutine);
\r
302 *ThreadHandle=(HANDLE)&PsCreateSystemThread_bogusthread;
\r
303 DBGSINGLELEAVE0("PsCreateSystemThread");
\r
304 return STATUS_SUCCESS;
\r
313 DBGSINGLEENTER0("ZwClose");
\r
314 if (Handle==(HANDLE)&PsCreateSystemThread_bogusthread) {
\r
315 DBGSINGLELEAVE0("ZwClose: bogusthread catched");
\r
316 return STATUS_SUCCESS;
\r
318 DBGSINGLELEAVE0("ZwClose: passed");
\r
319 return ZwClose(Handle);
\r
325 IN PFILE_OBJECT FileObject,
\r
326 IN ULONG BytesToWrite,
\r
328 IN BOOLEAN Retrying
\r
332 IN PFILE_OBJECT FileObject,
\r
333 IN ULONG BytesToWrite,
\r
335 IN BOOLEAN Retrying
\r
340 DBGSINGLEENTER4("CcCanIWrite: FileObject=0x%lX,BytesToWrite=0x%lX,Wait=%d,Retrying=%d",
\r
341 (long)FileObject,BytesToWrite,Wait,Retrying);
\r
348 DBGSINGLELEAVE1("CcCanIWrite: r=%d",r);
\r
354 IN PFILE_OBJECT FileObject,
\r
355 IN PLARGE_INTEGER FileOffset,
\r
359 OUT PIO_STATUS_BLOCK IoStatus
\r
363 IN PFILE_OBJECT FileObject,
\r
364 IN PLARGE_INTEGER FileOffset,
\r
368 OUT PIO_STATUS_BLOCK IoStatus
\r
373 DBGSINGLEENTER5("CcCopyRead: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Wait=%d,Buffer=0x%lX",
\r
374 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Wait,(long)Buffer);
\r
383 DBGSINGLELEAVE3("CcCopyRead: r=%d,IoStatus->Status=0x%lX,IoStatus->Information=0x%lX",
\r
384 r,(!IoStatus ? -1 : (long)IoStatus->Status),(!IoStatus ? -1 : (long)IoStatus->Information));
\r
390 IN PFILE_OBJECT FileObject,
\r
391 IN PLARGE_INTEGER FileOffset,
\r
398 IN PFILE_OBJECT FileObject,
\r
399 IN PLARGE_INTEGER FileOffset,
\r
407 DBGSINGLEENTER5("CcCopyWrite: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Wait=%d,Buffer=0x%lX",
\r
408 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Wait,(long)Buffer);
\r
416 DBGSINGLELEAVE1("CcCopyWrite: r=%d",r);
\r
421 VOID (*PCC_POST_DEFERRED_WRITE) (
\r
427 IN PFILE_OBJECT FileObject,
\r
428 IN PCC_POST_DEFERRED_WRITE PostRoutine,
\r
431 IN ULONG BytesToWrite,
\r
432 IN BOOLEAN Retrying
\r
435 IN PFILE_OBJECT FileObject,
\r
436 IN PCC_POST_DEFERRED_WRITE PostRoutine,
\r
439 IN ULONG BytesToWrite,
\r
440 IN BOOLEAN Retrying
\r
443 DBGSINGLEENTER6("CcDeferWrite: FileObject=0x%lX,PostRoutine=0x%lX,Context1=0x%lX,Context2=0x%lX,"
\r
444 "BytesToWrite=0x%lX,Retrying=%d",
\r
445 (long)FileObject,(long)PostRoutine,(long)Context1,(long)Context2,
\r
446 BytesToWrite,Retrying);
\r
455 DBGSINGLELEAVE0("CcDeferWrite");
\r
460 IN PFILE_OBJECT FileObject,
\r
461 IN ULONG FileOffset,
\r
463 IN ULONG PageCount,
\r
465 OUT PIO_STATUS_BLOCK IoStatus
\r
469 IN PFILE_OBJECT FileObject,
\r
470 IN ULONG FileOffset,
\r
472 IN ULONG PageCount,
\r
474 OUT PIO_STATUS_BLOCK IoStatus
\r
477 DBGSINGLEENTER5("CcFastCopyRead: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,PageCount=0x%lX,Buffer=0x%lX",
\r
478 (long)FileObject,FileOffset,Length,PageCount,(long)Buffer);
\r
487 DBGSINGLELEAVE2("CcFastCopyRead: IoStatus->Status=0x%lX,IoStatus->Information=0x%lX",
\r
488 (!IoStatus ? -1 : (long)IoStatus->Status),(!IoStatus ? -1 : (long)IoStatus->Information));
\r
493 IN PFILE_OBJECT FileObject,
\r
494 IN ULONG FileOffset,
\r
500 IN PFILE_OBJECT FileObject,
\r
501 IN ULONG FileOffset,
\r
506 DBGSINGLEENTER4("CcFastCopyWrite: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Buffer=0x%lX",
\r
507 (long)FileObject,FileOffset,Length,(long)Buffer);
\r
514 DBGSINGLELEAVE0("CcFastCopyWrite");
\r
519 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
\r
520 IN PLARGE_INTEGER FileOffset OPTIONAL,
\r
522 OUT PIO_STATUS_BLOCK IoStatus OPTIONAL
\r
526 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
\r
527 IN PLARGE_INTEGER FileOffset OPTIONAL,
\r
529 OUT PIO_STATUS_BLOCK IoStatus OPTIONAL
\r
532 DBGSINGLEENTER4("CcFlushCache: SectionObjectPointer=0x%lX,->SharedCacheMap=0x%lX,FileOffset=0x%lX,Length=0x%lX",
\r
533 (long)SectionObjectPointer,
\r
534 (!SectionObjectPointer ? -1 : (long)SectionObjectPointer->SharedCacheMap),
\r
535 (!FileOffset ? -1 : (long)FileOffset->QuadPart),Length);
\r
537 SectionObjectPointer,
\r
542 DBGSINGLELEAVE2("CcFlushCache: IoStatus->Status=0x%lX,IoStatus->Information=0x%lX",
\r
543 (!IoStatus ? -1 : (long)IoStatus->Status),(!IoStatus ? -1 : (long)IoStatus->Information));
\r
547 VOID (*PDIRTY_PAGE_ROUTINE) (
\r
548 IN PFILE_OBJECT FileObject,
\r
549 IN PLARGE_INTEGER FileOffset,
\r
551 IN PLARGE_INTEGER OldestLsn,
\r
552 IN PLARGE_INTEGER NewestLsn,
\r
557 static PDIRTY_PAGE_ROUTINE TcGetDirtyPages_DirtyPageRoutine_orig;
\r
558 static BOOLEAN TcGetDirtyPages_DirtyPageRoutine_used=FALSE;
\r
560 static VOID TcGetDirtyPages_DirtyPageRoutine(IN PFILE_OBJECT FileObject,IN PLARGE_INTEGER FileOffset,IN ULONG Length,
\r
561 IN PLARGE_INTEGER OldestLsn,IN PLARGE_INTEGER NewestLsn,IN PVOID Context1,IN PVOID Context2)
\r
563 DBGSINGLEENTER5("DirtyPageRoutine: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,"
\r
564 "OldestLsn=0x%lX,NewestLsn=0x%lX,Context1,Context2",
\r
565 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,
\r
566 (!OldestLsn ? -1 : (long)OldestLsn->QuadPart),(!NewestLsn ? -1 : (long)NewestLsn->QuadPart));
\r
567 (*TcGetDirtyPages_DirtyPageRoutine_orig)(FileObject,FileOffset,Length,OldestLsn,NewestLsn,Context1,Context2);
\r
568 DBGSINGLELEAVE0("DirtyPageRoutine");
\r
573 IN PVOID LogHandle,
\r
574 IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine,
\r
580 IN PVOID LogHandle,
\r
581 IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine,
\r
588 DBGSINGLEENTER4("CcGetDirtyPages: LogHandle=0x%lX,DirtyPageRoutine=0x%lX,Context1=0x%lX,Context2=0x%lX",
\r
589 (long)LogHandle,(long)DirtyPageRoutine,(long)Context1,(long)Context2);
\r
590 if (TcGetDirtyPages_DirtyPageRoutine_used)
\r
591 DBGSINGLE0("CcGetDirtyPages: ERROR: TcGetDirtyPages_DirtyPageRoutine_used");
\r
593 TcGetDirtyPages_DirtyPageRoutine_used=TRUE;
\r
594 TcGetDirtyPages_DirtyPageRoutine_orig=DirtyPageRoutine;
\r
595 DirtyPageRoutine=TcGetDirtyPages_DirtyPageRoutine;
\r
597 r=CcGetDirtyPages (
\r
603 if (DirtyPageRoutine==TcGetDirtyPages_DirtyPageRoutine)
\r
604 TcGetDirtyPages_DirtyPageRoutine_used=FALSE;
\r
605 DBGSINGLELEAVE1("CcGetDirtyPages: r=0x%lX",(long)r.QuadPart);
\r
609 typedef BOOLEAN (*PACQUIRE_FOR_LAZY_WRITE)(IN PVOID Context,IN BOOLEAN Wait);
\r
610 typedef VOID (*PRELEASE_FROM_LAZY_WRITE)(IN PVOID Context);
\r
611 typedef BOOLEAN (*PACQUIRE_FOR_READ_AHEAD)(IN PVOID Context,IN BOOLEAN Wait);
\r
612 typedef VOID (*PRELEASE_FROM_READ_AHEAD)(IN PVOID Context);
\r
613 typedef struct _CACHE_MANAGER_CALLBACKS {
\r
614 PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite;
\r
615 PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite;
\r
616 PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead;
\r
617 PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead;
\r
618 } CACHE_MANAGER_CALLBACKS,*PCACHE_MANAGER_CALLBACKS;
\r
620 static struct Callbacks {
\r
621 FILE_OBJECT *FileObject;
\r
622 CACHE_MANAGER_CALLBACKS Callbacks;
\r
623 PVOID LazyWriteContext;
\r
624 } Callbacks_cache[CACHE_SIZE];
\r
625 static int Callbacks_cache_used=0;
\r
627 static struct Callbacks *Callbacks_set(FILE_OBJECT *FileObject,CACHE_MANAGER_CALLBACKS *Callbacks,PVOID LazyWriteContext)
\r
629 struct Callbacks *callbacksp;
\r
631 for (callbacksp=Callbacks_cache;callbacksp<Callbacks_cache+Callbacks_cache_used;callbacksp++) {
\r
632 if (callbacksp->FileObject==FileObject)
\r
635 if (callbacksp>=Callbacks_cache+G_N_ELEMENTS(Callbacks_cache))
\r
637 if (callbacksp==Callbacks_cache+Callbacks_cache_used)
\r
638 Callbacks_cache_used++;
\r
639 callbacksp->FileObject=FileObject;
\r
640 callbacksp->Callbacks=*Callbacks;
\r
641 callbacksp->LazyWriteContext=LazyWriteContext;
\r
645 static BOOLEAN TcInitializeCacheMap_AcquireForLazyWrite(IN PVOID Context,IN BOOLEAN Wait)
\r
647 struct Callbacks *callbacksp=Context;
\r
650 DBGSINGLEENTER3("AcquireForLazyWrite: FileObject=0x%lX,Context=0x%lX,Wait=%d",
\r
651 (long)callbacksp->FileObject,(long)callbacksp->LazyWriteContext,Wait);
\r
652 r=(*callbacksp->Callbacks.AcquireForLazyWrite)(callbacksp->LazyWriteContext,Wait);
\r
653 DBGSINGLELEAVE1("AcquireForLazyWrite: r=%d",r);
\r
657 static VOID TcInitializeCacheMap_ReleaseFromLazyWrite(IN PVOID Context)
\r
659 struct Callbacks *callbacksp=Context;
\r
661 DBGSINGLEENTER2("ReleaseFromLazyWrite: FileObject=0x%lX,Context=0x%lX",
\r
662 (long)callbacksp->FileObject,(long)callbacksp->LazyWriteContext);
\r
663 (*callbacksp->Callbacks.ReleaseFromLazyWrite)(callbacksp->LazyWriteContext);
\r
664 DBGSINGLELEAVE0("ReleaseFromLazyWrite");
\r
667 static BOOLEAN TcInitializeCacheMap_AcquireForReadAhead(IN PVOID Context,IN BOOLEAN Wait)
\r
669 struct Callbacks *callbacksp=Context;
\r
672 DBGSINGLEENTER3("AcquireForReadAhead: FileObject=0x%lX,Context=0x%lX,Wait=%d",
\r
673 (long)callbacksp->FileObject,(long)callbacksp->LazyWriteContext,Wait);
\r
674 r=(*callbacksp->Callbacks.AcquireForReadAhead)(callbacksp->LazyWriteContext,Wait);
\r
675 DBGSINGLELEAVE1("AcquireForReadAhead: r=%d",r);
\r
679 static VOID TcInitializeCacheMap_ReleaseFromReadAhead(IN PVOID Context)
\r
681 struct Callbacks *callbacksp=Context;
\r
683 DBGSINGLEENTER2("ReleaseFromReadAhead: FileObject=0x%lX,Context=0x%lX",
\r
684 (long)callbacksp->FileObject,(long)callbacksp->LazyWriteContext);
\r
685 (*callbacksp->Callbacks.ReleaseFromReadAhead)(callbacksp->LazyWriteContext);
\r
686 DBGSINGLELEAVE0("ReleaseFromReadAhead");
\r
689 static CACHE_MANAGER_CALLBACKS TcInitializeCacheMap_Callbacks={
\r
690 TcInitializeCacheMap_AcquireForLazyWrite,
\r
691 TcInitializeCacheMap_ReleaseFromLazyWrite,
\r
692 TcInitializeCacheMap_AcquireForReadAhead,
\r
693 TcInitializeCacheMap_ReleaseFromReadAhead,
\r
696 typedef struct _CC_FILE_SIZES {
\r
697 LARGE_INTEGER AllocationSize;
\r
698 LARGE_INTEGER FileSize;
\r
699 LARGE_INTEGER ValidDataLength;
\r
700 } CC_FILE_SIZES,*PCC_FILE_SIZES;
\r
703 CcInitializeCacheMap (
\r
704 IN PFILE_OBJECT FileObject,
\r
705 IN PCC_FILE_SIZES FileSizes,
\r
706 IN BOOLEAN PinAccess,
\r
707 IN PCACHE_MANAGER_CALLBACKS Callbacks,
\r
708 IN PVOID LazyWriteContext
\r
711 TcInitializeCacheMap (
\r
712 IN PFILE_OBJECT FileObject,
\r
713 IN PCC_FILE_SIZES FileSizes,
\r
714 IN BOOLEAN PinAccess,
\r
715 IN PCACHE_MANAGER_CALLBACKS Callbacks,
\r
716 IN PVOID LazyWriteContext
\r
719 struct Callbacks *callbacksp;
\r
721 DBGSINGLEENTER5("CcInitializeCacheMap: FileObject=0x%lX,"
\r
722 "FileSizes,->AllocationSize=0x%lX,->FileSize=0x%lX,->ValidDataLength=0x%lX,"
\r
723 "PinAccess=%d,Callbacks,LazyWriteContext",
\r
725 (!FileSizes ? -1 : (long)FileSizes->AllocationSize.QuadPart),
\r
726 (!FileSizes ? -1 : (long)FileSizes->FileSize.QuadPart),
\r
727 (!FileSizes ? -1 : (long)FileSizes->ValidDataLength.QuadPart),
\r
729 if ((callbacksp=Callbacks_set(FileObject,Callbacks,LazyWriteContext))) {
\r
730 Callbacks=&TcInitializeCacheMap_Callbacks;
\r
731 LazyWriteContext=callbacksp;
\r
732 if (Callbacks->AcquireForLazyWrite !=TcInitializeCacheMap_AcquireForLazyWrite)
\r
733 DBGSINGLE1("CcInitializeCacheMap: ERROR: AcquireForLazyWrite =0x%lX",Callbacks->AcquireForLazyWrite);
\r
734 if (Callbacks->ReleaseFromLazyWrite!=TcInitializeCacheMap_ReleaseFromLazyWrite)
\r
735 DBGSINGLE1("CcInitializeCacheMap: ERROR: ReleaseFromLazyWrite=0x%lX",Callbacks->ReleaseFromLazyWrite);
\r
736 if (Callbacks->AcquireForReadAhead !=TcInitializeCacheMap_AcquireForReadAhead)
\r
737 DBGSINGLE1("CcInitializeCacheMap: ERROR: AcquireForReadAhead =0x%lX",Callbacks->AcquireForReadAhead);
\r
738 if (Callbacks->ReleaseFromReadAhead!=TcInitializeCacheMap_ReleaseFromReadAhead)
\r
739 DBGSINGLE1("CcInitializeCacheMap: ERROR: ReleaseFromReadAhead=0x%lX",Callbacks->ReleaseFromReadAhead);
\r
741 CcInitializeCacheMap (
\r
748 DBGSINGLELEAVE0("CcInitializeCacheMap");
\r
753 IN PFILE_OBJECT FileObject,
\r
754 IN PLARGE_INTEGER FileOffset,
\r
762 IN PFILE_OBJECT FileObject,
\r
763 IN PLARGE_INTEGER FileOffset,
\r
772 DBGSINGLEENTER4("CcMapData: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Flags=0x%lX",
\r
773 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Flags);
\r
782 DBGSINGLELEAVE3("CcMapData: r=%d,Bcb=0x%lX,Buffer=0x%lX",
\r
783 r,(!Bcb ? -1 : (long)*Bcb),(!Buffer ? -1 : (long)*Buffer));
\r
789 IN PFILE_OBJECT FileObject,
\r
790 IN PLARGE_INTEGER FileOffset,
\r
792 OUT PMDL *MdlChain,
\r
793 OUT PIO_STATUS_BLOCK IoStatus
\r
797 IN PFILE_OBJECT FileObject,
\r
798 IN PLARGE_INTEGER FileOffset,
\r
800 OUT PMDL *MdlChain,
\r
801 OUT PIO_STATUS_BLOCK IoStatus
\r
804 DBGSINGLEENTER3("CcMdlRead: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX",
\r
805 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length);
\r
813 DBGSINGLELEAVE3("CcMdlRead: MdlChain=0x%lX,IoStatus->Status=0x%lX,IoStatus->Information=0x%lX",
\r
814 (!MdlChain ? -1 : (long)*MdlChain),
\r
815 (!IoStatus ? -1 : (long)IoStatus->Status),(!IoStatus ? -1 : (long)IoStatus->Information));
\r
819 CcMdlReadComplete (
\r
820 IN PFILE_OBJECT FileObject,
\r
824 TcMdlReadComplete (
\r
825 IN PFILE_OBJECT FileObject,
\r
829 DBGSINGLEENTER2("CcMdlReadComplete: FileObject=0x%lX,MdlChain=0x%lX",
\r
830 (long)FileObject,(long)MdlChain);
\r
831 CcMdlReadComplete (
\r
835 DBGSINGLELEAVE0("CcMdlReadComplete");
\r
840 IN PFILE_OBJECT FileObject,
\r
845 IN PFILE_OBJECT FileObject,
\r
849 DBGSINGLEENTER2("CcMdlWriteAbort: FileObject=0x%lX,MdlChain=0x%lX",
\r
850 (long)FileObject,(long)MdlChain);
\r
855 DBGSINGLELEAVE0("CcMdlWriteAbort");
\r
859 CcMdlWriteComplete (
\r
860 IN PFILE_OBJECT FileObject,
\r
861 IN PLARGE_INTEGER FileOffset,
\r
865 TcMdlWriteComplete (
\r
866 IN PFILE_OBJECT FileObject,
\r
867 IN PLARGE_INTEGER FileOffset,
\r
871 DBGSINGLEENTER3("CcMdlWriteComplete: FileObject=0x%lX,FileOffset=0x%lX,MdlChain=0x%lX",
\r
872 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),(long)MdlChain);
\r
873 CcMdlWriteComplete (
\r
878 DBGSINGLELEAVE0("CcMdlWriteComplete");
\r
883 IN PFILE_OBJECT FileObject,
\r
884 IN PLARGE_INTEGER FileOffset,
\r
891 IN PFILE_OBJECT FileObject,
\r
892 IN PLARGE_INTEGER FileOffset,
\r
900 DBGSINGLEENTER4("CcPinMappedData: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Flags=0x%lX",
\r
901 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Flags);
\r
902 r=CcPinMappedData (
\r
909 DBGSINGLELEAVE2("CcPinMappedData: r=%d,Bcb=0x%lX",
\r
910 r,(!Bcb ? -1 : (long)*Bcb));
\r
916 IN PFILE_OBJECT FileObject,
\r
917 IN PLARGE_INTEGER FileOffset,
\r
925 IN PFILE_OBJECT FileObject,
\r
926 IN PLARGE_INTEGER FileOffset,
\r
935 DBGSINGLEENTER4("CcPinRead: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Flags=0x%lX",
\r
936 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Flags);
\r
945 DBGSINGLELEAVE3("CcPinRead: r=%d,Bcb=0x%lX,Buffer=0x%lX",
\r
946 r,(!Bcb ? -1 : (long)*Bcb),(!Buffer ? -1 : (long)*Buffer));
\r
951 CcPrepareMdlWrite (
\r
952 IN PFILE_OBJECT FileObject,
\r
953 IN PLARGE_INTEGER FileOffset,
\r
955 OUT PMDL *MdlChain,
\r
956 OUT PIO_STATUS_BLOCK IoStatus
\r
959 TcPrepareMdlWrite (
\r
960 IN PFILE_OBJECT FileObject,
\r
961 IN PLARGE_INTEGER FileOffset,
\r
963 OUT PMDL *MdlChain,
\r
964 OUT PIO_STATUS_BLOCK IoStatus
\r
967 DBGSINGLEENTER3("CcPrepareMdlWrite: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX",
\r
968 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length);
\r
969 CcPrepareMdlWrite (
\r
976 DBGSINGLELEAVE3("CcPrepareMdlWrite: MdlChain=0x%lX,IoStatus->Status=0x%lX,IoStatus->Information=0x%lX",
\r
977 (!MdlChain ? -1 : (long)*MdlChain),
\r
978 (!IoStatus ? -1 : (long)IoStatus->Status),(!IoStatus ? -1 : (long)IoStatus->Information));
\r
982 CcPreparePinWrite (
\r
983 IN PFILE_OBJECT FileObject,
\r
984 IN PLARGE_INTEGER FileOffset,
\r
992 TcPreparePinWrite (
\r
993 IN PFILE_OBJECT FileObject,
\r
994 IN PLARGE_INTEGER FileOffset,
\r
1004 DBGSINGLEENTER5("CcPreparePinWrite: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Zero=%d,Flags=0x%lX",
\r
1005 (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Zero,Flags);
\r
1006 r=CcPreparePinWrite (
\r
1015 DBGSINGLELEAVE3("CcPreparePinWrite: r=%d,Bcb=0x%lX,Buffer=0x%lX",
\r
1016 r,(!Bcb ? -1 : (long)*Bcb),(!Buffer ? -1 : (long)*Buffer));
\r
1021 CcPurgeCacheSection (
\r
1022 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
\r
1023 IN PLARGE_INTEGER FileOffset OPTIONAL,
\r
1025 IN BOOLEAN UninitializeCacheMaps
\r
1028 TcPurgeCacheSection (
\r
1029 IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
\r
1030 IN PLARGE_INTEGER FileOffset OPTIONAL,
\r
1032 IN BOOLEAN UninitializeCacheMaps
\r
1037 DBGSINGLEENTER5("CcPurgeCacheSection: SectionObjectPointer=0x%lX,->SharedCacheMap=0x%lX,FileOffset=0x%lX,Length=0x%lX,"
\r
1038 "UninitializeCacheMaps=%d",
\r
1039 (long)SectionObjectPointer,
\r
1040 (!SectionObjectPointer ? -1 : (long)SectionObjectPointer->SharedCacheMap),
\r
1041 (!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,
\r
1042 UninitializeCacheMaps);
\r
1043 r=CcPurgeCacheSection (
\r
1044 SectionObjectPointer,
\r
1047 UninitializeCacheMaps
\r
1049 DBGSINGLELEAVE1("CcPurgeCacheSection: r=%d",r);
\r
1064 DBGSINGLEENTER1("CcRemapBcb: Bcb=0x%lX",(long)Bcb);
\r
1068 DBGSINGLELEAVE1("CcRemapBcb: r=0x%lX",(long)r);
\r
1073 CcSetAdditionalCacheAttributes (
\r
1074 IN PFILE_OBJECT FileObject,
\r
1075 IN BOOLEAN DisableReadAhead,
\r
1076 IN BOOLEAN DisableWriteBehind
\r
1079 TcSetAdditionalCacheAttributes (
\r
1080 IN PFILE_OBJECT FileObject,
\r
1081 IN BOOLEAN DisableReadAhead,
\r
1082 IN BOOLEAN DisableWriteBehind
\r
1085 DBGSINGLEENTER3("CcSetAdditionalCacheAttributes: FileObject=0x%lX,DisableReadAhead=%d,DisableWriteBehind=%d",
\r
1086 (long)FileObject,DisableReadAhead,DisableWriteBehind);
\r
1087 CcSetAdditionalCacheAttributes (
\r
1090 DisableWriteBehind
\r
1092 DBGSINGLELEAVE0("CcSetAdditionalCacheAttributes");
\r
1096 CcSetBcbOwnerPointer (
\r
1098 IN PVOID OwnerPointer
\r
1101 TcSetBcbOwnerPointer (
\r
1103 IN PVOID OwnerPointer
\r
1106 DBGSINGLEENTER2("CcSetBcbOwnerPointer: Bcb=0x%lX,OwnerPointer=0x%lX",
\r
1107 (long)Bcb,(long)OwnerPointer);
\r
1108 CcSetBcbOwnerPointer (
\r
1112 DBGSINGLELEAVE0("CcSetBcbOwnerPointer");
\r
1116 CcSetDirtyPinnedData (
\r
1118 IN PLARGE_INTEGER Lsn OPTIONAL
\r
1121 TcSetDirtyPinnedData (
\r
1123 IN PLARGE_INTEGER Lsn OPTIONAL
\r
1126 DBGSINGLEENTER2("CcSetDirtyPinnedData: BcbVoid=0x%lX,Lsn=0x%lX",
\r
1127 (long)BcbVoid,(!Lsn ? -1 : (long)Lsn->QuadPart));
\r
1128 CcSetDirtyPinnedData (
\r
1132 DBGSINGLELEAVE0("CcSetDirtyPinnedData");
\r
1137 IN PFILE_OBJECT FileObject,
\r
1138 IN PCC_FILE_SIZES FileSizes
\r
1142 IN PFILE_OBJECT FileObject,
\r
1143 IN PCC_FILE_SIZES FileSizes
\r
1146 DBGSINGLEENTER4("CcSetFileSizes: FileObject=0x%lX,"
\r
1147 "FileSizes,->AllocationSize=0x%lX,->FileSize=0x%lX,->ValidDataLength=0x%lX",
\r
1149 (!FileSizes ? -1 : (long)FileSizes->AllocationSize.QuadPart),
\r
1150 (!FileSizes ? -1 : (long)FileSizes->FileSize.QuadPart),
\r
1151 (!FileSizes ? -1 : (long)FileSizes->ValidDataLength.QuadPart));
\r
1156 DBGSINGLELEAVE0("CcSetFileSizes");
\r
1159 typedef VOID (*PFLUSH_TO_LSN)(IN PVOID LogHandle,IN LARGE_INTEGER Lsn);
\r
1161 static struct LogHandle {
\r
1163 PFLUSH_TO_LSN FlushToLsnRoutine;
\r
1164 } LogHandle_cache[CACHE_SIZE];
\r
1165 static int LogHandle_cache_used=0;
\r
1167 static BOOLEAN LogHandle_set(PVOID LogHandle,PFLUSH_TO_LSN FlushToLsnRoutine)
\r
1169 struct LogHandle *loghandlep;
\r
1171 for (loghandlep=LogHandle_cache;loghandlep<LogHandle_cache+LogHandle_cache_used;loghandlep++) {
\r
1172 if (loghandlep->LogHandle==LogHandle)
\r
1175 if (loghandlep>=LogHandle_cache+G_N_ELEMENTS(LogHandle_cache))
\r
1177 if (loghandlep==LogHandle_cache+LogHandle_cache_used)
\r
1178 LogHandle_cache_used++;
\r
1179 loghandlep->LogHandle=LogHandle;
\r
1180 loghandlep->FlushToLsnRoutine=FlushToLsnRoutine;
\r
1184 static PFLUSH_TO_LSN LogHandle_find(PVOID LogHandle)
\r
1186 struct LogHandle *loghandlep;
\r
1188 for (loghandlep=LogHandle_cache;loghandlep<LogHandle_cache+LogHandle_cache_used;loghandlep++) {
\r
1189 if (loghandlep->LogHandle==LogHandle)
\r
1190 return loghandlep->FlushToLsnRoutine;
\r
1195 static VOID TcSetLogHandleForFile_FlushToLsnRoutine(IN PVOID LogHandle,IN LARGE_INTEGER Lsn)
\r
1197 PFLUSH_TO_LSN FlushToLsnRoutine;
\r
1199 DBGSINGLEENTER2("FlushToLsnRoutine: LogHandle=0x%lX,Lsn=0x%lX",
\r
1200 (long)LogHandle,(long)Lsn.QuadPart);
\r
1201 if ((FlushToLsnRoutine=LogHandle_find(LogHandle)))
\r
1202 (*FlushToLsnRoutine)(LogHandle,Lsn);
\r
1203 DBGSINGLELEAVE0("FlushToLsnRoutine");
\r
1207 CcSetLogHandleForFile (
\r
1208 IN PFILE_OBJECT FileObject,
\r
1209 IN PVOID LogHandle,
\r
1210 IN PFLUSH_TO_LSN FlushToLsnRoutine
\r
1213 TcSetLogHandleForFile (
\r
1214 IN PFILE_OBJECT FileObject,
\r
1215 IN PVOID LogHandle,
\r
1216 IN PFLUSH_TO_LSN FlushToLsnRoutine
\r
1219 DBGSINGLEENTER3("CcSetLogHandleForFile: FileObject=0x%lX,LogHandle=0x%lX,FlushToLsnRoutine=0x%lX",
\r
1220 (long)FileObject,(long)LogHandle,(long)FlushToLsnRoutine);
\r
1221 if (LogHandle_set(LogHandle,FlushToLsnRoutine))
\r
1222 FlushToLsnRoutine=TcSetLogHandleForFile_FlushToLsnRoutine;
\r
1223 CcSetLogHandleForFile (
\r
1228 DBGSINGLELEAVE0("CcSetLogHandleForFile");
\r
1232 CcSetReadAheadGranularity (
\r
1233 IN PFILE_OBJECT FileObject,
\r
1234 IN ULONG Granularity
\r
1237 TcSetReadAheadGranularity (
\r
1238 IN PFILE_OBJECT FileObject,
\r
1239 IN ULONG Granularity
\r
1242 DBGSINGLEENTER2("CcSetReadAheadGranularity: FileObject=0x%lX,Granularity=0x%lX",
\r
1243 (long)FileObject,Granularity);
\r
1244 CcSetReadAheadGranularity (
\r
1248 DBGSINGLELEAVE0("CcSetReadAheadGranularity");
\r
1251 typedef struct _CACHE_UNINITIALIZE_EVENT {
\r
1252 struct _CACHE_UNINITIALIZE_EVENT *Next;
\r
1254 } CACHE_UNINITIALIZE_EVENT,*PCACHE_UNINITIALIZE_EVENT;
\r
1257 CcUninitializeCacheMap (
\r
1258 IN PFILE_OBJECT FileObject,
\r
1259 IN PLARGE_INTEGER TruncateSize OPTIONAL,
\r
1260 IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
\r
1263 TcUninitializeCacheMap (
\r
1264 IN PFILE_OBJECT FileObject,
\r
1265 IN PLARGE_INTEGER TruncateSize OPTIONAL,
\r
1266 IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
\r
1271 DBGSINGLEENTER3("CcUninitializeCacheMap: FileObject=0x%lX,TruncateSize=0x%lX,UninitializeCompleteEvent=0x%lX",
\r
1272 (long)FileObject,(!TruncateSize ? -1 : (long)TruncateSize->QuadPart),(long)UninitializeCompleteEvent);
\r
1273 r=CcUninitializeCacheMap (
\r
1276 UninitializeCompleteEvent
\r
1278 DBGSINGLELEAVE1("CcUninitializeCacheMap: r=%d",r);
\r
1291 DBGSINGLEENTER1("CcUnpinData: Bcb=0x%lX",(long)Bcb);
\r
1295 DBGSINGLELEAVE0("CcUnpinData");
\r
1299 CcUnpinDataForThread (
\r
1301 IN ERESOURCE_THREAD ResourceThreadId
\r
1304 TcUnpinDataForThread (
\r
1306 IN ERESOURCE_THREAD ResourceThreadId
\r
1309 DBGSINGLEENTER2("CcUnpinDataForThread: Bcb=0x%lX,ResourceThreadId=0x%lX",
\r
1310 (long)Bcb,(long)ResourceThreadId);
\r
1311 CcUnpinDataForThread (
\r
1315 DBGSINGLELEAVE0("CcUnpinDataForThread");
\r
1319 CcWaitForCurrentLazyWriterActivity (
\r
1323 TcWaitForCurrentLazyWriterActivity (
\r
1329 DBGSINGLEENTER0("CcWaitForCurrentLazyWriterActivity");
\r
1330 r=CcWaitForCurrentLazyWriterActivity (
\r
1332 DBGSINGLELEAVE1("CcWaitForCurrentLazyWriterActivity: r=0x%lX",r);
\r
1338 IN PFILE_OBJECT FileObject,
\r
1339 IN PLARGE_INTEGER StartOffset,
\r
1340 IN PLARGE_INTEGER EndOffset,
\r
1345 IN PFILE_OBJECT FileObject,
\r
1346 IN PLARGE_INTEGER StartOffset,
\r
1347 IN PLARGE_INTEGER EndOffset,
\r
1353 DBGSINGLEENTER4("CcZeroData: FileObject=0x%lX,StartOffset=0x%lX,EndOffset=0x%lX,Wait=%d",
\r
1355 (!StartOffset ? -1 : (long)StartOffset->QuadPart),
\r
1356 (!EndOffset ? -1 : (long)EndOffset->QuadPart),
\r
1364 DBGSINGLELEAVE1("CcZeroData: r=%d",r);
\r