1 /* $Id: iomgr.c,v 1.28 2002/10/03 19:34:50 robd 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");
62 ObReferenceObjectByPointer(FileObject
,
63 STANDARD_RIGHTS_REQUIRED
,
67 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP
,
68 FileObject
->DeviceObject
,
74 StackPtr
= IoGetNextIrpStackLocation(Irp
);
75 StackPtr
->FileObject
= FileObject
;
77 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
81 IopDeleteFile(PVOID ObjectBody
)
83 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
85 PIO_STACK_LOCATION StackPtr
;
88 DPRINT("IopDeleteFile()\n");
90 ObReferenceObjectByPointer(ObjectBody
,
91 STANDARD_RIGHTS_REQUIRED
,
95 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE
,
96 FileObject
->DeviceObject
,
102 StackPtr
= IoGetNextIrpStackLocation(Irp
);
103 StackPtr
->FileObject
= FileObject
;
105 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
107 if (FileObject
->FileName
.Buffer
!= NULL
)
109 ExFreePool(FileObject
->FileName
.Buffer
);
110 FileObject
->FileName
.Buffer
= 0;
117 OBJECT_ATTRIBUTES ObjectAttributes
;
118 UNICODE_STRING DirName
;
119 UNICODE_STRING LinkName
;
122 IopInitDriverImplementation();
125 * Register iomgr types: DeviceObjectType
127 IoDeviceObjectType
= ExAllocatePool (NonPagedPool
,
128 sizeof (OBJECT_TYPE
));
130 IoDeviceObjectType
->Tag
= TAG_DEVICE_TYPE
;
131 IoDeviceObjectType
->TotalObjects
= 0;
132 IoDeviceObjectType
->TotalHandles
= 0;
133 IoDeviceObjectType
->MaxObjects
= ULONG_MAX
;
134 IoDeviceObjectType
->MaxHandles
= ULONG_MAX
;
135 IoDeviceObjectType
->PagedPoolCharge
= 0;
136 IoDeviceObjectType
->NonpagedPoolCharge
= sizeof (DEVICE_OBJECT
);
137 IoDeviceObjectType
->Mapping
= &IopFileMapping
;
138 IoDeviceObjectType
->Dump
= NULL
;
139 IoDeviceObjectType
->Open
= NULL
;
140 IoDeviceObjectType
->Close
= NULL
;
141 IoDeviceObjectType
->Delete
= NULL
;
142 IoDeviceObjectType
->Parse
= NULL
;
143 IoDeviceObjectType
->Security
= NULL
;
144 IoDeviceObjectType
->QueryName
= NULL
;
145 IoDeviceObjectType
->OkayToClose
= NULL
;
146 IoDeviceObjectType
->Create
= IopCreateDevice
;
147 IoDeviceObjectType
->DuplicationNotify
= NULL
;
149 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType
->TypeName
, L
"Device");
152 * Register iomgr types: FileObjectType
153 * (alias DriverObjectType)
155 IoFileObjectType
= ExAllocatePool (NonPagedPool
, sizeof (OBJECT_TYPE
));
157 IoFileObjectType
->Tag
= TAG_FILE_TYPE
;
158 IoFileObjectType
->TotalObjects
= 0;
159 IoFileObjectType
->TotalHandles
= 0;
160 IoFileObjectType
->MaxObjects
= ULONG_MAX
;
161 IoFileObjectType
->MaxHandles
= ULONG_MAX
;
162 IoFileObjectType
->PagedPoolCharge
= 0;
163 IoFileObjectType
->NonpagedPoolCharge
= sizeof(FILE_OBJECT
);
164 IoFileObjectType
->Mapping
= &IopFileMapping
;
165 IoFileObjectType
->Dump
= NULL
;
166 IoFileObjectType
->Open
= NULL
;
167 IoFileObjectType
->Close
= IopCloseFile
;
168 IoFileObjectType
->Delete
= IopDeleteFile
;
169 IoFileObjectType
->Parse
= NULL
;
170 IoFileObjectType
->Security
= NULL
;
171 IoFileObjectType
->QueryName
= NULL
;
172 IoFileObjectType
->OkayToClose
= NULL
;
173 IoFileObjectType
->Create
= IopCreateFile
;
174 IoFileObjectType
->DuplicationNotify
= NULL
;
176 RtlInitUnicodeStringFromLiteral(&IoFileObjectType
->TypeName
, L
"File");
179 * Create the '\Driver' object directory
181 RtlInitUnicodeStringFromLiteral(&DirName
, L
"\\Driver");
182 InitializeObjectAttributes(&ObjectAttributes
,
187 NtCreateDirectoryObject(&Handle
,
192 * Create the '\FileSystem' object directory
194 RtlInitUnicodeStringFromLiteral(&DirName
,
196 InitializeObjectAttributes(&ObjectAttributes
,
201 NtCreateDirectoryObject(&Handle
,
206 * Create the '\Device' directory
208 RtlInitUnicodeStringFromLiteral(&DirName
,
210 InitializeObjectAttributes(&ObjectAttributes
,
215 ZwCreateDirectoryObject(&Handle
,
220 * Create the '\??' directory
222 RtlInitUnicodeStringFromLiteral(&DirName
,
224 InitializeObjectAttributes(&ObjectAttributes
,
229 ZwCreateDirectoryObject(&Handle
,
234 * Create the '\ArcName' directory
236 RtlInitUnicodeStringFromLiteral(&DirName
,
238 InitializeObjectAttributes(&ObjectAttributes
,
243 ZwCreateDirectoryObject(&Handle
,
248 * Initialize remaining subsubsystem
250 IoInitCancelHandling();
251 IoInitSymbolicLinkImplementation();
252 IoInitFileSystemImplementation();
253 IoInitVpbImplementation();
254 IoInitShutdownNotification();
257 * Create link from '\DosDevices' to '\??' directory
259 RtlInitUnicodeStringFromLiteral(&LinkName
,
261 RtlInitUnicodeStringFromLiteral(&DirName
,
263 IoCreateSymbolicLink(&LinkName
,
267 * Initialize PnP manager
272 * Start the Io worker threads
274 IoInitializeWorkerThreads();
278 PGENERIC_MAPPING STDCALL
279 IoGetFileObjectGenericMapping(VOID
)
281 return(&IopFileMapping
);