Added call to possibly tempory IoInitializeWorkerThreads.
[reactos.git] / reactos / ntoskrnl / io / iomgr.c
1 /* $Id: iomgr.c,v 1.28 2002/10/03 19:34:50 robd 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 <limits.h>
15 #include <ddk/ntddk.h>
16 #include <internal/ob.h>
17 #include <internal/io.h>
18 #include <internal/pool.h>
19
20 #define NDEBUG
21 #include <internal/debug.h>
22
23 /* GLOBALS *******************************************************************/
24
25 #define TAG_DEVICE_TYPE TAG('D', 'E', 'V', 'T')
26 #define TAG_FILE_TYPE TAG('F', 'I', 'L', 'E')
27
28 /* DATA ********************************************************************/
29
30
31 POBJECT_TYPE EXPORTED IoDeviceObjectType = NULL;
32 POBJECT_TYPE EXPORTED IoFileObjectType = NULL;
33 ULONG EXPORTED IoReadOperationCount = 0; /* FIXME: unknown type */
34 ULONG EXPORTED IoReadTransferCount = 0; /* FIXME: unknown type */
35 ULONG EXPORTED IoWriteOperationCount = 0; /* FIXME: unknown type */
36 ULONG EXPORTED IoWriteTransferCount = 0; /* FIXME: unknown type */
37 ULONG EXPORTED IoStatisticsLock = 0; /* FIXME: unknown type */
38
39 static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
40 FILE_GENERIC_WRITE,
41 FILE_GENERIC_EXECUTE,
42 FILE_ALL_ACCESS};
43
44 /* FUNCTIONS ****************************************************************/
45
46 VOID STDCALL
47 IopCloseFile(PVOID ObjectBody,
48 ULONG HandleCount)
49 {
50 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
51 PIRP Irp;
52 PIO_STACK_LOCATION StackPtr;
53 NTSTATUS Status;
54
55 DPRINT("IopCloseFile()\n");
56
57 if (HandleCount > 0)
58 {
59 return;
60 }
61
62 ObReferenceObjectByPointer(FileObject,
63 STANDARD_RIGHTS_REQUIRED,
64 IoFileObjectType,
65 UserMode);
66
67 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
68 FileObject->DeviceObject,
69 NULL,
70 0,
71 NULL,
72 NULL,
73 NULL);
74 StackPtr = IoGetNextIrpStackLocation(Irp);
75 StackPtr->FileObject = FileObject;
76
77 Status = IoCallDriver(FileObject->DeviceObject, Irp);
78 }
79
80 VOID STDCALL
81 IopDeleteFile(PVOID ObjectBody)
82 {
83 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
84 PIRP Irp;
85 PIO_STACK_LOCATION StackPtr;
86 NTSTATUS Status;
87
88 DPRINT("IopDeleteFile()\n");
89
90 ObReferenceObjectByPointer(ObjectBody,
91 STANDARD_RIGHTS_REQUIRED,
92 IoFileObjectType,
93 UserMode);
94
95 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
96 FileObject->DeviceObject,
97 NULL,
98 0,
99 NULL,
100 NULL,
101 NULL);
102 StackPtr = IoGetNextIrpStackLocation(Irp);
103 StackPtr->FileObject = FileObject;
104
105 Status = IoCallDriver(FileObject->DeviceObject, Irp);
106
107 if (FileObject->FileName.Buffer != NULL)
108 {
109 ExFreePool(FileObject->FileName.Buffer);
110 FileObject->FileName.Buffer = 0;
111 }
112 }
113
114
115 VOID IoInit (VOID)
116 {
117 OBJECT_ATTRIBUTES ObjectAttributes;
118 UNICODE_STRING DirName;
119 UNICODE_STRING LinkName;
120 HANDLE Handle;
121
122 IopInitDriverImplementation();
123
124 /*
125 * Register iomgr types: DeviceObjectType
126 */
127 IoDeviceObjectType = ExAllocatePool (NonPagedPool,
128 sizeof (OBJECT_TYPE));
129
130 IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
131 IoDeviceObjectType->TotalObjects = 0;
132 IoDeviceObjectType->TotalHandles = 0;
133 IoDeviceObjectType->MaxObjects = ULONG_MAX;
134 IoDeviceObjectType->MaxHandles = ULONG_MAX;
135 IoDeviceObjectType->PagedPoolCharge = 0;
136 IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
137 IoDeviceObjectType->Mapping = &IopFileMapping;
138 IoDeviceObjectType->Dump = NULL;
139 IoDeviceObjectType->Open = NULL;
140 IoDeviceObjectType->Close = NULL;
141 IoDeviceObjectType->Delete = NULL;
142 IoDeviceObjectType->Parse = NULL;
143 IoDeviceObjectType->Security = NULL;
144 IoDeviceObjectType->QueryName = NULL;
145 IoDeviceObjectType->OkayToClose = NULL;
146 IoDeviceObjectType->Create = IopCreateDevice;
147 IoDeviceObjectType->DuplicationNotify = NULL;
148
149 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, L"Device");
150
151 /*
152 * Register iomgr types: FileObjectType
153 * (alias DriverObjectType)
154 */
155 IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
156
157 IoFileObjectType->Tag = TAG_FILE_TYPE;
158 IoFileObjectType->TotalObjects = 0;
159 IoFileObjectType->TotalHandles = 0;
160 IoFileObjectType->MaxObjects = ULONG_MAX;
161 IoFileObjectType->MaxHandles = ULONG_MAX;
162 IoFileObjectType->PagedPoolCharge = 0;
163 IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
164 IoFileObjectType->Mapping = &IopFileMapping;
165 IoFileObjectType->Dump = NULL;
166 IoFileObjectType->Open = NULL;
167 IoFileObjectType->Close = IopCloseFile;
168 IoFileObjectType->Delete = IopDeleteFile;
169 IoFileObjectType->Parse = NULL;
170 IoFileObjectType->Security = NULL;
171 IoFileObjectType->QueryName = NULL;
172 IoFileObjectType->OkayToClose = NULL;
173 IoFileObjectType->Create = IopCreateFile;
174 IoFileObjectType->DuplicationNotify = NULL;
175
176 RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, L"File");
177
178 /*
179 * Create the '\Driver' object directory
180 */
181 RtlInitUnicodeStringFromLiteral(&DirName, L"\\Driver");
182 InitializeObjectAttributes(&ObjectAttributes,
183 &DirName,
184 0,
185 NULL,
186 NULL);
187 NtCreateDirectoryObject(&Handle,
188 0,
189 &ObjectAttributes);
190
191 /*
192 * Create the '\FileSystem' object directory
193 */
194 RtlInitUnicodeStringFromLiteral(&DirName,
195 L"\\FileSystem");
196 InitializeObjectAttributes(&ObjectAttributes,
197 &DirName,
198 0,
199 NULL,
200 NULL);
201 NtCreateDirectoryObject(&Handle,
202 0,
203 &ObjectAttributes);
204
205 /*
206 * Create the '\Device' directory
207 */
208 RtlInitUnicodeStringFromLiteral(&DirName,
209 L"\\Device");
210 InitializeObjectAttributes(&ObjectAttributes,
211 &DirName,
212 0,
213 NULL,
214 NULL);
215 ZwCreateDirectoryObject(&Handle,
216 0,
217 &ObjectAttributes);
218
219 /*
220 * Create the '\??' directory
221 */
222 RtlInitUnicodeStringFromLiteral(&DirName,
223 L"\\??");
224 InitializeObjectAttributes(&ObjectAttributes,
225 &DirName,
226 0,
227 NULL,
228 NULL);
229 ZwCreateDirectoryObject(&Handle,
230 0,
231 &ObjectAttributes);
232
233 /*
234 * Create the '\ArcName' directory
235 */
236 RtlInitUnicodeStringFromLiteral(&DirName,
237 L"\\ArcName");
238 InitializeObjectAttributes(&ObjectAttributes,
239 &DirName,
240 0,
241 NULL,
242 NULL);
243 ZwCreateDirectoryObject(&Handle,
244 0,
245 &ObjectAttributes);
246
247 /*
248 * Initialize remaining subsubsystem
249 */
250 IoInitCancelHandling();
251 IoInitSymbolicLinkImplementation();
252 IoInitFileSystemImplementation();
253 IoInitVpbImplementation();
254 IoInitShutdownNotification();
255
256 /*
257 * Create link from '\DosDevices' to '\??' directory
258 */
259 RtlInitUnicodeStringFromLiteral(&LinkName,
260 L"\\DosDevices");
261 RtlInitUnicodeStringFromLiteral(&DirName,
262 L"\\??");
263 IoCreateSymbolicLink(&LinkName,
264 &DirName);
265
266 /*
267 * Initialize PnP manager
268 */
269 PnpInit();
270
271 /*
272 * Start the Io worker threads
273 */
274 IoInitializeWorkerThreads();
275 }
276
277
278 PGENERIC_MAPPING STDCALL
279 IoGetFileObjectGenericMapping(VOID)
280 {
281 return(&IopFileMapping);
282 }
283
284 /* EOF */