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;
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 */
39 static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
44 /* FUNCTIONS ****************************************************************/
47 IopCloseFile(PVOID ObjectBody,
50 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
52 PIO_STACK_LOCATION StackPtr;
55 DPRINT("IopCloseFile()\n");
57 if (HandleCount > 0 || FileObject->DeviceObject == NULL)
62 ObReferenceObjectByPointer(FileObject,
63 STANDARD_RIGHTS_REQUIRED,
66 KeResetEvent( &FileObject->Event );
68 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
69 FileObject->DeviceObject,
75 StackPtr = IoGetNextIrpStackLocation(Irp);
76 StackPtr->FileObject = FileObject;
78 Status = IoCallDriver(FileObject->DeviceObject, Irp);
79 if (Status == STATUS_PENDING)
81 KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
86 IopDeleteFile(PVOID ObjectBody)
88 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
90 PIO_STACK_LOCATION StackPtr;
93 DPRINT("IopDeleteFile()\n");
95 if (FileObject->DeviceObject)
97 ObReferenceObjectByPointer(ObjectBody,
98 STANDARD_RIGHTS_REQUIRED,
102 KeResetEvent( &FileObject->Event );
103 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
104 FileObject->DeviceObject,
110 StackPtr = IoGetNextIrpStackLocation(Irp);
111 StackPtr->FileObject = FileObject;
113 Status = IoCallDriver(FileObject->DeviceObject, Irp);
114 if (Status == STATUS_PENDING)
116 KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
120 if (FileObject->FileName.Buffer != NULL)
122 ExFreePool(FileObject->FileName.Buffer);
123 FileObject->FileName.Buffer = 0;
130 OBJECT_ATTRIBUTES ObjectAttributes;
131 UNICODE_STRING DirName;
132 UNICODE_STRING LinkName;
135 IopInitDriverImplementation();
138 * Register iomgr types: DeviceObjectType
140 IoDeviceObjectType = ExAllocatePool (NonPagedPool,
141 sizeof (OBJECT_TYPE));
143 IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
144 IoDeviceObjectType->TotalObjects = 0;
145 IoDeviceObjectType->TotalHandles = 0;
146 IoDeviceObjectType->MaxObjects = ULONG_MAX;
147 IoDeviceObjectType->MaxHandles = ULONG_MAX;
148 IoDeviceObjectType->PagedPoolCharge = 0;
149 IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
150 IoDeviceObjectType->Mapping = &IopFileMapping;
151 IoDeviceObjectType->Dump = NULL;
152 IoDeviceObjectType->Open = NULL;
153 IoDeviceObjectType->Close = NULL;
154 IoDeviceObjectType->Delete = NULL;
155 IoDeviceObjectType->Parse = NULL;
156 IoDeviceObjectType->Security = NULL;
157 IoDeviceObjectType->QueryName = NULL;
158 IoDeviceObjectType->OkayToClose = NULL;
159 IoDeviceObjectType->Create = IopCreateDevice;
160 IoDeviceObjectType->DuplicationNotify = NULL;
162 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, L"Device");
165 * Register iomgr types: FileObjectType
166 * (alias DriverObjectType)
168 IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
170 IoFileObjectType->Tag = TAG_FILE_TYPE;
171 IoFileObjectType->TotalObjects = 0;
172 IoFileObjectType->TotalHandles = 0;
173 IoFileObjectType->MaxObjects = ULONG_MAX;
174 IoFileObjectType->MaxHandles = ULONG_MAX;
175 IoFileObjectType->PagedPoolCharge = 0;
176 IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
177 IoFileObjectType->Mapping = &IopFileMapping;
178 IoFileObjectType->Dump = NULL;
179 IoFileObjectType->Open = NULL;
180 IoFileObjectType->Close = IopCloseFile;
181 IoFileObjectType->Delete = IopDeleteFile;
182 IoFileObjectType->Parse = NULL;
183 IoFileObjectType->Security = NULL;
184 IoFileObjectType->QueryName = NULL;
185 IoFileObjectType->OkayToClose = NULL;
186 IoFileObjectType->Create = IopCreateFile;
187 IoFileObjectType->DuplicationNotify = NULL;
189 RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, L"File");
192 * Create the '\Driver' object directory
194 RtlInitUnicodeStringFromLiteral(&DirName, L"\\Driver");
195 InitializeObjectAttributes(&ObjectAttributes,
200 NtCreateDirectoryObject(&Handle,
205 * Create the '\FileSystem' object directory
207 RtlInitUnicodeStringFromLiteral(&DirName,
209 InitializeObjectAttributes(&ObjectAttributes,
214 NtCreateDirectoryObject(&Handle,
219 * Create the '\Device' directory
221 RtlInitUnicodeStringFromLiteral(&DirName,
223 InitializeObjectAttributes(&ObjectAttributes,
228 ZwCreateDirectoryObject(&Handle,
233 * Create the '\??' directory
235 RtlInitUnicodeStringFromLiteral(&DirName,
237 InitializeObjectAttributes(&ObjectAttributes,
242 ZwCreateDirectoryObject(&Handle,
247 * Create the '\ArcName' directory
249 RtlInitUnicodeStringFromLiteral(&DirName,
251 InitializeObjectAttributes(&ObjectAttributes,
256 ZwCreateDirectoryObject(&Handle,
261 * Initialize remaining subsubsystem
263 IoInitCancelHandling();
264 IoInitSymbolicLinkImplementation();
265 IoInitFileSystemImplementation();
266 IoInitVpbImplementation();
267 IoInitShutdownNotification();
270 * Create link from '\DosDevices' to '\??' directory
272 RtlInitUnicodeStringFromLiteral(&LinkName,
274 RtlInitUnicodeStringFromLiteral(&DirName,
276 IoCreateSymbolicLink(&LinkName,
280 * Initialize PnP manager
286 PGENERIC_MAPPING STDCALL
287 IoGetFileObjectGenericMapping(VOID)
289 return(&IopFileMapping);