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