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 ****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/ob.h>
16 #include <internal/io.h>
19 #include <internal/debug.h>
21 /* GLOBALS *******************************************************************/
23 POBJECT_TYPE IoDeviceType
= NULL
;
24 POBJECT_TYPE IoFileType
= NULL
;
26 /* FUNCTIONS ****************************************************************/
28 VOID
IopCloseFile(PVOID ObjectBody
, ULONG HandleCount
)
30 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
32 PIO_STACK_LOCATION StackPtr
;
40 ObReferenceObjectByPointer(FileObject
,
41 STANDARD_RIGHTS_REQUIRED
,
45 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP
,
46 FileObject
->DeviceObject
,
52 StackPtr
= IoGetNextIrpStackLocation(Irp
);
53 StackPtr
->FileObject
= FileObject
;
55 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
58 VOID
IopDeleteFile(PVOID ObjectBody
)
60 PFILE_OBJECT FileObject
= (PFILE_OBJECT
)ObjectBody
;
62 PIO_STACK_LOCATION StackPtr
;
65 ObReferenceObjectByPointer(ObjectBody
,
66 STANDARD_RIGHTS_REQUIRED
,
70 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE
,
71 FileObject
->DeviceObject
,
77 StackPtr
= IoGetNextIrpStackLocation(Irp
);
78 StackPtr
->FileObject
= FileObject
;
80 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
82 if (FileObject
->FileName
.Buffer
!= NULL
)
84 ExFreePool(FileObject
->FileName
.Buffer
);
90 OBJECT_ATTRIBUTES attr
;
92 UNICODE_STRING UnicodeString
;
93 ANSI_STRING AnsiString
;
96 * Register iomgr types
98 IoDeviceType
= ExAllocatePool(NonPagedPool
,sizeof(OBJECT_TYPE
));
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
;
116 RtlInitAnsiString(&AnsiString
,"Device");
117 RtlAnsiStringToUnicodeString(&IoDeviceType
->TypeName
,&AnsiString
,TRUE
);
119 IoFileType
= ExAllocatePool(NonPagedPool
,sizeof(OBJECT_TYPE
));
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
;
137 RtlInitAnsiString(&AnsiString
,"File");
138 RtlAnsiStringToUnicodeString(&IoFileType
->TypeName
,&AnsiString
,TRUE
);
141 * Create the device directory
143 RtlInitAnsiString(&AnsiString
,"\\Device");
144 RtlAnsiStringToUnicodeString(&UnicodeString
,&AnsiString
,TRUE
);
145 InitializeObjectAttributes(&attr
,&UnicodeString
,0,NULL
,NULL
);
146 ZwCreateDirectoryObject(&handle
,0,&attr
);
148 RtlInitAnsiString(&AnsiString
,"\\??");
149 RtlAnsiStringToUnicodeString(&UnicodeString
,&AnsiString
,TRUE
);
150 InitializeObjectAttributes(&attr
,&UnicodeString
,0,NULL
,NULL
);
151 ZwCreateDirectoryObject(&handle
,0,&attr
);
153 IoInitCancelHandling();
154 IoInitSymbolicLinkImplementation();
155 IoInitFileSystemImplementation();