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)
12 /* INCLUDES ****************************************************************/
15 #include <ddk/ntddk.h>
16 #include <internal/ob.h>
17 #include <internal/io.h>
18 #include <internal/pool.h>
21 #include <internal/debug.h>
23 /* GLOBALS *******************************************************************/
25 #define TAG_DEVICE_TYPE TAG('D', 'E', 'V', 'T')
26 #define TAG_FILE_TYPE TAG('F', 'I', 'L', 'E')
28 /* DATA ********************************************************************/
31 POBJECT_TYPE EXPORTED IoDeviceObjectType = NULL;
32 POBJECT_TYPE EXPORTED IoFileObjectType = NULL;
34 ULONG EXPORTED IoReadOperationCount = 0; /* FIXME: unknown type */
35 ULONG EXPORTED IoReadTransferCount = 0; /* FIXME: unknown type */
36 ULONG EXPORTED IoWriteOperationCount = 0; /* FIXME: unknown type */
37 ULONG EXPORTED IoWriteTransferCount = 0; /* FIXME: unknown type */
38 ULONG EXPORTED IoStatisticsLock = 0; /* FIXME: unknown type */
39 #endif /* LIBCAPTIVE */
41 static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
46 /* FUNCTIONS ****************************************************************/
48 extern BOOLEAN IoCreateStreamFileObjectLite_is_owner(FILE_OBJECT *FileObject);
51 IopCloseFile(PVOID ObjectBody,
54 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
56 PIO_STACK_LOCATION StackPtr;
59 DPRINT("IopCloseFile()\n");
61 if (HandleCount > 0 || FileObject->DeviceObject == NULL)
66 ObReferenceObjectByPointer(FileObject,
67 STANDARD_RIGHTS_REQUIRED,
70 KeResetEvent( &FileObject->Event );
72 if (IoCreateStreamFileObjectLite_is_owner(FileObject))
77 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
78 FileObject->DeviceObject,
84 StackPtr = IoGetNextIrpStackLocation(Irp);
85 StackPtr->FileObject = FileObject;
87 Status = IoCallDriver(FileObject->DeviceObject, Irp);
88 if (Status == STATUS_PENDING)
90 KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
94 extern BOOLEAN IoCreateStreamFileObjectLite_is_owner(FILE_OBJECT *FileObject);
95 extern void IoCreateStreamFileObjectLite_remove(FILE_OBJECT *FileObject);
98 IopDeleteFile(PVOID ObjectBody)
100 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
102 PIO_STACK_LOCATION StackPtr;
105 DPRINT("IopDeleteFile()\n");
107 if (FileObject->DeviceObject)
109 ObReferenceObjectByPointer(ObjectBody,
110 STANDARD_RIGHTS_REQUIRED,
114 KeResetEvent( &FileObject->Event );
115 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
116 FileObject->DeviceObject,
122 StackPtr = IoGetNextIrpStackLocation(Irp);
123 StackPtr->FileObject = FileObject;
125 Status = IoCallDriver(FileObject->DeviceObject, Irp);
126 if (Status == STATUS_PENDING)
128 KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
132 if (FileObject->FileName.Buffer != NULL)
134 ExFreePool(FileObject->FileName.Buffer);
135 FileObject->FileName.Buffer = 0;
138 if (IoCreateStreamFileObjectLite_is_owner(FileObject))
140 IoCreateStreamFileObjectLite_remove(FileObject);
147 OBJECT_ATTRIBUTES ObjectAttributes;
148 UNICODE_STRING DirName;
150 UNICODE_STRING LinkName;
151 #endif /* LIBCAPTIVE */
155 IopInitDriverImplementation();
156 #endif /* LIBCAPTIVE */
159 * Register iomgr types: DeviceObjectType
161 IoDeviceObjectType = ExAllocatePool (NonPagedPool,
162 sizeof (OBJECT_TYPE));
164 IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
165 IoDeviceObjectType->TotalObjects = 0;
166 IoDeviceObjectType->TotalHandles = 0;
167 IoDeviceObjectType->MaxObjects = ULONG_MAX;
168 IoDeviceObjectType->MaxHandles = ULONG_MAX;
169 IoDeviceObjectType->PagedPoolCharge = 0;
170 IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
171 IoDeviceObjectType->Mapping = &IopFileMapping;
172 IoDeviceObjectType->Dump = NULL;
173 IoDeviceObjectType->Open = NULL;
174 IoDeviceObjectType->Close = NULL;
175 IoDeviceObjectType->Delete = NULL;
176 IoDeviceObjectType->Parse = NULL;
177 IoDeviceObjectType->Security = NULL;
178 IoDeviceObjectType->QueryName = NULL;
179 IoDeviceObjectType->OkayToClose = NULL;
180 IoDeviceObjectType->Create = IopCreateDevice;
181 IoDeviceObjectType->DuplicationNotify = NULL;
183 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device"));
186 * Register iomgr types: FileObjectType
187 * (alias DriverObjectType)
189 IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
191 IoFileObjectType->Tag = TAG_FILE_TYPE;
192 IoFileObjectType->TotalObjects = 0;
193 IoFileObjectType->TotalHandles = 0;
194 IoFileObjectType->MaxObjects = ULONG_MAX;
195 IoFileObjectType->MaxHandles = ULONG_MAX;
196 IoFileObjectType->PagedPoolCharge = 0;
197 IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
198 IoFileObjectType->Mapping = &IopFileMapping;
199 IoFileObjectType->Dump = NULL;
200 IoFileObjectType->Open = NULL;
201 IoFileObjectType->Close = IopCloseFile;
202 IoFileObjectType->Delete = IopDeleteFile;
203 IoFileObjectType->Parse = NULL;
204 IoFileObjectType->Security = NULL;
205 IoFileObjectType->QueryName = NULL;
206 IoFileObjectType->OkayToClose = NULL;
207 IoFileObjectType->Create = IopCreateFile;
208 IoFileObjectType->DuplicationNotify = NULL;
210 RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File"));
213 * Create the '\Driver' object directory
215 RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Driver"));
216 InitializeObjectAttributes(&ObjectAttributes,
221 NtCreateDirectoryObject(&Handle,
226 * Create the '\FileSystem' object directory
228 RtlInitUnicodeStringFromLiteral(&DirName,
229 REACTOS_UCS2(L"\\FileSystem"));
230 InitializeObjectAttributes(&ObjectAttributes,
235 NtCreateDirectoryObject(&Handle,
240 * Create the '\Device' directory
242 RtlInitUnicodeStringFromLiteral(&DirName,
243 REACTOS_UCS2(L"\\Device"));
244 InitializeObjectAttributes(&ObjectAttributes,
249 ZwCreateDirectoryObject(&Handle,
255 * Create the '\??' directory
257 RtlInitUnicodeStringFromLiteral(&DirName,
258 REACTOS_UCS2(L"\\??"));
259 InitializeObjectAttributes(&ObjectAttributes,
264 ZwCreateDirectoryObject(&Handle,
269 * Create the '\ArcName' directory
271 RtlInitUnicodeStringFromLiteral(&DirName,
272 REACTOS_UCS2(L"\\ArcName"));
273 InitializeObjectAttributes(&ObjectAttributes,
278 ZwCreateDirectoryObject(&Handle,
283 * Initialize remaining subsubsystem
285 #endif /* LIBCAPTIVE */
286 IoInitCancelHandling();
288 IoInitSymbolicLinkImplementation();
289 #endif /* LIBCAPTIVE */
290 IoInitFileSystemImplementation();
291 IoInitVpbImplementation();
292 IoInitShutdownNotification();
295 * Create link from '\DosDevices' to '\??' directory
298 RtlInitUnicodeStringFromLiteral(&LinkName,
300 RtlInitUnicodeStringFromLiteral(&DirName,
302 IoCreateSymbolicLink(&LinkName,
306 * Initialize PnP manager
309 #endif /* LIBCAPTIVE */
313 PGENERIC_MAPPING STDCALL
314 IoGetFileObjectGenericMapping(VOID)
316 return(&IopFileMapping);