Fixed or added exported object type variables
[reactos.git] / reactos / ntoskrnl / io / iomgr.c
1 /* $Id: iomgr.c,v 1.10 2000/05/09 16:13:49 ekohl Exp $
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 <ddk/ntddk.h>
15 #include <internal/ob.h>
16 #include <internal/io.h>
17
18 #define NDEBUG
19 #include <internal/debug.h>
20
21 /* GLOBALS *******************************************************************/
22
23 /* DATA ********************************************************************/
24
25
26 POBJECT_TYPE EXPORTED IoDeviceObjectType = NULL;
27 POBJECT_TYPE EXPORTED IoFileObjectType = NULL;
28 ULONG EXPORTED IoReadOperationCount = 0; /* FIXME: unknown type */
29 ULONG EXPORTED IoReadTransferCount = 0; /* FIXME: unknown type */
30 ULONG EXPORTED IoWriteOperationCount = 0; /* FIXME: unknown type */
31 ULONG EXPORTED IoWriteTransferCount = 0; /* FIXME: unknown type */
32 ULONG EXPORTED IoStatisticsLock = 0; /* FIXME: unknown type */
33
34 /* FUNCTIONS ****************************************************************/
35
36 VOID IopCloseFile(PVOID ObjectBody, ULONG HandleCount)
37 {
38 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
39 PIRP Irp;
40 PIO_STACK_LOCATION StackPtr;
41 NTSTATUS Status;
42
43 DPRINT("IopCloseFile()\n");
44
45 if (HandleCount > 0)
46 {
47 return;
48 }
49
50 ObReferenceObjectByPointer(FileObject,
51 STANDARD_RIGHTS_REQUIRED,
52 IoFileObjectType,
53 UserMode);
54
55 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
56 FileObject->DeviceObject,
57 NULL,
58 0,
59 NULL,
60 NULL,
61 NULL);
62 StackPtr = IoGetNextIrpStackLocation(Irp);
63 StackPtr->FileObject = FileObject;
64
65 Status = IoCallDriver(FileObject->DeviceObject, Irp);
66 }
67
68 VOID IopDeleteFile(PVOID ObjectBody)
69 {
70 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
71 PIRP Irp;
72 PIO_STACK_LOCATION StackPtr;
73 NTSTATUS Status;
74
75 DPRINT("IopDeleteFile()\n");
76
77 ObReferenceObjectByPointer(ObjectBody,
78 STANDARD_RIGHTS_REQUIRED,
79 IoFileObjectType,
80 UserMode);
81
82 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
83 FileObject->DeviceObject,
84 NULL,
85 0,
86 NULL,
87 NULL,
88 NULL);
89 StackPtr = IoGetNextIrpStackLocation(Irp);
90 StackPtr->FileObject = FileObject;
91
92 Status = IoCallDriver(FileObject->DeviceObject, Irp);
93
94 if (FileObject->FileName.Buffer != NULL)
95 {
96 ExFreePool(FileObject->FileName.Buffer);
97 FileObject->FileName.Buffer = 0;
98 }
99 }
100
101 VOID IoShutdownIoManager(VOID)
102 {
103 }
104
105
106 VOID IoInit (VOID)
107 {
108 OBJECT_ATTRIBUTES attr;
109 HANDLE handle;
110 UNICODE_STRING UnicodeString;
111 ANSI_STRING AnsiString;
112
113 /*
114 * Register iomgr types: DeviceObjectType
115 */
116 IoDeviceObjectType = ExAllocatePool (
117 NonPagedPool,
118 sizeof (OBJECT_TYPE)
119 );
120
121 IoDeviceObjectType->TotalObjects = 0;
122 IoDeviceObjectType->TotalHandles = 0;
123 IoDeviceObjectType->MaxObjects = ULONG_MAX;
124 IoDeviceObjectType->MaxHandles = ULONG_MAX;
125 IoDeviceObjectType->PagedPoolCharge = 0;
126 IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);
127 IoDeviceObjectType->Dump = NULL;
128 IoDeviceObjectType->Open = NULL;
129 IoDeviceObjectType->Close = NULL;
130 IoDeviceObjectType->Delete = NULL;
131 IoDeviceObjectType->Parse = NULL;
132 IoDeviceObjectType->Security = NULL;
133 IoDeviceObjectType->QueryName = NULL;
134 IoDeviceObjectType->OkayToClose = NULL;
135 IoDeviceObjectType->Create = IopCreateDevice;
136
137 RtlInitAnsiString (
138 & AnsiString,
139 "Device"
140 );
141 RtlAnsiStringToUnicodeString (
142 & IoDeviceObjectType->TypeName,
143 & AnsiString,
144 TRUE
145 );
146 /*
147 * Register iomgr types: FileObjectType
148 * (alias DriverObjectType)
149 */
150 IoFileObjectType = ExAllocatePool (
151 NonPagedPool,
152 sizeof (OBJECT_TYPE)
153 );
154
155 IoFileObjectType->TotalObjects = 0;
156 IoFileObjectType->TotalHandles = 0;
157 IoFileObjectType->MaxObjects = ULONG_MAX;
158 IoFileObjectType->MaxHandles = ULONG_MAX;
159 IoFileObjectType->PagedPoolCharge = 0;
160 IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
161 IoFileObjectType->Dump = NULL;
162 IoFileObjectType->Open = NULL;
163 IoFileObjectType->Close = IopCloseFile;
164 IoFileObjectType->Delete = IopDeleteFile;
165 IoFileObjectType->Parse = NULL;
166 IoFileObjectType->Security = NULL;
167 IoFileObjectType->QueryName = NULL;
168 IoFileObjectType->OkayToClose = NULL;
169 IoFileObjectType->Create = IopCreateFile;
170
171 RtlInitAnsiString (
172 & AnsiString,
173 "File"
174 );
175 RtlAnsiStringToUnicodeString (
176 & IoFileObjectType->TypeName,
177 & AnsiString,
178 TRUE
179 );
180
181 /*
182 * Create the device directory
183 */
184 RtlInitAnsiString (
185 & AnsiString,
186 "\\Device"
187 );
188 RtlAnsiStringToUnicodeString (
189 & UnicodeString,
190 & AnsiString,
191 TRUE
192 );
193 InitializeObjectAttributes (
194 & attr,
195 & UnicodeString,
196 0,
197 NULL,
198 NULL
199 );
200 ZwCreateDirectoryObject (
201 & handle,
202 0,
203 & attr
204 );
205 /*
206 * Create the \?? directory
207 */
208 RtlInitAnsiString (
209 & AnsiString,
210 "\\??"
211 );
212 RtlAnsiStringToUnicodeString (
213 & UnicodeString,
214 & AnsiString,
215 TRUE
216 );
217 InitializeObjectAttributes (
218 & attr,
219 & UnicodeString,
220 0,
221 NULL,
222 NULL
223 );
224 ZwCreateDirectoryObject (
225 & handle,
226 0,
227 & attr
228 );
229 /*
230 * Initialize remaining subsubsystem
231 */
232 IoInitCancelHandling ();
233 IoInitSymbolicLinkImplementation ();
234 IoInitFileSystemImplementation ();
235 }
236
237
238 /* EOF */