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 ****************************************************************/
49 IopCloseFile(PVOID ObjectBody,
52 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
54 PIO_STACK_LOCATION StackPtr;
57 DPRINT("IopCloseFile()\n");
59 if (HandleCount > 0 || FileObject->DeviceObject == NULL)
64 ObReferenceObjectByPointer(FileObject,
65 STANDARD_RIGHTS_REQUIRED,
68 KeResetEvent( &FileObject->Event );
70 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
71 FileObject->DeviceObject,
77 StackPtr = IoGetNextIrpStackLocation(Irp);
78 StackPtr->FileObject = FileObject;
80 Status = IoCallDriver(FileObject->DeviceObject, Irp);
81 if (Status == STATUS_PENDING)
83 KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
88 IopDeleteFile(PVOID ObjectBody)
90 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
92 PIO_STACK_LOCATION StackPtr;
95 DPRINT("IopDeleteFile()\n");
97 if (FileObject->DeviceObject)
99 ObReferenceObjectByPointer(ObjectBody,
100 STANDARD_RIGHTS_REQUIRED,
104 KeResetEvent( &FileObject->Event );
105 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
106 FileObject->DeviceObject,
112 StackPtr = IoGetNextIrpStackLocation(Irp);
113 StackPtr->FileObject = FileObject;
115 Status = IoCallDriver(FileObject->DeviceObject, Irp);
116 if (Status == STATUS_PENDING)
118 KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
122 if (FileObject->FileName.Buffer != NULL)
124 ExFreePool(FileObject->FileName.Buffer);
125 FileObject->FileName.Buffer = 0;
132 OBJECT_ATTRIBUTES ObjectAttributes;
133 UNICODE_STRING DirName;
135 UNICODE_STRING LinkName;
136 #endif /* LIBCAPTIVE */
140 IopInitDriverImplementation();
141 #endif /* LIBCAPTIVE */
144 * Register iomgr types: DeviceObjectType
146 IoDeviceObjectType = ExAllocatePool (NonPagedPool,
147 sizeof (OBJECT_TYPE));
149 IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
150 IoDeviceObjectType->TotalObjects = 0;
151 IoDeviceObjectType->TotalHandles = 0;
152 IoDeviceObjectType->MaxObjects = ULONG_MAX;
153 IoDeviceObjectType->MaxHandles = ULONG_MAX;
154 IoDeviceObjectType->PagedPoolCharge = 0;
155 IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
156 IoDeviceObjectType->Mapping = &IopFileMapping;
157 IoDeviceObjectType->Dump = NULL;
158 IoDeviceObjectType->Open = NULL;
159 IoDeviceObjectType->Close = NULL;
160 IoDeviceObjectType->Delete = NULL;
161 IoDeviceObjectType->Parse = NULL;
162 IoDeviceObjectType->Security = NULL;
163 IoDeviceObjectType->QueryName = NULL;
164 IoDeviceObjectType->OkayToClose = NULL;
165 IoDeviceObjectType->Create = IopCreateDevice;
166 IoDeviceObjectType->DuplicationNotify = NULL;
168 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device"));
171 * Register iomgr types: FileObjectType
172 * (alias DriverObjectType)
174 IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
176 IoFileObjectType->Tag = TAG_FILE_TYPE;
177 IoFileObjectType->TotalObjects = 0;
178 IoFileObjectType->TotalHandles = 0;
179 IoFileObjectType->MaxObjects = ULONG_MAX;
180 IoFileObjectType->MaxHandles = ULONG_MAX;
181 IoFileObjectType->PagedPoolCharge = 0;
182 IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
183 IoFileObjectType->Mapping = &IopFileMapping;
184 IoFileObjectType->Dump = NULL;
185 IoFileObjectType->Open = NULL;
186 IoFileObjectType->Close = IopCloseFile;
187 IoFileObjectType->Delete = IopDeleteFile;
188 IoFileObjectType->Parse = NULL;
189 IoFileObjectType->Security = NULL;
190 IoFileObjectType->QueryName = NULL;
191 IoFileObjectType->OkayToClose = NULL;
192 IoFileObjectType->Create = IopCreateFile;
193 IoFileObjectType->DuplicationNotify = NULL;
195 RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File"));
198 * Create the '\Driver' object directory
200 RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Driver"));
201 InitializeObjectAttributes(&ObjectAttributes,
206 NtCreateDirectoryObject(&Handle,
211 * Create the '\FileSystem' object directory
213 RtlInitUnicodeStringFromLiteral(&DirName,
214 REACTOS_UCS2(L"\\FileSystem"));
215 InitializeObjectAttributes(&ObjectAttributes,
220 NtCreateDirectoryObject(&Handle,
225 * Create the '\Device' directory
227 RtlInitUnicodeStringFromLiteral(&DirName,
228 REACTOS_UCS2(L"\\Device"));
229 InitializeObjectAttributes(&ObjectAttributes,
234 ZwCreateDirectoryObject(&Handle,
240 * Create the '\??' directory
242 RtlInitUnicodeStringFromLiteral(&DirName,
243 REACTOS_UCS2(L"\\??"));
244 InitializeObjectAttributes(&ObjectAttributes,
249 ZwCreateDirectoryObject(&Handle,
254 * Create the '\ArcName' directory
256 RtlInitUnicodeStringFromLiteral(&DirName,
257 REACTOS_UCS2(L"\\ArcName"));
258 InitializeObjectAttributes(&ObjectAttributes,
263 ZwCreateDirectoryObject(&Handle,
268 * Initialize remaining subsubsystem
270 IoInitCancelHandling();
271 IoInitSymbolicLinkImplementation();
272 #endif /* LIBCAPTIVE */
273 IoInitFileSystemImplementation();
274 IoInitVpbImplementation();
275 IoInitShutdownNotification();
278 * Create link from '\DosDevices' to '\??' directory
281 RtlInitUnicodeStringFromLiteral(&LinkName,
283 RtlInitUnicodeStringFromLiteral(&DirName,
285 IoCreateSymbolicLink(&LinkName,
289 * Initialize PnP manager
292 #endif /* LIBCAPTIVE */
296 PGENERIC_MAPPING STDCALL
297 IoGetFileObjectGenericMapping(VOID)
299 return(&IopFileMapping);