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 ****************************************************************/
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 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
73 FileObject->DeviceObject,
79 StackPtr = IoGetNextIrpStackLocation(Irp);
80 StackPtr->FileObject = FileObject;
82 Status = IoCallDriver(FileObject->DeviceObject, Irp);
83 if (Status == STATUS_PENDING)
85 KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
90 IopDeleteFile(PVOID ObjectBody)
92 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
94 PIO_STACK_LOCATION StackPtr;
97 DPRINT("IopDeleteFile()\n");
99 if (FileObject->DeviceObject)
101 ObReferenceObjectByPointer(ObjectBody,
102 STANDARD_RIGHTS_REQUIRED,
106 KeResetEvent( &FileObject->Event );
107 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
108 FileObject->DeviceObject,
114 StackPtr = IoGetNextIrpStackLocation(Irp);
115 StackPtr->FileObject = FileObject;
117 Status = IoCallDriver(FileObject->DeviceObject, Irp);
118 if (Status == STATUS_PENDING)
120 KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
124 if (FileObject->FileName.Buffer != NULL)
126 ExFreePool(FileObject->FileName.Buffer);
127 FileObject->FileName.Buffer = 0;
131 #endif /* LIBCAPTIVE */
135 OBJECT_ATTRIBUTES ObjectAttributes;
136 UNICODE_STRING DirName;
138 UNICODE_STRING LinkName;
139 #endif /* LIBCAPTIVE */
143 IopInitDriverImplementation();
144 #endif /* LIBCAPTIVE */
147 * Register iomgr types: DeviceObjectType
149 IoDeviceObjectType = ExAllocatePool (NonPagedPool,
150 sizeof (OBJECT_TYPE));
152 IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
153 IoDeviceObjectType->TotalObjects = 0;
154 IoDeviceObjectType->TotalHandles = 0;
155 IoDeviceObjectType->MaxObjects = ULONG_MAX;
156 IoDeviceObjectType->MaxHandles = ULONG_MAX;
157 IoDeviceObjectType->PagedPoolCharge = 0;
158 IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
159 IoDeviceObjectType->Mapping = &IopFileMapping;
160 IoDeviceObjectType->Dump = NULL;
161 IoDeviceObjectType->Open = NULL;
162 IoDeviceObjectType->Close = NULL;
163 IoDeviceObjectType->Delete = NULL;
164 IoDeviceObjectType->Parse = NULL;
165 IoDeviceObjectType->Security = NULL;
166 IoDeviceObjectType->QueryName = NULL;
167 IoDeviceObjectType->OkayToClose = NULL;
168 IoDeviceObjectType->Create = IopCreateDevice;
169 IoDeviceObjectType->DuplicationNotify = NULL;
171 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device"));
174 * Register iomgr types: FileObjectType
175 * (alias DriverObjectType)
177 IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
179 IoFileObjectType->Tag = TAG_FILE_TYPE;
180 IoFileObjectType->TotalObjects = 0;
181 IoFileObjectType->TotalHandles = 0;
182 IoFileObjectType->MaxObjects = ULONG_MAX;
183 IoFileObjectType->MaxHandles = ULONG_MAX;
184 IoFileObjectType->PagedPoolCharge = 0;
185 IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
186 IoFileObjectType->Mapping = &IopFileMapping;
187 IoFileObjectType->Dump = NULL;
188 IoFileObjectType->Open = NULL;
190 IoFileObjectType->Close = IopCloseFile;
191 IoFileObjectType->Delete = IopDeleteFile;
192 #else /* !LIBCAPTIVE */
193 IoFileObjectType->Close = NULL;
194 IoFileObjectType->Delete = NULL;
195 #endif /* !LIBCAPTIVE */
196 IoFileObjectType->Parse = NULL;
197 IoFileObjectType->Security = NULL;
198 IoFileObjectType->QueryName = NULL;
199 IoFileObjectType->OkayToClose = NULL;
200 IoFileObjectType->Create = IopCreateFile;
201 IoFileObjectType->DuplicationNotify = NULL;
203 RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File"));
206 * Create the '\Driver' object directory
208 RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Driver"));
209 InitializeObjectAttributes(&ObjectAttributes,
214 NtCreateDirectoryObject(&Handle,
219 * Create the '\FileSystem' object directory
221 RtlInitUnicodeStringFromLiteral(&DirName,
222 REACTOS_UCS2(L"\\FileSystem"));
223 InitializeObjectAttributes(&ObjectAttributes,
228 NtCreateDirectoryObject(&Handle,
233 * Create the '\Device' directory
235 RtlInitUnicodeStringFromLiteral(&DirName,
236 REACTOS_UCS2(L"\\Device"));
237 InitializeObjectAttributes(&ObjectAttributes,
242 ZwCreateDirectoryObject(&Handle,
248 * Create the '\??' directory
250 RtlInitUnicodeStringFromLiteral(&DirName,
251 REACTOS_UCS2(L"\\??"));
252 InitializeObjectAttributes(&ObjectAttributes,
257 ZwCreateDirectoryObject(&Handle,
262 * Create the '\ArcName' directory
264 RtlInitUnicodeStringFromLiteral(&DirName,
265 REACTOS_UCS2(L"\\ArcName"));
266 InitializeObjectAttributes(&ObjectAttributes,
271 ZwCreateDirectoryObject(&Handle,
276 * Initialize remaining subsubsystem
278 IoInitCancelHandling();
279 IoInitSymbolicLinkImplementation();
280 #endif /* LIBCAPTIVE */
281 IoInitFileSystemImplementation();
282 IoInitVpbImplementation();
283 IoInitShutdownNotification();
286 * Create link from '\DosDevices' to '\??' directory
289 RtlInitUnicodeStringFromLiteral(&LinkName,
291 RtlInitUnicodeStringFromLiteral(&DirName,
293 IoCreateSymbolicLink(&LinkName,
297 * Initialize PnP manager
300 #endif /* LIBCAPTIVE */
305 PGENERIC_MAPPING STDCALL
306 IoGetFileObjectGenericMapping(VOID)
308 return(&IopFileMapping);
311 #endif /* LIBCAPTIVE */