1 /* $Id: iomgr.c,v 1.32 2003/05/13 21:28:26 chorns 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
)
62 ObReferenceObjectByPointer(FileObject
,
63 STANDARD_RIGHTS_REQUIRED
,
66 KeResetEvent( &FileObject
->Event
);
68 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP
,
69 FileObject
->DeviceObject
,
75 StackPtr
= IoGetNextIrpStackLocation(Irp
);
76 StackPtr
->FileObject
= FileObject
;
78 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
79 if (Status
== STATUS_PENDING
)
81 KeWaitForSingleObject(&FileObject
->Event
, Executive
, KernelMode
, FALSE
, NULL
);
86 IopDeleteFile(PVOID ObjectBody
)
88 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
90 PIO_STACK_LOCATION StackPtr
;
93 DPRINT("IopDeleteFile()\n");
95 if (FileObject
->DeviceObject
)
97 ObReferenceObjectByPointer(ObjectBody
,
98 STANDARD_RIGHTS_REQUIRED
,
102 KeResetEvent( &FileObject
->Event
);
103 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE
,
104 FileObject
->DeviceObject
,
110 StackPtr
= IoGetNextIrpStackLocation(Irp
);
111 StackPtr
->FileObject
= FileObject
;
113 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
114 if (Status
== STATUS_PENDING
)
116 KeWaitForSingleObject(&FileObject
->Event
, Executive
, KernelMode
, FALSE
, NULL
);
120 if (FileObject
->FileName
.Buffer
!= NULL
)
122 ExFreePool(FileObject
->FileName
.Buffer
);
123 FileObject
->FileName
.Buffer
= 0;
130 OBJECT_ATTRIBUTES ObjectAttributes
;
131 UNICODE_STRING DirName
;
132 UNICODE_STRING LinkName
;
135 IopInitDriverImplementation();
138 * Register iomgr types: DeviceObjectType
140 IoDeviceObjectType
= ExAllocatePool (NonPagedPool
,
141 sizeof (OBJECT_TYPE
));
143 IoDeviceObjectType
->Tag
= TAG_DEVICE_TYPE
;
144 IoDeviceObjectType
->TotalObjects
= 0;
145 IoDeviceObjectType
->TotalHandles
= 0;
146 IoDeviceObjectType
->MaxObjects
= ULONG_MAX
;
147 IoDeviceObjectType
->MaxHandles
= ULONG_MAX
;
148 IoDeviceObjectType
->PagedPoolCharge
= 0;
149 IoDeviceObjectType
->NonpagedPoolCharge
= sizeof (DEVICE_OBJECT
);
150 IoDeviceObjectType
->Mapping
= &IopFileMapping
;
151 IoDeviceObjectType
->Dump
= NULL
;
152 IoDeviceObjectType
->Open
= NULL
;
153 IoDeviceObjectType
->Close
= NULL
;
154 IoDeviceObjectType
->Delete
= NULL
;
155 IoDeviceObjectType
->Parse
= NULL
;
156 IoDeviceObjectType
->Security
= NULL
;
157 IoDeviceObjectType
->QueryName
= NULL
;
158 IoDeviceObjectType
->OkayToClose
= NULL
;
159 IoDeviceObjectType
->Create
= IopCreateDevice
;
160 IoDeviceObjectType
->DuplicationNotify
= NULL
;
162 RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType
->TypeName
, L
"Device");
165 * Register iomgr types: FileObjectType
166 * (alias DriverObjectType)
168 IoFileObjectType
= ExAllocatePool (NonPagedPool
, sizeof (OBJECT_TYPE
));
170 IoFileObjectType
->Tag
= TAG_FILE_TYPE
;
171 IoFileObjectType
->TotalObjects
= 0;
172 IoFileObjectType
->TotalHandles
= 0;
173 IoFileObjectType
->MaxObjects
= ULONG_MAX
;
174 IoFileObjectType
->MaxHandles
= ULONG_MAX
;
175 IoFileObjectType
->PagedPoolCharge
= 0;
176 IoFileObjectType
->NonpagedPoolCharge
= sizeof(FILE_OBJECT
);
177 IoFileObjectType
->Mapping
= &IopFileMapping
;
178 IoFileObjectType
->Dump
= NULL
;
179 IoFileObjectType
->Open
= NULL
;
180 IoFileObjectType
->Close
= IopCloseFile
;
181 IoFileObjectType
->Delete
= IopDeleteFile
;
182 IoFileObjectType
->Parse
= NULL
;
183 IoFileObjectType
->Security
= NULL
;
184 IoFileObjectType
->QueryName
= NULL
;
185 IoFileObjectType
->OkayToClose
= NULL
;
186 IoFileObjectType
->Create
= IopCreateFile
;
187 IoFileObjectType
->DuplicationNotify
= NULL
;
189 RtlInitUnicodeStringFromLiteral(&IoFileObjectType
->TypeName
, L
"File");
192 * Create the '\Driver' object directory
194 RtlInitUnicodeStringFromLiteral(&DirName
, L
"\\Driver");
195 InitializeObjectAttributes(&ObjectAttributes
,
200 NtCreateDirectoryObject(&Handle
,
205 * Create the '\FileSystem' object directory
207 RtlInitUnicodeStringFromLiteral(&DirName
,
209 InitializeObjectAttributes(&ObjectAttributes
,
214 NtCreateDirectoryObject(&Handle
,
219 * Create the '\Device' directory
221 RtlInitUnicodeStringFromLiteral(&DirName
,
223 InitializeObjectAttributes(&ObjectAttributes
,
228 ZwCreateDirectoryObject(&Handle
,
233 * Create the '\??' directory
235 RtlInitUnicodeStringFromLiteral(&DirName
,
237 InitializeObjectAttributes(&ObjectAttributes
,
242 ZwCreateDirectoryObject(&Handle
,
247 * Create the '\ArcName' directory
249 RtlInitUnicodeStringFromLiteral(&DirName
,
251 InitializeObjectAttributes(&ObjectAttributes
,
256 ZwCreateDirectoryObject(&Handle
,
261 * Initialize remaining subsubsystem
263 IoInitCancelHandling();
264 IoInitFileSystemImplementation();
265 IoInitVpbImplementation();
266 IoInitShutdownNotification();
269 * Create link from '\DosDevices' to '\??' directory
271 RtlInitUnicodeStringFromLiteral(&LinkName
,
273 RtlInitUnicodeStringFromLiteral(&DirName
,
275 IoCreateSymbolicLink(&LinkName
,
279 * Initialize PnP manager
286 PDEVICE_NODE DeviceNode
;
289 /* Initialize raw filesystem driver */
291 /* Use IopRootDeviceNode for now */
292 Status
= IopCreateDeviceNode(IopRootDeviceNode
,
295 if (!NT_SUCCESS(Status
))
297 CPRINT("IopCreateDeviceNode() failed with status (%x)\n", Status
);
301 Status
= IopInitializeDriver(RawFsDriverEntry
,
304 if (!NT_SUCCESS(Status
))
306 IopFreeDeviceNode(DeviceNode
);
307 CPRINT("IopInitializeDriver() failed with status (%x)\n", Status
);
312 PGENERIC_MAPPING STDCALL
313 IoGetFileObjectGenericMapping(VOID
)
315 return(&IopFileMapping
);