[FASTFAT] Implement delayed close
[reactos.git] / drivers / filesystems / fastfat / kdbg.c
1 /*
2 * FILE: drivers/filesystems/fastfat/kdbg.c
3 * PURPOSE: KDBG extension.
4 * COPYRIGHT: See COPYING in the top level directory
5 * PROJECT: ReactOS kernel
6 * PROGRAMMER: Pierre Schweitzer (pierre@reactos.org)
7 */
8
9 /* ------------------------------------------------------- INCLUDES */
10
11 #include "vfat.h"
12
13 #define NDEBUG
14 #include <debug.h>
15
16 #include <stdio.h>
17
18 /* -------------------------------------------------------- DEFINES */
19
20 #ifdef KDBG
21 UNICODE_STRING DebugFile = {0, 0, NULL};
22
23 BOOLEAN
24 NTAPI
25 vfatKdbgHandler(
26 IN PCHAR Command,
27 IN ULONG Argc,
28 IN PCH Argv[])
29 {
30 ULONG Len;
31
32 Len = strlen(Command);
33 if (Len < sizeof("?fat."))
34 {
35 return FALSE;
36 }
37
38 if (Command[0] != '?' || Command[1] != 'f' ||
39 Command[2] != 'a' || Command[3] != 't' ||
40 Command[4] != '.')
41 {
42 return FALSE;
43 }
44
45 Command += (sizeof("?fat.") - sizeof(ANSI_NULL));
46 if (strcmp(Command, "vols") == 0)
47 {
48 ULONG Count = 0;
49 PLIST_ENTRY ListEntry;
50 PDEVICE_EXTENSION DeviceExt;
51
52 for (ListEntry = VfatGlobalData->VolumeListHead.Flink;
53 ListEntry != &VfatGlobalData->VolumeListHead;
54 ListEntry = ListEntry->Flink)
55 {
56 DeviceExt = CONTAINING_RECORD(ListEntry, DEVICE_EXTENSION, VolumeListEntry);
57 DPRINT1("Volume: %p with VCB: %p\n", DeviceExt->VolumeDevice, DeviceExt);
58 ++Count;
59 }
60
61 if (Count == 0)
62 {
63 DPRINT1("No volume found\n");
64 }
65 }
66 else if (strcmp(Command, "files") == 0)
67 {
68 if (Argc != 2)
69 {
70 DPRINT1("Please provide a volume or a VCB!\n");
71 }
72 else
73 {
74 PLIST_ENTRY ListEntry;
75 PDEVICE_EXTENSION DeviceExt;
76
77 for (ListEntry = VfatGlobalData->VolumeListHead.Flink;
78 ListEntry != &VfatGlobalData->VolumeListHead;
79 ListEntry = ListEntry->Flink)
80 {
81 CHAR Volume[17];
82
83 DeviceExt = CONTAINING_RECORD(ListEntry, DEVICE_EXTENSION, VolumeListEntry);
84 sprintf(Volume, "%p", DeviceExt);
85 if (strcmp(Volume, Argv[1]) == 0)
86 {
87 break;
88 }
89
90 sprintf(Volume, "%p", DeviceExt->VolumeDevice);
91 if (strcmp(Volume, Argv[1]) == 0)
92 {
93 break;
94 }
95
96 DeviceExt = NULL;
97 }
98
99 if (DeviceExt == NULL)
100 {
101 DPRINT1("No volume %s found!\n", Argv[1]);
102 }
103 else
104 {
105 PVFATFCB Fcb;
106
107 for (ListEntry = DeviceExt->FcbListHead.Flink;
108 ListEntry != &DeviceExt->FcbListHead;
109 ListEntry = ListEntry->Flink)
110 {
111 Fcb = CONTAINING_RECORD(ListEntry, VFATFCB, FcbListEntry);
112 DPRINT1("FCB %p (ref: %d, oc: %d %s %s %s) for FO %p with path: %.*S\n",
113 Fcb, Fcb->RefCount, Fcb->OpenHandleCount,
114 ((Fcb->Flags & FCB_CLEANED_UP) ? "U" : "NU"),
115 ((Fcb->Flags & FCB_CLOSED) ? "C" : "NC"),
116 ((Fcb->Flags & FCB_DELAYED_CLOSE) ? "D" : "ND"),
117 Fcb->FileObject, Fcb->PathNameU.Length, Fcb->PathNameU.Buffer);
118 }
119 }
120 }
121 }
122 else if (strcmp(Command, "setdbgfile") == 0)
123 {
124 if (Argc < 2)
125 {
126 if (DebugFile.Buffer != NULL)
127 {
128 ExFreePool(DebugFile.Buffer);
129 DebugFile.Length = 0;
130 DebugFile.MaximumLength = 0;
131 }
132
133 DPRINT1("Debug file reset\n");
134 }
135 else
136 {
137 NTSTATUS Status;
138 ANSI_STRING Source;
139
140 if (DebugFile.Buffer != NULL)
141 {
142 ExFreePool(DebugFile.Buffer);
143 DebugFile.Length = 0;
144 DebugFile.MaximumLength = 0;
145 }
146
147 RtlInitAnsiString(&Source, Argv[1]);
148 Status = RtlAnsiStringToUnicodeString(&DebugFile, &Source, TRUE);
149 if (NT_SUCCESS(Status))
150 {
151 DPRINT1("Debug file set to: %.*S\n", DebugFile.Length, DebugFile.Buffer);
152 }
153 }
154 }
155 else
156 {
157 DPRINT1("Unknown command: %s\n", Command);
158 }
159
160 return TRUE;
161 }
162 #endif