+IoGetFileObjectGenericMapping()
[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 #ifndef LIBCAPTIVE
34 ULONG        EXPORTED IoReadOperationCount = 0; /* FIXME: unknown type */
35 ULONG        EXPORTED IoReadTransferCount = 0;  /* FIXME: unknown type */
36 ULONG        EXPORTED IoWriteOperationCount = 0; /* FIXME: unknown type */
37 ULONG        EXPORTED IoWriteTransferCount = 0; /* FIXME: unknown type */
38 ULONG        EXPORTED IoStatisticsLock = 0;     /* FIXME: unknown type */
39 #endif /* LIBCAPTIVE */
40
41 static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
42                                          FILE_GENERIC_WRITE,
43                                          FILE_GENERIC_EXECUTE,
44                                          FILE_ALL_ACCESS};
45
46 /* FUNCTIONS ****************************************************************/
47
48 VOID STDCALL
49 IopCloseFile(PVOID ObjectBody,
50              ULONG HandleCount)
51 {
52    PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
53    PIRP Irp;
54    PIO_STACK_LOCATION StackPtr;
55    NTSTATUS Status;
56    
57    DPRINT("IopCloseFile()\n");
58    
59    if (HandleCount > 0 || FileObject->DeviceObject == NULL)
60      {
61         return;
62      }
63    
64    ObReferenceObjectByPointer(FileObject,
65                               STANDARD_RIGHTS_REQUIRED,
66                               IoFileObjectType,
67                               UserMode);
68    KeResetEvent( &FileObject->Event );
69   
70    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
71                                       FileObject->DeviceObject,
72                                       NULL,
73                                       0,
74                                       NULL,
75                                       NULL,
76                                       NULL);
77    StackPtr = IoGetNextIrpStackLocation(Irp);
78    StackPtr->FileObject = FileObject;
79    
80    Status = IoCallDriver(FileObject->DeviceObject, Irp);
81    if (Status == STATUS_PENDING)
82    {
83       KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
84    }
85 }
86
87 VOID STDCALL
88 IopDeleteFile(PVOID ObjectBody)
89 {
90    PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
91    PIRP Irp;
92    PIO_STACK_LOCATION StackPtr;
93    NTSTATUS Status;
94    
95    DPRINT("IopDeleteFile()\n");
96
97    if (FileObject->DeviceObject)
98    {
99      ObReferenceObjectByPointer(ObjectBody,
100                                 STANDARD_RIGHTS_REQUIRED,
101                                 IoFileObjectType,
102                                 UserMode);
103    
104      KeResetEvent( &FileObject->Event );
105      Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
106                                         FileObject->DeviceObject,
107                                         NULL,
108                                         0,
109                                         NULL,
110                                         NULL,
111                                         NULL);
112      StackPtr = IoGetNextIrpStackLocation(Irp);
113      StackPtr->FileObject = FileObject;
114    
115      Status = IoCallDriver(FileObject->DeviceObject, Irp);
116      if (Status == STATUS_PENDING)
117      {
118         KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
119      }
120    }
121    
122    if (FileObject->FileName.Buffer != NULL)
123      {
124         ExFreePool(FileObject->FileName.Buffer);
125         FileObject->FileName.Buffer = 0;
126      }
127 }
128
129
130 VOID IoInit (VOID)
131 {
132   OBJECT_ATTRIBUTES ObjectAttributes;
133   UNICODE_STRING DirName;
134 #ifndef LIBCAPTIVE
135   UNICODE_STRING LinkName;
136 #endif /* LIBCAPTIVE */
137   HANDLE Handle;
138
139 #ifndef LIBCAPTIVE
140   IopInitDriverImplementation();
141 #endif /* LIBCAPTIVE */
142   
143   /*
144    * Register iomgr types: DeviceObjectType
145    */
146   IoDeviceObjectType = ExAllocatePool (NonPagedPool, 
147                                        sizeof (OBJECT_TYPE));
148   
149   IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
150   IoDeviceObjectType->TotalObjects = 0;
151   IoDeviceObjectType->TotalHandles = 0;
152   IoDeviceObjectType->MaxObjects = ULONG_MAX;
153   IoDeviceObjectType->MaxHandles = ULONG_MAX;
154   IoDeviceObjectType->PagedPoolCharge = 0;
155   IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
156   IoDeviceObjectType->Mapping = &IopFileMapping;
157   IoDeviceObjectType->Dump = NULL;
158   IoDeviceObjectType->Open = NULL;
159   IoDeviceObjectType->Close = NULL;
160   IoDeviceObjectType->Delete = NULL;
161   IoDeviceObjectType->Parse = NULL;
162   IoDeviceObjectType->Security = NULL;
163   IoDeviceObjectType->QueryName = NULL;
164   IoDeviceObjectType->OkayToClose = NULL;
165   IoDeviceObjectType->Create = IopCreateDevice;
166   IoDeviceObjectType->DuplicationNotify = NULL;
167   
168   RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device"));
169
170   /*
171    * Register iomgr types: FileObjectType
172    * (alias DriverObjectType)
173    */
174   IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE));
175   
176   IoFileObjectType->Tag = TAG_FILE_TYPE;
177   IoFileObjectType->TotalObjects = 0;
178   IoFileObjectType->TotalHandles = 0;
179   IoFileObjectType->MaxObjects = ULONG_MAX;
180   IoFileObjectType->MaxHandles = ULONG_MAX;
181   IoFileObjectType->PagedPoolCharge = 0;
182   IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
183   IoFileObjectType->Mapping = &IopFileMapping;
184   IoFileObjectType->Dump = NULL;
185   IoFileObjectType->Open = NULL;
186   IoFileObjectType->Close = IopCloseFile;
187   IoFileObjectType->Delete = IopDeleteFile;
188   IoFileObjectType->Parse = NULL;
189   IoFileObjectType->Security = NULL;
190   IoFileObjectType->QueryName = NULL;
191   IoFileObjectType->OkayToClose = NULL;
192   IoFileObjectType->Create = IopCreateFile;
193   IoFileObjectType->DuplicationNotify = NULL;
194   
195   RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File"));
196
197   /*
198    * Create the '\Driver' object directory
199    */
200   RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Driver"));
201   InitializeObjectAttributes(&ObjectAttributes,
202                              &DirName,
203                              0,
204                              NULL,
205                              NULL);
206   NtCreateDirectoryObject(&Handle,
207                           0,
208                           &ObjectAttributes);
209
210   /*
211    * Create the '\FileSystem' object directory
212    */
213   RtlInitUnicodeStringFromLiteral(&DirName,
214                        REACTOS_UCS2(L"\\FileSystem"));
215   InitializeObjectAttributes(&ObjectAttributes,
216                              &DirName,
217                              0,
218                              NULL,
219                              NULL);
220   NtCreateDirectoryObject(&Handle,
221                           0,
222                           &ObjectAttributes);
223
224   /*
225    * Create the '\Device' directory
226    */
227   RtlInitUnicodeStringFromLiteral(&DirName,
228                        REACTOS_UCS2(L"\\Device"));
229   InitializeObjectAttributes(&ObjectAttributes,
230                              &DirName,
231                              0,
232                              NULL,
233                              NULL);
234   ZwCreateDirectoryObject(&Handle,
235                           0,
236                           &ObjectAttributes);
237
238 #ifndef LIBCAPTIVE
239   /*
240    * Create the '\??' directory
241    */
242   RtlInitUnicodeStringFromLiteral(&DirName,
243                        REACTOS_UCS2(L"\\??"));
244   InitializeObjectAttributes(&ObjectAttributes,
245                              &DirName,
246                              0,
247                              NULL,
248                              NULL);
249   ZwCreateDirectoryObject(&Handle,
250                           0,
251                           &ObjectAttributes);
252
253   /*
254    * Create the '\ArcName' directory
255    */
256   RtlInitUnicodeStringFromLiteral(&DirName,
257                        REACTOS_UCS2(L"\\ArcName"));
258   InitializeObjectAttributes(&ObjectAttributes,
259                              &DirName,
260                              0,
261                              NULL,
262                              NULL);
263   ZwCreateDirectoryObject(&Handle,
264                           0,
265                           &ObjectAttributes);
266
267   /*
268    * Initialize remaining subsubsystem
269    */
270   IoInitCancelHandling();
271   IoInitSymbolicLinkImplementation();
272 #endif /* LIBCAPTIVE */
273   IoInitFileSystemImplementation();
274   IoInitVpbImplementation();
275   IoInitShutdownNotification();
276
277   /*
278    * Create link from '\DosDevices' to '\??' directory
279    */
280 #ifndef LIBCAPTIVE
281   RtlInitUnicodeStringFromLiteral(&LinkName,
282                        L"\\DosDevices");
283   RtlInitUnicodeStringFromLiteral(&DirName,
284                        L"\\??");
285   IoCreateSymbolicLink(&LinkName,
286                        &DirName);
287
288   /*
289    * Initialize PnP manager
290    */
291   PnpInit();
292 #endif /* LIBCAPTIVE */
293 }
294
295
296 PGENERIC_MAPPING STDCALL
297 IoGetFileObjectGenericMapping(VOID)
298 {
299   return(&IopFileMapping);
300 }
301
302 /* EOF */