1 /* $Id: iomgr.c,v 1.11 2000/06/15 18:38:19 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 ****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/ob.h>
16 #include <internal/io.h>
19 #include <internal/debug.h>
21 /* GLOBALS *******************************************************************/
23 /* DATA ********************************************************************/
26 POBJECT_TYPE EXPORTED IoDeviceObjectType
= NULL
;
27 POBJECT_TYPE EXPORTED IoFileObjectType
= NULL
;
28 ULONG EXPORTED IoReadOperationCount
= 0; /* FIXME: unknown type */
29 ULONG EXPORTED IoReadTransferCount
= 0; /* FIXME: unknown type */
30 ULONG EXPORTED IoWriteOperationCount
= 0; /* FIXME: unknown type */
31 ULONG EXPORTED IoWriteTransferCount
= 0; /* FIXME: unknown type */
32 ULONG EXPORTED IoStatisticsLock
= 0; /* FIXME: unknown type */
34 /* FUNCTIONS ****************************************************************/
36 VOID
IopCloseFile(PVOID ObjectBody
, ULONG HandleCount
)
38 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
40 PIO_STACK_LOCATION StackPtr
;
43 DPRINT("IopCloseFile()\n");
50 ObReferenceObjectByPointer(FileObject
,
51 STANDARD_RIGHTS_REQUIRED
,
55 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP
,
56 FileObject
->DeviceObject
,
62 StackPtr
= IoGetNextIrpStackLocation(Irp
);
63 StackPtr
->FileObject
= FileObject
;
65 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
68 VOID
IopDeleteFile(PVOID ObjectBody
)
70 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
72 PIO_STACK_LOCATION StackPtr
;
75 DPRINT("IopDeleteFile()\n");
77 ObReferenceObjectByPointer(ObjectBody
,
78 STANDARD_RIGHTS_REQUIRED
,
82 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE
,
83 FileObject
->DeviceObject
,
89 StackPtr
= IoGetNextIrpStackLocation(Irp
);
90 StackPtr
->FileObject
= FileObject
;
92 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
94 if (FileObject
->FileName
.Buffer
!= NULL
)
96 ExFreePool(FileObject
->FileName
.Buffer
);
97 FileObject
->FileName
.Buffer
= 0;
101 VOID
IoShutdownIoManager(VOID
)
108 OBJECT_ATTRIBUTES attr
;
110 UNICODE_STRING UnicodeString
;
111 ANSI_STRING AnsiString
;
112 UNICODE_STRING DeviceName
;
115 * Register iomgr types: DeviceObjectType
117 IoDeviceObjectType
= ExAllocatePool (
122 IoDeviceObjectType
->TotalObjects
= 0;
123 IoDeviceObjectType
->TotalHandles
= 0;
124 IoDeviceObjectType
->MaxObjects
= ULONG_MAX
;
125 IoDeviceObjectType
->MaxHandles
= ULONG_MAX
;
126 IoDeviceObjectType
->PagedPoolCharge
= 0;
127 IoDeviceObjectType
->NonpagedPoolCharge
= sizeof (DEVICE_OBJECT
);
128 IoDeviceObjectType
->Dump
= NULL
;
129 IoDeviceObjectType
->Open
= NULL
;
130 IoDeviceObjectType
->Close
= NULL
;
131 IoDeviceObjectType
->Delete
= NULL
;
132 IoDeviceObjectType
->Parse
= NULL
;
133 IoDeviceObjectType
->Security
= NULL
;
134 IoDeviceObjectType
->QueryName
= NULL
;
135 IoDeviceObjectType
->OkayToClose
= NULL
;
136 IoDeviceObjectType
->Create
= IopCreateDevice
;
142 RtlAnsiStringToUnicodeString (
143 & IoDeviceObjectType
->TypeName
,
148 * Register iomgr types: FileObjectType
149 * (alias DriverObjectType)
151 IoFileObjectType
= ExAllocatePool (
156 IoFileObjectType
->TotalObjects
= 0;
157 IoFileObjectType
->TotalHandles
= 0;
158 IoFileObjectType
->MaxObjects
= ULONG_MAX
;
159 IoFileObjectType
->MaxHandles
= ULONG_MAX
;
160 IoFileObjectType
->PagedPoolCharge
= 0;
161 IoFileObjectType
->NonpagedPoolCharge
= sizeof(FILE_OBJECT
);
162 IoFileObjectType
->Dump
= NULL
;
163 IoFileObjectType
->Open
= NULL
;
164 IoFileObjectType
->Close
= IopCloseFile
;
165 IoFileObjectType
->Delete
= IopDeleteFile
;
166 IoFileObjectType
->Parse
= NULL
;
167 IoFileObjectType
->Security
= NULL
;
168 IoFileObjectType
->QueryName
= NULL
;
169 IoFileObjectType
->OkayToClose
= NULL
;
170 IoFileObjectType
->Create
= IopCreateFile
;
176 RtlAnsiStringToUnicodeString (
177 & IoFileObjectType
->TypeName
,
183 * Create the device directory
189 RtlAnsiStringToUnicodeString (
194 InitializeObjectAttributes (
201 ZwCreateDirectoryObject (
208 * Create the \?? directory
214 RtlAnsiStringToUnicodeString (
219 InitializeObjectAttributes (
226 ZwCreateDirectoryObject (
232 * Initialize remaining subsubsystem
234 IoInitCancelHandling ();
235 IoInitSymbolicLinkImplementation ();
236 IoInitFileSystemImplementation ();
239 * Create link from \DosDevices to \?? directory
241 RtlInitUnicodeString (&UnicodeString
,
243 RtlInitUnicodeString (&DeviceName
,
245 IoCreateSymbolicLink (&UnicodeString
,