1 /* $Id: iomgr.c,v 1.48 2004/05/09 15:02:07 hbirr Exp $
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>
19 #include <internal/module.h>
20 #include <rosrtl/string.h>
23 #include <internal/debug.h>
25 /* GLOBALS *******************************************************************/
27 #define TAG_DEVICE_TYPE TAG('D', 'E', 'V', 'T')
28 #define TAG_FILE_TYPE TAG('F', 'I', 'L', 'E')
30 /* DATA ********************************************************************/
33 POBJECT_TYPE EXPORTED IoDeviceObjectType
= NULL
;
34 POBJECT_TYPE EXPORTED IoFileObjectType
= NULL
;
35 ULONG EXPORTED IoReadOperationCount
= 0;
36 ULONGLONG EXPORTED IoReadTransferCount
= 0;
37 ULONG EXPORTED IoWriteOperationCount
= 0;
38 ULONGLONG EXPORTED IoWriteTransferCount
= 0;
39 ULONG IoOtherOperationCount
= 0;
40 ULONGLONG IoOtherTransferCount
= 0;
41 KSPIN_LOCK EXPORTED IoStatisticsLock
= 0;
43 static GENERIC_MAPPING IopFileMapping
= {FILE_GENERIC_READ
,
48 /* 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
)
67 //NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case)
68 ObReferenceObjectByPointer(FileObject
,
69 STANDARD_RIGHTS_REQUIRED
,
74 KeResetEvent( &FileObject
->Event
);
76 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP
,
77 FileObject
->DeviceObject
,
83 StackPtr
= IoGetNextIrpStackLocation(Irp
);
84 StackPtr
->FileObject
= FileObject
;
86 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
87 if (Status
== STATUS_PENDING
)
89 KeWaitForSingleObject(&FileObject
->Event
, Executive
, KernelMode
, FALSE
, NULL
);
95 IopDeleteFile(PVOID ObjectBody
)
97 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
99 PIO_STACK_LOCATION StackPtr
;
102 DPRINT("IopDeleteFile()\n");
104 if (FileObject
->DeviceObject
)
107 //NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case)
109 ObReferenceObjectByPointer(ObjectBody
,
110 STANDARD_RIGHTS_REQUIRED
,
114 KeResetEvent( &FileObject
->Event
);
115 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE
,
116 FileObject
->DeviceObject
,
122 Irp
->Flags
|= IRP_CLOSE_OPERATION
;
123 StackPtr
= IoGetNextIrpStackLocation(Irp
);
124 StackPtr
->FileObject
= FileObject
;
126 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
127 if (Status
== STATUS_PENDING
)
129 KeWaitForSingleObject(&FileObject
->Event
, Executive
, KernelMode
, FALSE
, NULL
);
133 if (FileObject
->FileName
.Buffer
!= NULL
)
135 ExFreePool(FileObject
->FileName
.Buffer
);
136 FileObject
->FileName
.Buffer
= 0;
142 IopQueryNameFile(PVOID ObjectBody
,
143 POBJECT_NAME_INFORMATION ObjectNameInfo
,
147 POBJECT_NAME_INFORMATION LocalInfo
;
148 PFILE_NAME_INFORMATION FileNameInfo
;
149 PFILE_OBJECT FileObject
;
150 ULONG LocalReturnLength
;
153 DPRINT ("IopQueryNameFile() called\n");
155 FileObject
= (PFILE_OBJECT
)ObjectBody
;
157 LocalInfo
= ExAllocatePool (NonPagedPool
,
158 sizeof(OBJECT_NAME_INFORMATION
) +
159 MAX_PATH
* sizeof(WCHAR
));
160 if (LocalInfo
== NULL
)
161 return STATUS_INSUFFICIENT_RESOURCES
;
163 Status
= ObQueryNameString (FileObject
->DeviceObject
->Vpb
->RealDevice
,
165 MAX_PATH
* sizeof(WCHAR
),
167 if (!NT_SUCCESS (Status
))
169 ExFreePool (LocalInfo
);
172 DPRINT ("Device path: %wZ\n", &LocalInfo
->Name
);
174 Status
= RtlAppendUnicodeStringToString (&ObjectNameInfo
->Name
,
177 ExFreePool (LocalInfo
);
179 FileNameInfo
= ExAllocatePool (NonPagedPool
,
180 MAX_PATH
* sizeof(WCHAR
) + sizeof(ULONG
));
181 if (FileNameInfo
== NULL
)
182 return STATUS_INSUFFICIENT_RESOURCES
;
184 Status
= IoQueryFileInformation (FileObject
,
186 MAX_PATH
* sizeof(WCHAR
) + sizeof(ULONG
),
189 if (Status
!= STATUS_SUCCESS
)
191 ExFreePool (FileNameInfo
);
195 Status
= RtlAppendUnicodeToString (&ObjectNameInfo
->Name
,
196 FileNameInfo
->FileName
);
198 DPRINT ("Total path: %wZ\n", &ObjectNameInfo
->Name
);
200 ExFreePool (FileNameInfo
);
209 OBJECT_ATTRIBUTES ObjectAttributes
;
210 UNICODE_STRING DirName
;
211 UNICODE_STRING LinkName
;
214 IopInitDriverImplementation();
217 * Register iomgr types: DeviceObjectType
219 IoDeviceObjectType
= ExAllocatePool (NonPagedPool
,
220 sizeof (OBJECT_TYPE
));
222 IoDeviceObjectType
->Tag
= TAG_DEVICE_TYPE
;
223 IoDeviceObjectType
->TotalObjects
= 0;
224 IoDeviceObjectType
->TotalHandles
= 0;
225 IoDeviceObjectType
->MaxObjects
= ULONG_MAX
;
226 IoDeviceObjectType
->MaxHandles
= ULONG_MAX
;
227 IoDeviceObjectType
->PagedPoolCharge
= 0;
228 IoDeviceObjectType
->NonpagedPoolCharge
= sizeof (DEVICE_OBJECT
);
229 IoDeviceObjectType
->Mapping
= &IopFileMapping
;
230 IoDeviceObjectType
->Dump
= NULL
;
231 IoDeviceObjectType
->Open
= NULL
;
232 IoDeviceObjectType
->Close
= NULL
;
233 IoDeviceObjectType
->Delete
= NULL
;
234 IoDeviceObjectType
->Parse
= NULL
;
235 IoDeviceObjectType
->Security
= NULL
;
236 IoDeviceObjectType
->QueryName
= NULL
;
237 IoDeviceObjectType
->OkayToClose
= NULL
;
238 IoDeviceObjectType
->Create
= IopCreateDevice
;
239 IoDeviceObjectType
->DuplicationNotify
= NULL
;
241 RtlRosInitUnicodeStringFromLiteral(&IoDeviceObjectType
->TypeName
, L
"Device");
243 ObpCreateTypeObject(IoDeviceObjectType
);
246 * Register iomgr types: FileObjectType
247 * (alias DriverObjectType)
249 IoFileObjectType
= ExAllocatePool (NonPagedPool
, sizeof (OBJECT_TYPE
));
251 IoFileObjectType
->Tag
= TAG_FILE_TYPE
;
252 IoFileObjectType
->TotalObjects
= 0;
253 IoFileObjectType
->TotalHandles
= 0;
254 IoFileObjectType
->MaxObjects
= ULONG_MAX
;
255 IoFileObjectType
->MaxHandles
= ULONG_MAX
;
256 IoFileObjectType
->PagedPoolCharge
= 0;
257 IoFileObjectType
->NonpagedPoolCharge
= sizeof(FILE_OBJECT
);
258 IoFileObjectType
->Mapping
= &IopFileMapping
;
259 IoFileObjectType
->Dump
= NULL
;
260 IoFileObjectType
->Open
= NULL
;
261 IoFileObjectType
->Close
= IopCloseFile
;
262 IoFileObjectType
->Delete
= IopDeleteFile
;
263 IoFileObjectType
->Parse
= NULL
;
264 IoFileObjectType
->Security
= NULL
;
265 IoFileObjectType
->QueryName
= IopQueryNameFile
;
266 IoFileObjectType
->OkayToClose
= NULL
;
267 IoFileObjectType
->Create
= IopCreateFile
;
268 IoFileObjectType
->DuplicationNotify
= NULL
;
270 RtlRosInitUnicodeStringFromLiteral(&IoFileObjectType
->TypeName
, L
"File");
272 ObpCreateTypeObject(IoFileObjectType
);
275 * Create the '\Driver' object directory
277 RtlRosInitUnicodeStringFromLiteral(&DirName
, L
"\\Driver");
278 InitializeObjectAttributes(&ObjectAttributes
,
283 NtCreateDirectoryObject(&Handle
,
288 * Create the '\FileSystem' object directory
290 RtlRosInitUnicodeStringFromLiteral(&DirName
,
292 InitializeObjectAttributes(&ObjectAttributes
,
297 NtCreateDirectoryObject(&Handle
,
302 * Create the '\Device' directory
304 RtlRosInitUnicodeStringFromLiteral(&DirName
,
306 InitializeObjectAttributes(&ObjectAttributes
,
311 ZwCreateDirectoryObject(&Handle
,
316 * Create the '\??' directory
318 RtlRosInitUnicodeStringFromLiteral(&DirName
,
320 InitializeObjectAttributes(&ObjectAttributes
,
325 ZwCreateDirectoryObject(&Handle
,
330 * Create the '\ArcName' directory
332 RtlRosInitUnicodeStringFromLiteral(&DirName
,
334 InitializeObjectAttributes(&ObjectAttributes
,
339 ZwCreateDirectoryObject(&Handle
,
344 * Initialize remaining subsubsystem
346 IoInitCancelHandling();
347 IoInitFileSystemImplementation();
348 IoInitVpbImplementation();
349 IoInitShutdownNotification();
353 * Create link from '\DosDevices' to '\??' directory
355 RtlRosInitUnicodeStringFromLiteral(&LinkName
,
357 RtlRosInitUnicodeStringFromLiteral(&DirName
,
359 IoCreateSymbolicLink(&LinkName
,
363 * Initialize PnP manager
372 PDEVICE_NODE DeviceNode
;
373 PDRIVER_OBJECT DriverObject
;
374 MODULE_OBJECT ModuleObject
;
377 KeInitializeSpinLock (&IoStatisticsLock
);
379 /* Initialize raw filesystem driver */
381 /* Use IopRootDeviceNode for now */
382 Status
= IopCreateDeviceNode(IopRootDeviceNode
,
385 if (!NT_SUCCESS(Status
))
387 CPRINT("IopCreateDeviceNode() failed with status (%x)\n", Status
);
391 ModuleObject
.Base
= NULL
;
392 ModuleObject
.Length
= 0;
393 ModuleObject
.EntryPoint
= RawFsDriverEntry
;
395 Status
= IopInitializeDriverModule(
400 if (!NT_SUCCESS(Status
))
402 IopFreeDeviceNode(DeviceNode
);
403 CPRINT("IopInitializeDriver() failed with status (%x)\n", Status
);
407 Status
= IopInitializeDevice(DeviceNode
, DriverObject
);
408 if (!NT_SUCCESS(Status
))
410 IopFreeDeviceNode(DeviceNode
);
411 CPRINT("IopInitializeDevice() failed with status (%x)\n", Status
);
416 * Initialize PnP root releations
418 IopInvalidateDeviceRelations(
426 PGENERIC_MAPPING STDCALL
427 IoGetFileObjectGenericMapping(VOID
)
429 return(&IopFileMapping
);