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");
62 ObReferenceObjectByPointer(FileObject,
63 STANDARD_RIGHTS_REQUIRED,
67 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
68 FileObject->DeviceObject,
74 StackPtr = IoGetNextIrpStackLocation(Irp);
75 StackPtr->FileObject = FileObject;
77 Status = IoCallDriver(FileObject->DeviceObject, Irp);
81 IopDeleteFile(PVOID ObjectBody)
83 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
85 PIO_STACK_LOCATION StackPtr;
88 DPRINT("IopDeleteFile()\n");
90 ObReferenceObjectByPointer(ObjectBody,
91 STANDARD_RIGHTS_REQUIRED,
95 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
96 FileObject->DeviceObject,
102 StackPtr = IoGetNextIrpStackLocation(Irp);
103 StackPtr->FileObject = FileObject;
105 Status = IoCallDriver(FileObject->DeviceObject, Irp);
107 if (FileObject->FileName.Buffer != NULL)
109 ExFreePool(FileObject->FileName.Buffer);
110 FileObject->FileName.Buffer = 0;
117 OBJECT_ATTRIBUTES ObjectAttributes;
118 UNICODE_STRING DirName;
119 UNICODE_STRING LinkName;
122 IopInitDriverImplementation();
125 * Register iomgr types: DeviceObjectType
127 IoDeviceObjectType = ExAllocatePool (NonPagedPool,
128 sizeof (OBJECT_TYPE));
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;
149 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, L"Device");
152 * Register iomgr types: FileObjectType
153 * (alias DriverObjectType)
155 IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
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;
176 RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, L"File");
179 * Create the '\Driver' object directory
181 RtlInitUnicodeStringFromLiteral(&DirName, L"\\Driver");
182 InitializeObjectAttributes(&ObjectAttributes,
187 NtCreateDirectoryObject(&Handle,
192 * Create the '\FileSystem' object directory
194 RtlInitUnicodeStringFromLiteral(&DirName,
196 InitializeObjectAttributes(&ObjectAttributes,
201 NtCreateDirectoryObject(&Handle,
206 * Create the '\Device' directory
208 RtlInitUnicodeStringFromLiteral(&DirName,
210 InitializeObjectAttributes(&ObjectAttributes,
215 ZwCreateDirectoryObject(&Handle,
220 * Create the '\??' directory
222 RtlInitUnicodeStringFromLiteral(&DirName,
224 InitializeObjectAttributes(&ObjectAttributes,
229 ZwCreateDirectoryObject(&Handle,
234 * Create the '\ArcName' directory
236 RtlInitUnicodeStringFromLiteral(&DirName,
238 InitializeObjectAttributes(&ObjectAttributes,
243 ZwCreateDirectoryObject(&Handle,
248 * Initialize remaining subsubsystem
250 IoInitCancelHandling();
251 IoInitSymbolicLinkImplementation();
252 IoInitFileSystemImplementation();
253 IoInitVpbImplementation();
254 IoInitShutdownNotification();
257 * Create link from '\DosDevices' to '\??' directory
259 RtlInitUnicodeStringFromLiteral(&LinkName,
261 RtlInitUnicodeStringFromLiteral(&DirName,
263 IoCreateSymbolicLink(&LinkName,
267 * Initialize PnP manager
273 PGENERIC_MAPPING STDCALL
274 IoGetFileObjectGenericMapping(VOID)
276 return(&IopFileMapping);