bd9e1952229198dc162c8cdb150b6c80656d2f0f
[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 <windows.h>
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 POBJECT_TYPE IoDeviceType = NULL;
24 POBJECT_TYPE IoFileType = NULL;
25
26 /* FUNCTIONS ****************************************************************/
27
28 VOID IopCloseFile(PVOID ObjectBody, ULONG HandleCount)
29 {
30 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
31 PIRP Irp;
32 PIO_STACK_LOCATION StackPtr;
33 NTSTATUS Status;
34
35 if (HandleCount > 0)
36 {
37 return;
38 }
39
40 ObReferenceObjectByPointer(FileObject,
41 STANDARD_RIGHTS_REQUIRED,
42 IoFileType,
43 UserMode);
44
45 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
46 FileObject->DeviceObject,
47 NULL,
48 0,
49 NULL,
50 NULL,
51 NULL);
52 StackPtr = IoGetNextIrpStackLocation(Irp);
53 StackPtr->FileObject = FileObject;
54
55 Status = IoCallDriver(FileObject->DeviceObject, Irp);
56 }
57
58 VOID IopDeleteFile(PVOID ObjectBody)
59 {
60 PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody;
61 PIRP Irp;
62 PIO_STACK_LOCATION StackPtr;
63 NTSTATUS Status;
64
65 ObReferenceObjectByPointer(ObjectBody,
66 STANDARD_RIGHTS_REQUIRED,
67 IoFileType,
68 UserMode);
69
70 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
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
82 if (FileObject->FileName.Buffer != NULL)
83 {
84 ExFreePool(FileObject->FileName.Buffer);
85 }
86 }
87
88 VOID IoInit(VOID)
89 {
90 OBJECT_ATTRIBUTES attr;
91 HANDLE handle;
92 UNICODE_STRING UnicodeString;
93 ANSI_STRING AnsiString;
94
95 /*
96 * Register iomgr types
97 */
98 IoDeviceType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
99
100 IoDeviceType->TotalObjects = 0;
101 IoDeviceType->TotalHandles = 0;
102 IoDeviceType->MaxObjects = ULONG_MAX;
103 IoDeviceType->MaxHandles = ULONG_MAX;
104 IoDeviceType->PagedPoolCharge = 0;
105 IoDeviceType->NonpagedPoolCharge = sizeof(DEVICE_OBJECT);
106 IoDeviceType->Dump = NULL;
107 IoDeviceType->Open = NULL;
108 IoDeviceType->Close = NULL;
109 IoDeviceType->Delete = NULL;
110 IoDeviceType->Parse = NULL;
111 IoDeviceType->Security = NULL;
112 IoDeviceType->QueryName = NULL;
113 IoDeviceType->OkayToClose = NULL;
114 IoDeviceType->Create = IopCreateDevice;
115
116 RtlInitAnsiString(&AnsiString,"Device");
117 RtlAnsiStringToUnicodeString(&IoDeviceType->TypeName,&AnsiString,TRUE);
118
119 IoFileType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
120
121 IoFileType->TotalObjects = 0;
122 IoFileType->TotalHandles = 0;
123 IoFileType->MaxObjects = ULONG_MAX;
124 IoFileType->MaxHandles = ULONG_MAX;
125 IoFileType->PagedPoolCharge = 0;
126 IoFileType->NonpagedPoolCharge = sizeof(FILE_OBJECT);
127 IoFileType->Dump = NULL;
128 IoFileType->Open = NULL;
129 IoFileType->Close = IopCloseFile;
130 IoFileType->Delete = IopDeleteFile;
131 IoFileType->Parse = NULL;
132 IoFileType->Security = NULL;
133 IoFileType->QueryName = NULL;
134 IoFileType->OkayToClose = NULL;
135 IoFileType->Create = IopCreateFile;
136
137 RtlInitAnsiString(&AnsiString,"File");
138 RtlAnsiStringToUnicodeString(&IoFileType->TypeName,&AnsiString,TRUE);
139
140 /*
141 * Create the device directory
142 */
143 RtlInitAnsiString(&AnsiString,"\\Device");
144 RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
145 InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
146 ZwCreateDirectoryObject(&handle,0,&attr);
147
148 RtlInitAnsiString(&AnsiString,"\\??");
149 RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
150 InitializeObjectAttributes(&attr,&UnicodeString,0,NULL,NULL);
151 ZwCreateDirectoryObject(&handle,0,&attr);
152
153 IoInitCancelHandling();
154 IoInitSymbolicLinkImplementation();
155 IoInitFileSystemImplementation();
156 }