Fixed header inclusion order.
[reactos.git] / reactos / ntoskrnl / io / iomgr.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/io/iomgr.c
5 * PURPOSE: Initializes the io manager
6 * PROGRAMMER: David Welch (welch@mcmail.com)
7 * REVISION HISTORY:
8 * 29/07/98: Created
9 */
10
11 /* INCLUDES ****************************************************************/
12
13 #include <ddk/ntddk.h>
14 #include <internal/ob.h>
15 #include <internal/io.h>
16
17 #define NDEBUG
18 #include <internal/debug.h>
19
20 /* GLOBALS *******************************************************************/
21
22 POBJECT_TYPE IoDeviceType = NULL;
23 POBJECT_TYPE IoFileType = NULL;
24
25 /* FUNCTIONS ****************************************************************/
26
27 VOID IopCloseFile(PVOID ObjectBody, ULONG HandleCount)
28 {
29 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
30 PIRP Irp;
31 PIO_STACK_LOCATION StackPtr;
32 NTSTATUS Status;
33
34 if (HandleCount > 0)
35 {
36 return;
37 }
38
39 ObReferenceObjectByPointer(FileObject,
40 STANDARD_RIGHTS_REQUIRED,
41 IoFileType,
42 UserMode);
43
44 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
45 FileObject->DeviceObject,
46 NULL,
47 0,
48 NULL,
49 NULL,
50 NULL);
51 StackPtr = IoGetNextIrpStackLocation(Irp);
52 StackPtr->FileObject = FileObject;
53
54 Status = IoCallDriver(FileObject->DeviceObject, Irp);
55 }
56
57 VOID IopDeleteFile(PVOID ObjectBody)
58 {
59 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
60 PIRP Irp;
61 PIO_STACK_LOCATION StackPtr;
62 NTSTATUS Status;
63
64 ObReferenceObjectByPointer(ObjectBody,
65 STANDARD_RIGHTS_REQUIRED,
66 IoFileType,
67 UserMode);
68
69 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
70 FileObject->DeviceObject,
71 NULL,
72 0,
73 NULL,
74 NULL,
75 NULL);
76 StackPtr = IoGetNextIrpStackLocation(Irp);
77 StackPtr->FileObject = FileObject;
78
79 Status = IoCallDriver(FileObject->DeviceObject, Irp);
80
81 if (FileObject->FileName.Buffer != NULL)
82 {
83 ExFreePool(FileObject->FileName.Buffer);
84 }
85 }
86
87 VOID IoInit(VOID)
88 {
89 OBJECT_ATTRIBUTES attr;
90 HANDLE handle;
91 UNICODE_STRING UnicodeString;
92 ANSI_STRING AnsiString;
93
94 /*
95 * Register iomgr types
96 */
97 IoDeviceType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
98
99 IoDeviceType->TotalObjects = 0;
100 IoDeviceType->TotalHandles = 0;
101 IoDeviceType->MaxObjects = ULONG_MAX;
102 IoDeviceType->MaxHandles = ULONG_MAX;
103 IoDeviceType->PagedPoolCharge = 0;
104 IoDeviceType->NonpagedPoolCharge = sizeof(DEVICE_OBJECT);
105 IoDeviceType->Dump = NULL;
106 IoDeviceType->Open = NULL;
107 IoDeviceType->Close = NULL;
108 IoDeviceType->Delete = NULL;
109 IoDeviceType->Parse = NULL;
110 IoDeviceType->Security = NULL;
111 IoDeviceType->QueryName = NULL;
112 IoDeviceType->OkayToClose = NULL;
113 IoDeviceType->Create = IopCreateDevice;
114
115 RtlInitAnsiString(&AnsiString,"Device");
116 RtlAnsiStringToUnicodeString(&IoDeviceType->TypeName,&AnsiString,TRUE);
117
118 IoFileType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
119
120 IoFileType->TotalObjects = 0;
121 IoFileType->TotalHandles = 0;
122 IoFileType->MaxObjects = ULONG_MAX;
123 IoFileType->MaxHandles = ULONG_MAX;
124 IoFileType->PagedPoolCharge = 0;
125 IoFileType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
126 IoFileType->Dump = NULL;
127 IoFileType->Open = NULL;
128 IoFileType->Close = IopCloseFile;
129 IoFileType->Delete = IopDeleteFile;
130 IoFileType->Parse = NULL;
131 IoFileType->Security = NULL;
132 IoFileType->QueryName = NULL;
133 IoFileType->OkayToClose = NULL;
134 IoFileType->Create = IopCreateFile;
135
136 RtlInitAnsiString(&AnsiString,"File");
137 RtlAnsiStringToUnicodeString(&IoFileType->TypeName,&AnsiString,TRUE);
138
139 /*
140 * Create the device directory
141 */
142 RtlInitAnsiString(&AnsiString,"\\Device");
143 RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
144 InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
145 ZwCreateDirectoryObject(&handle,0,&attr);
146
147 RtlInitAnsiString(&AnsiString,"\\??");
148 RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
149 InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
150 ZwCreateDirectoryObject(&handle,0,&attr);
151
152 IoInitCancelHandling();
153 IoInitSymbolicLinkImplementation();
154 IoInitFileSystemImplementation();
155 }