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)
11 /* INCLUDES ****************************************************************/
13 #include <ddk/ntddk.h>
14 #include <internal/ob.h>
15 #include <internal/io.h>
18 #include <internal/debug.h>
20 /* GLOBALS *******************************************************************/
22 POBJECT_TYPE IoDeviceType
= NULL
;
23 POBJECT_TYPE IoFileType
= NULL
;
25 /* FUNCTIONS ****************************************************************/
27 VOID
IopCloseFile(PVOID ObjectBody
, ULONG HandleCount
)
29 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
31 PIO_STACK_LOCATION StackPtr
;
39 ObReferenceObjectByPointer(FileObject
,
40 STANDARD_RIGHTS_REQUIRED
,
44 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP
,
45 FileObject
->DeviceObject
,
51 StackPtr
= IoGetNextIrpStackLocation(Irp
);
52 StackPtr
->FileObject
= FileObject
;
54 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
57 VOID
IopDeleteFile(PVOID ObjectBody
)
59 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
61 PIO_STACK_LOCATION StackPtr
;
64 ObReferenceObjectByPointer(ObjectBody
,
65 STANDARD_RIGHTS_REQUIRED
,
69 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE
,
70 FileObject
->DeviceObject
,
76 StackPtr
= IoGetNextIrpStackLocation(Irp
);
77 StackPtr
->FileObject
= FileObject
;
79 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
81 if (FileObject
->FileName
.Buffer
!= NULL
)
83 ExFreePool(FileObject
->FileName
.Buffer
);
89 OBJECT_ATTRIBUTES attr
;
91 UNICODE_STRING UnicodeString
;
92 ANSI_STRING AnsiString
;
95 * Register iomgr types
97 IoDeviceType
= ExAllocatePool(NonPagedPool
,sizeof(OBJECT_TYPE
));
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
;
115 RtlInitAnsiString(&AnsiString
,"Device");
116 RtlAnsiStringToUnicodeString(&IoDeviceType
->TypeName
,&AnsiString
,TRUE
);
118 IoFileType
= ExAllocatePool(NonPagedPool
,sizeof(OBJECT_TYPE
));
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
;
136 RtlInitAnsiString(&AnsiString
,"File");
137 RtlAnsiStringToUnicodeString(&IoFileType
->TypeName
,&AnsiString
,TRUE
);
140 * Create the device directory
142 RtlInitAnsiString(&AnsiString
,"\\Device");
143 RtlAnsiStringToUnicodeString(&UnicodeString
,&AnsiString
,TRUE
);
144 InitializeObjectAttributes(&attr
,&UnicodeString
,0,NULL
,NULL
);
145 ZwCreateDirectoryObject(&handle
,0,&attr
);
147 RtlInitAnsiString(&AnsiString
,"\\??");
148 RtlAnsiStringToUnicodeString(&UnicodeString
,&AnsiString
,TRUE
);
149 InitializeObjectAttributes(&attr
,&UnicodeString
,0,NULL
,NULL
);
150 ZwCreateDirectoryObject(&handle
,0,&attr
);
152 IoInitCancelHandling();
153 IoInitSymbolicLinkImplementation();
154 IoInitFileSystemImplementation();