/* $Id$ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/iomgr.c * PURPOSE: Initializes the io manager * PROGRAMMER: David Welch (welch@mcmail.com) * REVISION HISTORY: * 29/07/98: Created */ /* INCLUDES ****************************************************************/ #include #include #include #include #include #define NDEBUG #include /* GLOBALS *******************************************************************/ #define TAG_DEVICE_TYPE TAG('D', 'E', 'V', 'T') #define TAG_FILE_TYPE TAG('F', 'I', 'L', 'E') /* DATA ********************************************************************/ POBJECT_TYPE EXPORTED IoDeviceObjectType = NULL; POBJECT_TYPE EXPORTED IoFileObjectType = NULL; #ifndef LIBCAPTIVE ULONG EXPORTED IoReadOperationCount = 0; /* FIXME: unknown type */ ULONG EXPORTED IoReadTransferCount = 0; /* FIXME: unknown type */ ULONG EXPORTED IoWriteOperationCount = 0; /* FIXME: unknown type */ ULONG EXPORTED IoWriteTransferCount = 0; /* FIXME: unknown type */ ULONG EXPORTED IoStatisticsLock = 0; /* FIXME: unknown type */ #endif /* LIBCAPTIVE */ static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS}; /* FUNCTIONS ****************************************************************/ VOID STDCALL IopCloseFile(PVOID ObjectBody, ULONG HandleCount) { PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody; PIRP Irp; PIO_STACK_LOCATION StackPtr; NTSTATUS Status; DPRINT("IopCloseFile()\n"); if (HandleCount > 0 || FileObject->DeviceObject == NULL) { return; } ObReferenceObjectByPointer(FileObject, STANDARD_RIGHTS_REQUIRED, IoFileObjectType, UserMode); KeResetEvent( &FileObject->Event ); Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP, FileObject->DeviceObject, NULL, 0, NULL, NULL, NULL); StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr->FileObject = FileObject; Status = IoCallDriver(FileObject->DeviceObject, Irp); if (Status == STATUS_PENDING) { KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL); } } VOID STDCALL IopDeleteFile(PVOID ObjectBody) { PFILE_OBJECT FileObject = (PFILE_OBJECT)ObjectBody; PIRP Irp; PIO_STACK_LOCATION StackPtr; NTSTATUS Status; DPRINT("IopDeleteFile()\n"); if (FileObject->DeviceObject) { ObReferenceObjectByPointer(ObjectBody, STANDARD_RIGHTS_REQUIRED, IoFileObjectType, UserMode); KeResetEvent( &FileObject->Event ); Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE, FileObject->DeviceObject, NULL, 0, NULL, NULL, NULL); StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr->FileObject = FileObject; Status = IoCallDriver(FileObject->DeviceObject, Irp); if (Status == STATUS_PENDING) { KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL); } } if (FileObject->FileName.Buffer != NULL) { ExFreePool(FileObject->FileName.Buffer); FileObject->FileName.Buffer = 0; } } VOID IoInit (VOID) { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING DirName; #ifndef LIBCAPTIVE UNICODE_STRING LinkName; #endif /* LIBCAPTIVE */ HANDLE Handle; #ifndef LIBCAPTIVE IopInitDriverImplementation(); #endif /* LIBCAPTIVE */ /* * Register iomgr types: DeviceObjectType */ IoDeviceObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE)); IoDeviceObjectType->Tag = TAG_DEVICE_TYPE; IoDeviceObjectType->TotalObjects = 0; IoDeviceObjectType->TotalHandles = 0; IoDeviceObjectType->MaxObjects = ULONG_MAX; IoDeviceObjectType->MaxHandles = ULONG_MAX; IoDeviceObjectType->PagedPoolCharge = 0; IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT); IoDeviceObjectType->Mapping = &IopFileMapping; IoDeviceObjectType->Dump = NULL; IoDeviceObjectType->Open = NULL; IoDeviceObjectType->Close = NULL; IoDeviceObjectType->Delete = NULL; IoDeviceObjectType->Parse = NULL; IoDeviceObjectType->Security = NULL; IoDeviceObjectType->QueryName = NULL; IoDeviceObjectType->OkayToClose = NULL; IoDeviceObjectType->Create = IopCreateDevice; IoDeviceObjectType->DuplicationNotify = NULL; RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device")); /* * Register iomgr types: FileObjectType * (alias DriverObjectType) */ IoFileObjectType = ExAllocatePool (NonPagedPool, sizeof (OBJECT_TYPE)); IoFileObjectType->Tag = TAG_FILE_TYPE; IoFileObjectType->TotalObjects = 0; IoFileObjectType->TotalHandles = 0; IoFileObjectType->MaxObjects = ULONG_MAX; IoFileObjectType->MaxHandles = ULONG_MAX; IoFileObjectType->PagedPoolCharge = 0; IoFileObjectType->NonpagedPoolCharge = sizeof(FILE_OBJECT); IoFileObjectType->Mapping = &IopFileMapping; IoFileObjectType->Dump = NULL; IoFileObjectType->Open = NULL; IoFileObjectType->Close = IopCloseFile; IoFileObjectType->Delete = IopDeleteFile; IoFileObjectType->Parse = NULL; IoFileObjectType->Security = NULL; IoFileObjectType->QueryName = NULL; IoFileObjectType->OkayToClose = NULL; IoFileObjectType->Create = IopCreateFile; IoFileObjectType->DuplicationNotify = NULL; RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File")); /* * Create the '\Driver' object directory */ RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Driver")); InitializeObjectAttributes(&ObjectAttributes, &DirName, 0, NULL, NULL); NtCreateDirectoryObject(&Handle, 0, &ObjectAttributes); /* * Create the '\FileSystem' object directory */ RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\FileSystem")); InitializeObjectAttributes(&ObjectAttributes, &DirName, 0, NULL, NULL); NtCreateDirectoryObject(&Handle, 0, &ObjectAttributes); /* * Create the '\Device' directory */ RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Device")); InitializeObjectAttributes(&ObjectAttributes, &DirName, 0, NULL, NULL); ZwCreateDirectoryObject(&Handle, 0, &ObjectAttributes); #ifndef LIBCAPTIVE /* * Create the '\??' directory */ RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\??")); InitializeObjectAttributes(&ObjectAttributes, &DirName, 0, NULL, NULL); ZwCreateDirectoryObject(&Handle, 0, &ObjectAttributes); /* * Create the '\ArcName' directory */ RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\ArcName")); InitializeObjectAttributes(&ObjectAttributes, &DirName, 0, NULL, NULL); ZwCreateDirectoryObject(&Handle, 0, &ObjectAttributes); /* * Initialize remaining subsubsystem */ IoInitCancelHandling(); IoInitSymbolicLinkImplementation(); #endif /* LIBCAPTIVE */ IoInitFileSystemImplementation(); IoInitVpbImplementation(); IoInitShutdownNotification(); /* * Create link from '\DosDevices' to '\??' directory */ #ifndef LIBCAPTIVE RtlInitUnicodeStringFromLiteral(&LinkName, L"\\DosDevices"); RtlInitUnicodeStringFromLiteral(&DirName, L"\\??"); IoCreateSymbolicLink(&LinkName, &DirName); /* * Initialize PnP manager */ PnpInit(); #endif /* LIBCAPTIVE */ } PGENERIC_MAPPING STDCALL IoGetFileObjectGenericMapping(VOID) { return(&IopFileMapping); } /* EOF */