1 /* $Id: iomgr.c,v 1.46 2004/03/27 19:41:32 navaraf 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 KSPIN_LOCK EXPORTED IoStatisticsLock
= 0;
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
)
65 //NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case)
66 ObReferenceObjectByPointer(FileObject
,
67 STANDARD_RIGHTS_REQUIRED
,
72 KeResetEvent( &FileObject
->Event
);
74 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP
,
75 FileObject
->DeviceObject
,
81 StackPtr
= IoGetNextIrpStackLocation(Irp
);
82 StackPtr
->FileObject
= FileObject
;
84 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
85 if (Status
== STATUS_PENDING
)
87 KeWaitForSingleObject(&FileObject
->Event
, Executive
, KernelMode
, FALSE
, NULL
);
93 IopDeleteFile(PVOID ObjectBody
)
95 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
97 PIO_STACK_LOCATION StackPtr
;
100 DPRINT("IopDeleteFile()\n");
102 if (FileObject
->DeviceObject
)
105 //NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case)
107 ObReferenceObjectByPointer(ObjectBody
,
108 STANDARD_RIGHTS_REQUIRED
,
112 KeResetEvent( &FileObject
->Event
);
113 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE
,
114 FileObject
->DeviceObject
,
120 Irp
->Flags
|= IRP_CLOSE_OPERATION
;
121 StackPtr
= IoGetNextIrpStackLocation(Irp
);
122 StackPtr
->FileObject
= FileObject
;
124 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
125 if (Status
== STATUS_PENDING
)
127 KeWaitForSingleObject(&FileObject
->Event
, Executive
, KernelMode
, FALSE
, NULL
);
131 if (FileObject
->FileName
.Buffer
!= NULL
)
133 ExFreePool(FileObject
->FileName
.Buffer
);
134 FileObject
->FileName
.Buffer
= 0;
140 IopQueryNameFile(PVOID ObjectBody
,
141 POBJECT_NAME_INFORMATION ObjectNameInfo
,
145 POBJECT_NAME_INFORMATION LocalInfo
;
146 PFILE_NAME_INFORMATION FileNameInfo
;
147 PFILE_OBJECT FileObject
;
148 ULONG LocalReturnLength
;
151 DPRINT ("IopQueryNameFile() called\n");
153 FileObject
= (PFILE_OBJECT
)ObjectBody
;
155 LocalInfo
= ExAllocatePool (NonPagedPool
,
156 sizeof(OBJECT_NAME_INFORMATION
) +
157 MAX_PATH
* sizeof(WCHAR
));
158 if (LocalInfo
== NULL
)
159 return STATUS_INSUFFICIENT_RESOURCES
;
161 Status
= ObQueryNameString (FileObject
->DeviceObject
->Vpb
->RealDevice
,
163 MAX_PATH
* sizeof(WCHAR
),
165 if (!NT_SUCCESS (Status
))
167 ExFreePool (LocalInfo
);
170 DPRINT ("Device path: %wZ\n", &LocalInfo
->Name
);
172 Status
= RtlAppendUnicodeStringToString (&ObjectNameInfo
->Name
,
175 ExFreePool (LocalInfo
);
177 FileNameInfo
= ExAllocatePool (NonPagedPool
,
178 MAX_PATH
* sizeof(WCHAR
) + sizeof(ULONG
));
179 if (FileNameInfo
== NULL
)
180 return STATUS_INSUFFICIENT_RESOURCES
;
182 Status
= IoQueryFileInformation (FileObject
,
184 MAX_PATH
* sizeof(WCHAR
) + sizeof(ULONG
),
187 if (Status
!= STATUS_SUCCESS
)
189 ExFreePool (FileNameInfo
);
193 Status
= RtlAppendUnicodeToString (&ObjectNameInfo
->Name
,
194 FileNameInfo
->FileName
);
196 DPRINT ("Total path: %wZ\n", &ObjectNameInfo
->Name
);
198 ExFreePool (FileNameInfo
);
207 OBJECT_ATTRIBUTES ObjectAttributes
;
208 UNICODE_STRING DirName
;
209 UNICODE_STRING LinkName
;
212 IopInitDriverImplementation();
215 * Register iomgr types: DeviceObjectType
217 IoDeviceObjectType
= ExAllocatePool (NonPagedPool
,
218 sizeof (OBJECT_TYPE
));
220 IoDeviceObjectType
->Tag
= TAG_DEVICE_TYPE
;
221 IoDeviceObjectType
->TotalObjects
= 0;
222 IoDeviceObjectType
->TotalHandles
= 0;
223 IoDeviceObjectType
->MaxObjects
= ULONG_MAX
;
224 IoDeviceObjectType
->MaxHandles
= ULONG_MAX
;
225 IoDeviceObjectType
->PagedPoolCharge
= 0;
226 IoDeviceObjectType
->NonpagedPoolCharge
= sizeof (DEVICE_OBJECT
);
227 IoDeviceObjectType
->Mapping
= &IopFileMapping
;
228 IoDeviceObjectType
->Dump
= NULL
;
229 IoDeviceObjectType
->Open
= NULL
;
230 IoDeviceObjectType
->Close
= NULL
;
231 IoDeviceObjectType
->Delete
= NULL
;
232 IoDeviceObjectType
->Parse
= NULL
;
233 IoDeviceObjectType
->Security
= NULL
;
234 IoDeviceObjectType
->QueryName
= NULL
;
235 IoDeviceObjectType
->OkayToClose
= NULL
;
236 IoDeviceObjectType
->Create
= IopCreateDevice
;
237 IoDeviceObjectType
->DuplicationNotify
= NULL
;
239 RtlRosInitUnicodeStringFromLiteral(&IoDeviceObjectType
->TypeName
, L
"Device");
241 ObpCreateTypeObject(IoDeviceObjectType
);
244 * Register iomgr types: FileObjectType
245 * (alias DriverObjectType)
247 IoFileObjectType
= ExAllocatePool (NonPagedPool
, sizeof (OBJECT_TYPE
));
249 IoFileObjectType
->Tag
= TAG_FILE_TYPE
;
250 IoFileObjectType
->TotalObjects
= 0;
251 IoFileObjectType
->TotalHandles
= 0;
252 IoFileObjectType
->MaxObjects
= ULONG_MAX
;
253 IoFileObjectType
->MaxHandles
= ULONG_MAX
;
254 IoFileObjectType
->PagedPoolCharge
= 0;
255 IoFileObjectType
->NonpagedPoolCharge
= sizeof(FILE_OBJECT
);
256 IoFileObjectType
->Mapping
= &IopFileMapping
;
257 IoFileObjectType
->Dump
= NULL
;
258 IoFileObjectType
->Open
= NULL
;
259 IoFileObjectType
->Close
= IopCloseFile
;
260 IoFileObjectType
->Delete
= IopDeleteFile
;
261 IoFileObjectType
->Parse
= NULL
;
262 IoFileObjectType
->Security
= NULL
;
263 IoFileObjectType
->QueryName
= IopQueryNameFile
;
264 IoFileObjectType
->OkayToClose
= NULL
;
265 IoFileObjectType
->Create
= IopCreateFile
;
266 IoFileObjectType
->DuplicationNotify
= NULL
;
268 RtlRosInitUnicodeStringFromLiteral(&IoFileObjectType
->TypeName
, L
"File");
270 ObpCreateTypeObject(IoFileObjectType
);
273 * Create the '\Driver' object directory
275 RtlRosInitUnicodeStringFromLiteral(&DirName
, L
"\\Driver");
276 InitializeObjectAttributes(&ObjectAttributes
,
281 NtCreateDirectoryObject(&Handle
,
286 * Create the '\FileSystem' object directory
288 RtlRosInitUnicodeStringFromLiteral(&DirName
,
290 InitializeObjectAttributes(&ObjectAttributes
,
295 NtCreateDirectoryObject(&Handle
,
300 * Create the '\Device' directory
302 RtlRosInitUnicodeStringFromLiteral(&DirName
,
304 InitializeObjectAttributes(&ObjectAttributes
,
309 ZwCreateDirectoryObject(&Handle
,
314 * Create the '\??' directory
316 RtlRosInitUnicodeStringFromLiteral(&DirName
,
318 InitializeObjectAttributes(&ObjectAttributes
,
323 ZwCreateDirectoryObject(&Handle
,
328 * Create the '\ArcName' directory
330 RtlRosInitUnicodeStringFromLiteral(&DirName
,
332 InitializeObjectAttributes(&ObjectAttributes
,
337 ZwCreateDirectoryObject(&Handle
,
342 * Initialize remaining subsubsystem
344 IoInitCancelHandling();
345 IoInitFileSystemImplementation();
346 IoInitVpbImplementation();
347 IoInitShutdownNotification();
351 * Create link from '\DosDevices' to '\??' directory
353 RtlRosInitUnicodeStringFromLiteral(&LinkName
,
355 RtlRosInitUnicodeStringFromLiteral(&DirName
,
357 IoCreateSymbolicLink(&LinkName
,
361 * Initialize PnP manager
370 PDEVICE_NODE DeviceNode
;
371 PDRIVER_OBJECT DriverObject
;
372 MODULE_OBJECT ModuleObject
;
375 KeInitializeSpinLock (&IoStatisticsLock
);
377 /* Initialize raw filesystem driver */
379 /* Use IopRootDeviceNode for now */
380 Status
= IopCreateDeviceNode(IopRootDeviceNode
,
383 if (!NT_SUCCESS(Status
))
385 CPRINT("IopCreateDeviceNode() failed with status (%x)\n", Status
);
389 ModuleObject
.Base
= NULL
;
390 ModuleObject
.Length
= 0;
391 ModuleObject
.EntryPoint
= RawFsDriverEntry
;
393 Status
= IopInitializeDriverModule(
398 if (!NT_SUCCESS(Status
))
400 IopFreeDeviceNode(DeviceNode
);
401 CPRINT("IopInitializeDriver() failed with status (%x)\n", Status
);
405 Status
= IopInitializeDevice(DeviceNode
, DriverObject
);
406 if (!NT_SUCCESS(Status
))
408 IopFreeDeviceNode(DeviceNode
);
409 CPRINT("IopInitializeDevice() failed with status (%x)\n", Status
);
414 * Initialize PnP root releations
416 IopInvalidateDeviceRelations(
424 PGENERIC_MAPPING STDCALL
425 IoGetFileObjectGenericMapping(VOID
)
427 return(&IopFileMapping
);