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");
66 ObReferenceObjectByPointer(FileObject,
67 STANDARD_RIGHTS_REQUIRED,
71 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
72 FileObject->DeviceObject,
78 StackPtr = IoGetNextIrpStackLocation(Irp);
79 StackPtr->FileObject = FileObject;
81 Status = IoCallDriver(FileObject->DeviceObject, Irp);
85 IopDeleteFile(PVOID ObjectBody)
87 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
89 PIO_STACK_LOCATION StackPtr;
92 DPRINT("IopDeleteFile()\n");
94 ObReferenceObjectByPointer(ObjectBody,
95 STANDARD_RIGHTS_REQUIRED,
99 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
100 FileObject->DeviceObject,
106 StackPtr = IoGetNextIrpStackLocation(Irp);
107 StackPtr->FileObject = FileObject;
109 Status = IoCallDriver(FileObject->DeviceObject, Irp);
111 if (FileObject->FileName.Buffer != NULL)
113 ExFreePool(FileObject->FileName.Buffer);
114 FileObject->FileName.Buffer = 0;
118 #endif /* LIBCAPTIVE */
123 OBJECT_ATTRIBUTES ObjectAttributes;
124 UNICODE_STRING DirName;
125 UNICODE_STRING LinkName;
128 IopInitDriverImplementation();
129 #endif /* LIBCAPTIVE */
132 * Register iomgr types: DeviceObjectType
134 IoDeviceObjectType = ExAllocatePool (NonPagedPool,
135 sizeof (OBJECT_TYPE));
137 IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
138 IoDeviceObjectType->TotalObjects = 0;
139 IoDeviceObjectType->TotalHandles = 0;
140 IoDeviceObjectType->MaxObjects = ULONG_MAX;
141 IoDeviceObjectType->MaxHandles = ULONG_MAX;
142 IoDeviceObjectType->PagedPoolCharge = 0;
143 IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
144 IoDeviceObjectType->Mapping = &IopFileMapping;
145 IoDeviceObjectType->Dump = NULL;
146 IoDeviceObjectType->Open = NULL;
147 IoDeviceObjectType->Close = NULL;
148 IoDeviceObjectType->Delete = NULL;
149 IoDeviceObjectType->Parse = NULL;
150 IoDeviceObjectType->Security = NULL;
151 IoDeviceObjectType->QueryName = NULL;
152 IoDeviceObjectType->OkayToClose = NULL;
154 IoDeviceObjectType->Create = IopCreateDevice;
155 #else /* !LIBCAPTIVE */
156 IoDeviceObjectType->Create = NULL;
157 #endif /* !LIBCAPTIVE */
158 IoDeviceObjectType->DuplicationNotify = NULL;
160 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device"));
163 * Register iomgr types: FileObjectType
164 * (alias DriverObjectType)
166 IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
168 IoFileObjectType->Tag = TAG_FILE_TYPE;
169 IoFileObjectType->TotalObjects = 0;
170 IoFileObjectType->TotalHandles = 0;
171 IoFileObjectType->MaxObjects = ULONG_MAX;
172 IoFileObjectType->MaxHandles = ULONG_MAX;
173 IoFileObjectType->PagedPoolCharge = 0;
174 IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
175 IoFileObjectType->Mapping = &IopFileMapping;
176 IoFileObjectType->Dump = NULL;
177 IoFileObjectType->Open = NULL;
179 IoFileObjectType->Close = IopCloseFile;
180 IoFileObjectType->Delete = IopDeleteFile;
181 #else /* !LIBCAPTIVE */
182 IoFileObjectType->Close = NULL;
183 IoFileObjectType->Delete = NULL;
184 #endif /* !LIBCAPTIVE */
185 IoFileObjectType->Parse = NULL;
186 IoFileObjectType->Security = NULL;
187 IoFileObjectType->QueryName = NULL;
188 IoFileObjectType->OkayToClose = NULL;
190 IoFileObjectType->Create = IopCreateFile;
191 #else /* !LIBCAPTIVE */
192 IoFileObjectType->Create = NULL;
193 #endif /* !LIBCAPTIVE */
194 IoFileObjectType->DuplicationNotify = NULL;
196 RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File"));
200 * Create the '\Driver' object directory
202 RtlInitUnicodeStringFromLiteral(&DirName, L"\\Driver");
203 InitializeObjectAttributes(&ObjectAttributes,
208 NtCreateDirectoryObject(&Handle,
213 * Create the '\FileSystem' object directory
215 RtlInitUnicodeStringFromLiteral(&DirName,
217 InitializeObjectAttributes(&ObjectAttributes,
222 NtCreateDirectoryObject(&Handle,
227 * Create the '\Device' directory
229 RtlInitUnicodeStringFromLiteral(&DirName,
231 InitializeObjectAttributes(&ObjectAttributes,
236 ZwCreateDirectoryObject(&Handle,
241 * Create the '\??' directory
243 RtlInitUnicodeStringFromLiteral(&DirName,
245 InitializeObjectAttributes(&ObjectAttributes,
250 ZwCreateDirectoryObject(&Handle,
255 * Create the '\ArcName' directory
257 RtlInitUnicodeStringFromLiteral(&DirName,
259 InitializeObjectAttributes(&ObjectAttributes,
264 ZwCreateDirectoryObject(&Handle,
269 * Initialize remaining subsubsystem
271 IoInitCancelHandling();
272 IoInitSymbolicLinkImplementation();
273 IoInitFileSystemImplementation();
274 #endif /* LIBCAPTIVE */
275 IoInitVpbImplementation();
276 IoInitShutdownNotification();
279 * Create link from '\DosDevices' to '\??' directory
282 RtlInitUnicodeStringFromLiteral(&LinkName,
284 RtlInitUnicodeStringFromLiteral(&DirName,
286 IoCreateSymbolicLink(&LinkName,
290 * Initialize PnP manager
293 #endif /* LIBCAPTIVE */
298 PGENERIC_MAPPING STDCALL
299 IoGetFileObjectGenericMapping(VOID)
301 return(&IopFileMapping);
304 #endif /* LIBCAPTIVE */