1 /* $Id: iomgr.c,v 1.34 2003/06/02 10:02:56 ekohl 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>
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
;
33 ULONG EXPORTED IoReadOperationCount
= 0; /* FIXME: unknown type */
34 ULONG EXPORTED IoReadTransferCount
= 0; /* FIXME: unknown type */
35 ULONG EXPORTED IoWriteOperationCount
= 0; /* FIXME: unknown type */
36 ULONG EXPORTED IoWriteTransferCount
= 0; /* FIXME: unknown type */
37 ULONG EXPORTED IoStatisticsLock
= 0; /* FIXME: unknown type */
39 static GENERIC_MAPPING IopFileMapping
= {FILE_GENERIC_READ
,
44 /* FUNCTIONS ****************************************************************/
47 IopCloseFile(PVOID ObjectBody
,
50 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
52 PIO_STACK_LOCATION StackPtr
;
55 DPRINT("IopCloseFile()\n");
57 if (HandleCount
> 0 || FileObject
->DeviceObject
== NULL
)
63 //NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case)
64 ObReferenceObjectByPointer(FileObject
,
65 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
);
91 IopDeleteFile(PVOID ObjectBody
)
93 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
95 PIO_STACK_LOCATION StackPtr
;
98 DPRINT("IopDeleteFile()\n");
100 if (FileObject
->DeviceObject
)
103 //NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case)
105 ObReferenceObjectByPointer(ObjectBody
,
106 STANDARD_RIGHTS_REQUIRED
,
110 KeResetEvent( &FileObject
->Event
);
111 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE
,
112 FileObject
->DeviceObject
,
118 StackPtr
= IoGetNextIrpStackLocation(Irp
);
119 StackPtr
->FileObject
= FileObject
;
121 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
122 if (Status
== STATUS_PENDING
)
124 KeWaitForSingleObject(&FileObject
->Event
, Executive
, KernelMode
, FALSE
, NULL
);
128 if (FileObject
->FileName
.Buffer
!= NULL
)
130 ExFreePool(FileObject
->FileName
.Buffer
);
131 FileObject
->FileName
.Buffer
= 0;
137 IopQueryNameFile(PVOID ObjectBody
,
138 POBJECT_NAME_INFORMATION ObjectNameInfo
,
142 POBJECT_NAME_INFORMATION LocalInfo
;
143 PFILE_NAME_INFORMATION FileNameInfo
;
144 PFILE_OBJECT FileObject
;
145 ULONG LocalReturnLength
;
148 DPRINT ("IopQueryNameFile() called\n");
150 FileObject
= (PFILE_OBJECT
)ObjectBody
;
152 LocalInfo
= ExAllocatePool (NonPagedPool
,
153 sizeof(OBJECT_NAME_INFORMATION
) +
154 MAX_PATH
* sizeof(WCHAR
));
155 if (LocalInfo
== NULL
)
156 return STATUS_INSUFFICIENT_RESOURCES
;
158 Status
= ObQueryNameString (FileObject
->DeviceObject
->Vpb
->RealDevice
,
160 MAX_PATH
* sizeof(WCHAR
),
162 if (!NT_SUCCESS (Status
))
164 ExFreePool (LocalInfo
);
167 DPRINT ("Device path: %wZ\n", &LocalInfo
->Name
);
169 Status
= RtlAppendUnicodeStringToString (&ObjectNameInfo
->Name
,
172 ExFreePool (LocalInfo
);
174 FileNameInfo
= ExAllocatePool (NonPagedPool
,
175 MAX_PATH
* sizeof(WCHAR
) + sizeof(ULONG
));
176 if (FileNameInfo
== NULL
)
177 return STATUS_INSUFFICIENT_RESOURCES
;
179 Status
= IoQueryFileInformation (FileObject
,
181 MAX_PATH
* sizeof(WCHAR
) + sizeof(ULONG
),
184 if (Status
!= STATUS_SUCCESS
)
186 ExFreePool (FileNameInfo
);
190 Status
= RtlAppendUnicodeToString (&ObjectNameInfo
->Name
,
191 FileNameInfo
->FileName
);
193 DPRINT ("Total path: %wZ\n", &ObjectNameInfo
->Name
);
195 ExFreePool (FileNameInfo
);
203 OBJECT_ATTRIBUTES ObjectAttributes
;
204 UNICODE_STRING DirName
;
205 UNICODE_STRING LinkName
;
208 IopInitDriverImplementation();
211 * Register iomgr types: DeviceObjectType
213 IoDeviceObjectType
= ExAllocatePool (NonPagedPool
,
214 sizeof (OBJECT_TYPE
));
216 IoDeviceObjectType
->Tag
= TAG_DEVICE_TYPE
;
217 IoDeviceObjectType
->TotalObjects
= 0;
218 IoDeviceObjectType
->TotalHandles
= 0;
219 IoDeviceObjectType
->MaxObjects
= ULONG_MAX
;
220 IoDeviceObjectType
->MaxHandles
= ULONG_MAX
;
221 IoDeviceObjectType
->PagedPoolCharge
= 0;
222 IoDeviceObjectType
->NonpagedPoolCharge
= sizeof (DEVICE_OBJECT
);
223 IoDeviceObjectType
->Mapping
= &IopFileMapping
;
224 IoDeviceObjectType
->Dump
= NULL
;
225 IoDeviceObjectType
->Open
= NULL
;
226 IoDeviceObjectType
->Close
= NULL
;
227 IoDeviceObjectType
->Delete
= NULL
;
228 IoDeviceObjectType
->Parse
= NULL
;
229 IoDeviceObjectType
->Security
= NULL
;
230 IoDeviceObjectType
->QueryName
= NULL
;
231 IoDeviceObjectType
->OkayToClose
= NULL
;
232 IoDeviceObjectType
->Create
= IopCreateDevice
;
233 IoDeviceObjectType
->DuplicationNotify
= NULL
;
235 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType
->TypeName
, L
"Device");
238 * Register iomgr types: FileObjectType
239 * (alias DriverObjectType)
241 IoFileObjectType
= ExAllocatePool (NonPagedPool
, sizeof (OBJECT_TYPE
));
243 IoFileObjectType
->Tag
= TAG_FILE_TYPE
;
244 IoFileObjectType
->TotalObjects
= 0;
245 IoFileObjectType
->TotalHandles
= 0;
246 IoFileObjectType
->MaxObjects
= ULONG_MAX
;
247 IoFileObjectType
->MaxHandles
= ULONG_MAX
;
248 IoFileObjectType
->PagedPoolCharge
= 0;
249 IoFileObjectType
->NonpagedPoolCharge
= sizeof(FILE_OBJECT
);
250 IoFileObjectType
->Mapping
= &IopFileMapping
;
251 IoFileObjectType
->Dump
= NULL
;
252 IoFileObjectType
->Open
= NULL
;
253 IoFileObjectType
->Close
= IopCloseFile
;
254 IoFileObjectType
->Delete
= IopDeleteFile
;
255 IoFileObjectType
->Parse
= NULL
;
256 IoFileObjectType
->Security
= NULL
;
257 IoFileObjectType
->QueryName
= IopQueryNameFile
;
258 IoFileObjectType
->OkayToClose
= NULL
;
259 IoFileObjectType
->Create
= IopCreateFile
;
260 IoFileObjectType
->DuplicationNotify
= NULL
;
262 RtlInitUnicodeStringFromLiteral(&IoFileObjectType
->TypeName
, L
"File");
265 * Create the '\Driver' object directory
267 RtlInitUnicodeStringFromLiteral(&DirName
, L
"\\Driver");
268 InitializeObjectAttributes(&ObjectAttributes
,
273 NtCreateDirectoryObject(&Handle
,
278 * Create the '\FileSystem' object directory
280 RtlInitUnicodeStringFromLiteral(&DirName
,
282 InitializeObjectAttributes(&ObjectAttributes
,
287 NtCreateDirectoryObject(&Handle
,
292 * Create the '\Device' directory
294 RtlInitUnicodeStringFromLiteral(&DirName
,
296 InitializeObjectAttributes(&ObjectAttributes
,
301 ZwCreateDirectoryObject(&Handle
,
306 * Create the '\??' directory
308 RtlInitUnicodeStringFromLiteral(&DirName
,
310 InitializeObjectAttributes(&ObjectAttributes
,
315 ZwCreateDirectoryObject(&Handle
,
320 * Create the '\ArcName' directory
322 RtlInitUnicodeStringFromLiteral(&DirName
,
324 InitializeObjectAttributes(&ObjectAttributes
,
329 ZwCreateDirectoryObject(&Handle
,
334 * Initialize remaining subsubsystem
336 IoInitCancelHandling();
337 IoInitFileSystemImplementation();
338 IoInitVpbImplementation();
339 IoInitShutdownNotification();
342 * Create link from '\DosDevices' to '\??' directory
344 RtlInitUnicodeStringFromLiteral(&LinkName
,
346 RtlInitUnicodeStringFromLiteral(&DirName
,
348 IoCreateSymbolicLink(&LinkName
,
352 * Initialize PnP manager
359 PDEVICE_NODE DeviceNode
;
362 /* Initialize raw filesystem driver */
364 /* Use IopRootDeviceNode for now */
365 Status
= IopCreateDeviceNode(IopRootDeviceNode
,
368 if (!NT_SUCCESS(Status
))
370 CPRINT("IopCreateDeviceNode() failed with status (%x)\n", Status
);
374 Status
= IopInitializeDriver(RawFsDriverEntry
,
377 if (!NT_SUCCESS(Status
))
379 IopFreeDeviceNode(DeviceNode
);
380 CPRINT("IopInitializeDriver() failed with status (%x)\n", Status
);
385 PGENERIC_MAPPING STDCALL
386 IoGetFileObjectGenericMapping(VOID
)
388 return(&IopFileMapping
);