4c5a358ed7c376c470ab8cbe47016aa6454c81d7
[reactos.git] / ntoskrnl / io / iomgr.c
1 /* $Id$
2  *
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)
8  * REVISION HISTORY:
9  *             29/07/98: Created
10  */
11
12 /* INCLUDES ****************************************************************/
13
14 #include <limits.h>
15 #include <ddk/ntddk.h>
16 #include <internal/ob.h>
17 #include <internal/io.h>
18 #include <internal/pool.h>
19
20 #define NDEBUG
21 #include <internal/debug.h>
22
23 /* GLOBALS *******************************************************************/
24
25 #define TAG_DEVICE_TYPE     TAG('D', 'E', 'V', 'T')
26 #define TAG_FILE_TYPE       TAG('F', 'I', 'L', 'E')
27
28 /* DATA ********************************************************************/
29
30
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 */
38
39 static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
40                                          FILE_GENERIC_WRITE,
41                                          FILE_GENERIC_EXECUTE,
42                                          FILE_ALL_ACCESS};
43
44 /* FUNCTIONS ****************************************************************/
45
46 VOID STDCALL
47 IopCloseFile(PVOID ObjectBody,
48              ULONG HandleCount)
49 {
50    PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
51    PIRP Irp;
52    PIO_STACK_LOCATION StackPtr;
53    NTSTATUS Status;
54    
55    DPRINT("IopCloseFile()\n");
56    
57    if (HandleCount > 0)
58      {
59         return;
60      }
61    
62    ObReferenceObjectByPointer(FileObject,
63                               STANDARD_RIGHTS_REQUIRED,
64                               IoFileObjectType,
65                               UserMode);
66    
67    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
68                                       FileObject->DeviceObject,
69                                       NULL,
70                                       0,
71                                       NULL,
72                                       NULL,
73                                       NULL);
74    StackPtr = IoGetNextIrpStackLocation(Irp);
75    StackPtr->FileObject = FileObject;
76    
77    Status = IoCallDriver(FileObject->DeviceObject, Irp);
78 }
79
80 VOID STDCALL
81 IopDeleteFile(PVOID ObjectBody)
82 {
83    PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
84    PIRP Irp;
85    PIO_STACK_LOCATION StackPtr;
86    NTSTATUS Status;
87    
88    DPRINT("IopDeleteFile()\n");
89    
90    ObReferenceObjectByPointer(ObjectBody,
91                               STANDARD_RIGHTS_REQUIRED,
92                               IoFileObjectType,
93                               UserMode);
94    
95    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
96                                       FileObject->DeviceObject,
97                                       NULL,
98                                       0,
99                                       NULL,
100                                       NULL,
101                                       NULL);
102    StackPtr = IoGetNextIrpStackLocation(Irp);
103    StackPtr->FileObject = FileObject;
104    
105    Status = IoCallDriver(FileObject->DeviceObject, Irp);
106    
107    if (FileObject->FileName.Buffer != NULL)
108      {
109         ExFreePool(FileObject->FileName.Buffer);
110         FileObject->FileName.Buffer = 0;
111      }
112 }
113
114
115 VOID IoInit (VOID)
116 {
117   OBJECT_ATTRIBUTES ObjectAttributes;
118   UNICODE_STRING DirName;
119   UNICODE_STRING LinkName;
120   HANDLE Handle;
121
122   IopInitDriverImplementation();
123   
124   /*
125    * Register iomgr types: DeviceObjectType
126    */
127   IoDeviceObjectType = ExAllocatePool (NonPagedPool, 
128                                        sizeof (OBJECT_TYPE));
129   
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;
148   
149   RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, L"Device");
150
151   /*
152    * Register iomgr types: FileObjectType
153    * (alias DriverObjectType)
154    */
155   IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
156   
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;
175   
176   RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, L"File");
177
178   /*
179    * Create the '\Driver' object directory
180    */
181   RtlInitUnicodeStringFromLiteral(&DirName, L"\\Driver");
182   InitializeObjectAttributes(&ObjectAttributes,
183                              &DirName,
184                              0,
185                              NULL,
186                              NULL);
187   NtCreateDirectoryObject(&Handle,
188                           0,
189                           &ObjectAttributes);
190
191   /*
192    * Create the '\FileSystem' object directory
193    */
194   RtlInitUnicodeStringFromLiteral(&DirName,
195                        L"\\FileSystem");
196   InitializeObjectAttributes(&ObjectAttributes,
197                              &DirName,
198                              0,
199                              NULL,
200                              NULL);
201   NtCreateDirectoryObject(&Handle,
202                           0,
203                           &ObjectAttributes);
204
205   /*
206    * Create the '\Device' directory
207    */
208   RtlInitUnicodeStringFromLiteral(&DirName,
209                        L"\\Device");
210   InitializeObjectAttributes(&ObjectAttributes,
211                              &DirName,
212                              0,
213                              NULL,
214                              NULL);
215   ZwCreateDirectoryObject(&Handle,
216                           0,
217                           &ObjectAttributes);
218
219   /*
220    * Create the '\??' directory
221    */
222   RtlInitUnicodeStringFromLiteral(&DirName,
223                        L"\\??");
224   InitializeObjectAttributes(&ObjectAttributes,
225                              &DirName,
226                              0,
227                              NULL,
228                              NULL);
229   ZwCreateDirectoryObject(&Handle,
230                           0,
231                           &ObjectAttributes);
232
233   /*
234    * Create the '\ArcName' directory
235    */
236   RtlInitUnicodeStringFromLiteral(&DirName,
237                        L"\\ArcName");
238   InitializeObjectAttributes(&ObjectAttributes,
239                              &DirName,
240                              0,
241                              NULL,
242                              NULL);
243   ZwCreateDirectoryObject(&Handle,
244                           0,
245                           &ObjectAttributes);
246
247   /*
248    * Initialize remaining subsubsystem
249    */
250   IoInitCancelHandling();
251   IoInitSymbolicLinkImplementation();
252   IoInitFileSystemImplementation();
253   IoInitVpbImplementation();
254   IoInitShutdownNotification();
255
256   /*
257    * Create link from '\DosDevices' to '\??' directory
258    */
259   RtlInitUnicodeStringFromLiteral(&LinkName,
260                        L"\\DosDevices");
261   RtlInitUnicodeStringFromLiteral(&DirName,
262                        L"\\??");
263   IoCreateSymbolicLink(&LinkName,
264                        &DirName);
265
266   /*
267    * Initialize PnP manager
268    */
269   PnpInit();
270 }
271
272
273 PGENERIC_MAPPING STDCALL
274 IoGetFileObjectGenericMapping(VOID)
275 {
276   return(&IopFileMapping);
277 }
278
279 /* EOF */