Improved symbolic links (reparsing).
[reactos.git] / reactos / ntoskrnl / io / iomgr.c
1 /* $Id: iomgr.c,v 1.11 2000/06/15 18:38:19 ekohl Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/iomgr.c
6 * PURPOSE: Initializes the io manager
7 * PROGRAMMER: David Welch (welch@mcmail.com)
8 * REVISION HISTORY:
9 * 29/07/98: Created
10 */
11
12 /* INCLUDES ****************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <internal/ob.h>
16 #include <internal/io.h>
17
18 #define NDEBUG
19 #include <internal/debug.h>
20
21 /* GLOBALS *******************************************************************/
22
23 /* DATA ********************************************************************/
24
25
26 POBJECT_TYPE EXPORTED IoDeviceObjectType = NULL;
27 POBJECT_TYPE EXPORTED IoFileObjectType = NULL;
28 ULONG EXPORTED IoReadOperationCount = 0; /* FIXME: unknown type */
29 ULONG EXPORTED IoReadTransferCount = 0; /* FIXME: unknown type */
30 ULONG EXPORTED IoWriteOperationCount = 0; /* FIXME: unknown type */
31 ULONG EXPORTED IoWriteTransferCount = 0; /* FIXME: unknown type */
32 ULONG EXPORTED IoStatisticsLock = 0; /* FIXME: unknown type */
33
34 /* FUNCTIONS ****************************************************************/
35
36 VOID IopCloseFile(PVOID ObjectBody, ULONG HandleCount)
37 {
38 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
39 PIRP Irp;
40 PIO_STACK_LOCATION StackPtr;
41 NTSTATUS Status;
42
43 DPRINT("IopCloseFile()\n");
44
45 if (HandleCount > 0)
46 {
47 return;
48 }
49
50 ObReferenceObjectByPointer(FileObject,
51 STANDARD_RIGHTS_REQUIRED,
52 IoFileObjectType,
53 UserMode);
54
55 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
56 FileObject->DeviceObject,
57 NULL,
58 0,
59 NULL,
60 NULL,
61 NULL);
62 StackPtr = IoGetNextIrpStackLocation(Irp);
63 StackPtr->FileObject = FileObject;
64
65 Status = IoCallDriver(FileObject->DeviceObject, Irp);
66 }
67
68 VOID IopDeleteFile(PVOID ObjectBody)
69 {
70 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
71 PIRP Irp;
72 PIO_STACK_LOCATION StackPtr;
73 NTSTATUS Status;
74
75 DPRINT("IopDeleteFile()\n");
76
77 ObReferenceObjectByPointer(ObjectBody,
78 STANDARD_RIGHTS_REQUIRED,
79 IoFileObjectType,
80 UserMode);
81
82 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
83 FileObject->DeviceObject,
84 NULL,
85 0,
86 NULL,
87 NULL,
88 NULL);
89 StackPtr = IoGetNextIrpStackLocation(Irp);
90 StackPtr->FileObject = FileObject;
91
92 Status = IoCallDriver(FileObject->DeviceObject, Irp);
93
94 if (FileObject->FileName.Buffer != NULL)
95 {
96 ExFreePool(FileObject->FileName.Buffer);
97 FileObject->FileName.Buffer = 0;
98 }
99 }
100
101 VOID IoShutdownIoManager(VOID)
102 {
103 }
104
105
106 VOID IoInit (VOID)
107 {
108 OBJECT_ATTRIBUTES attr;
109 HANDLE handle;
110 UNICODE_STRING UnicodeString;
111 ANSI_STRING AnsiString;
112 UNICODE_STRING DeviceName;
113
114 /*
115 * Register iomgr types: DeviceObjectType
116 */
117 IoDeviceObjectType = ExAllocatePool (
118 NonPagedPool,
119 sizeof (OBJECT_TYPE)
120 );
121
122 IoDeviceObjectType->TotalObjects = 0;
123 IoDeviceObjectType->TotalHandles = 0;
124 IoDeviceObjectType->MaxObjects = ULONG_MAX;
125 IoDeviceObjectType->MaxHandles = ULONG_MAX;
126 IoDeviceObjectType->PagedPoolCharge = 0;
127 IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
128 IoDeviceObjectType->Dump = NULL;
129 IoDeviceObjectType->Open = NULL;
130 IoDeviceObjectType->Close = NULL;
131 IoDeviceObjectType->Delete = NULL;
132 IoDeviceObjectType->Parse = NULL;
133 IoDeviceObjectType->Security = NULL;
134 IoDeviceObjectType->QueryName = NULL;
135 IoDeviceObjectType->OkayToClose = NULL;
136 IoDeviceObjectType->Create = IopCreateDevice;
137
138 RtlInitAnsiString (
139 & AnsiString,
140 "Device"
141 );
142 RtlAnsiStringToUnicodeString (
143 & IoDeviceObjectType->TypeName,
144 & AnsiString,
145 TRUE
146 );
147 /*
148 * Register iomgr types: FileObjectType
149 * (alias DriverObjectType)
150 */
151 IoFileObjectType = ExAllocatePool (
152 NonPagedPool,
153 sizeof (OBJECT_TYPE)
154 );
155
156 IoFileObjectType->TotalObjects = 0;
157 IoFileObjectType->TotalHandles = 0;
158 IoFileObjectType->MaxObjects = ULONG_MAX;
159 IoFileObjectType->MaxHandles = ULONG_MAX;
160 IoFileObjectType->PagedPoolCharge = 0;
161 IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
162 IoFileObjectType->Dump = NULL;
163 IoFileObjectType->Open = NULL;
164 IoFileObjectType->Close = IopCloseFile;
165 IoFileObjectType->Delete = IopDeleteFile;
166 IoFileObjectType->Parse = NULL;
167 IoFileObjectType->Security = NULL;
168 IoFileObjectType->QueryName = NULL;
169 IoFileObjectType->OkayToClose = NULL;
170 IoFileObjectType->Create = IopCreateFile;
171
172 RtlInitAnsiString (
173 & AnsiString,
174 "File"
175 );
176 RtlAnsiStringToUnicodeString (
177 & IoFileObjectType->TypeName,
178 & AnsiString,
179 TRUE
180 );
181
182 /*
183 * Create the device directory
184 */
185 RtlInitAnsiString (
186 & AnsiString,
187 "\\Device"
188 );
189 RtlAnsiStringToUnicodeString (
190 & UnicodeString,
191 & AnsiString,
192 TRUE
193 );
194 InitializeObjectAttributes (
195 & attr,
196 & UnicodeString,
197 0,
198 NULL,
199 NULL
200 );
201 ZwCreateDirectoryObject (
202 & handle,
203 0,
204 & attr
205 );
206
207 /*
208 * Create the \?? directory
209 */
210 RtlInitAnsiString (
211 & AnsiString,
212 "\\??"
213 );
214 RtlAnsiStringToUnicodeString (
215 & UnicodeString,
216 & AnsiString,
217 TRUE
218 );
219 InitializeObjectAttributes (
220 & attr,
221 & UnicodeString,
222 0,
223 NULL,
224 NULL
225 );
226 ZwCreateDirectoryObject (
227 & handle,
228 0,
229 & attr
230 );
231 /*
232 * Initialize remaining subsubsystem
233 */
234 IoInitCancelHandling ();
235 IoInitSymbolicLinkImplementation ();
236 IoInitFileSystemImplementation ();
237
238 /*
239 * Create link from \DosDevices to \?? directory
240 */
241 RtlInitUnicodeString (&UnicodeString,
242 L"\\DosDevices");
243 RtlInitUnicodeString (&DeviceName,
244 L"\\??");
245 IoCreateSymbolicLink (&UnicodeString,
246 &DeviceName);
247 }
248
249 /* EOF */