Author: ion Date: Wed Jul 5 23:55:25 2006 New Revision: 22868
URL: http://svn.reactos.org/svn/reactos?rev=22868&view=rev Log: [FORMATTING] - Fix formatting in IoCreateFile
Modified: trunk/reactos/ntoskrnl/io/iomgr/file.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/file.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/file.c?re... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/file.c (original) +++ trunk/reactos/ntoskrnl/io/iomgr/file.c Wed Jul 5 23:55:25 2006 @@ -795,199 +795,121 @@ }
/* - * NAME EXPORTED - * IoCreateFile@56 - * - * DESCRIPTION - * Either causes a new file or directory to be created, or it - * opens an existing file, device, directory or volume, giving - * the caller a handle for the file object. This handle can be - * used by subsequent calls to manipulate data within the file - * or the file object's state of attributes. - * - * ARGUMENTS - * FileHandle (OUT) - * Points to a variable which receives the file handle - * on return; - * - * DesiredAccess - * Desired access to the file; - * - * ObjectAttributes - * Structure describing the file; - * - * IoStatusBlock (OUT) - * Receives information about the operation on return; - * - * AllocationSize [OPTIONAL] - * Initial size of the file in bytes; - * - * FileAttributes - * Attributes to create the file with; - * - * ShareAccess - * Type of shared access the caller would like to the - * file; - * - * CreateDisposition - * Specifies what to do, depending on whether the - * file already exists; - * - * CreateOptions - * Options for creating a new file; - * - * EaBuffer [OPTIONAL] - * Undocumented; - * - * EaLength - * Undocumented; - * - * CreateFileType - * Type of file (normal, named pipe, mailslot) to create; - * - * ExtraCreateParameters [OPTIONAL] - * Additional creation data for named pipe and mailsots; - * - * Options - * Undocumented. - * - * RETURN VALUE - * Status - * - * NOTE - * Prototype taken from Bo Branten's ntifs.h v15. - * Description taken from old NtCreateFile's which is - * now a wrapper of this call. - * - * REVISIONS - * * @implemented */ NTSTATUS -STDCALL -IoCreateFile(OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, +NTAPI +IoCreateFile(OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG CreateDisposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength, IN CREATE_FILE_TYPE CreateFileType, - IN PVOID ExtraCreateParameters OPTIONAL, - IN ULONG Options) -{ - PFILE_OBJECT FileObject = NULL; - //PDEVICE_OBJECT DeviceObject; - PIRP Irp; - PEXTENDED_IO_STACK_LOCATION StackLoc; - IO_SECURITY_CONTEXT SecurityContext; - KPROCESSOR_MODE AccessMode; - HANDLE LocalHandle; - LARGE_INTEGER SafeAllocationSize; - PVOID SystemEaBuffer = NULL; - NTSTATUS Status = STATUS_SUCCESS; - AUX_DATA AuxData; - ACCESS_STATE AccessState; + IN PVOID ExtraCreateParameters OPTIONAL, + IN ULONG Options) +{ + PFILE_OBJECT FileObject = NULL; + PIRP Irp; + PEXTENDED_IO_STACK_LOCATION StackLoc; + IO_SECURITY_CONTEXT SecurityContext; + KPROCESSOR_MODE AccessMode; + HANDLE LocalHandle = 0; + LARGE_INTEGER SafeAllocationSize; + PVOID SystemEaBuffer = NULL; + NTSTATUS Status = STATUS_SUCCESS; + AUX_DATA AuxData; + ACCESS_STATE AccessState; KIRQL OldIrql; PKNORMAL_ROUTINE NormalRoutine; PVOID NormalContext; - - DPRINT("IoCreateFile(FileHandle 0x%p, DesiredAccess %x, " - "ObjectAttributes 0x%p ObjectAttributes->ObjectName->Buffer %S)\n", - FileHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes->ObjectName->Buffer); - - ASSERT_IRQL(PASSIVE_LEVEL); - - if (IoStatusBlock == NULL || FileHandle == NULL) - return STATUS_ACCESS_VIOLATION; - - LocalHandle = 0; - - if(Options & IO_NO_PARAMETER_CHECKING) - AccessMode = KernelMode; - else - AccessMode = ExGetPreviousMode(); - - if(AccessMode != KernelMode) - { - _SEH_TRY - { - ProbeForWriteHandle(FileHandle); - ProbeForWrite(IoStatusBlock, - sizeof(IO_STATUS_BLOCK), - sizeof(ULONG)); - if(AllocationSize != NULL) - { - SafeAllocationSize = ProbeForReadLargeInteger(AllocationSize); - } - else - SafeAllocationSize.QuadPart = 0; - - if(EaBuffer != NULL && EaLength > 0) - { - ProbeForRead(EaBuffer, - EaLength, - sizeof(ULONG)); - - /* marshal EaBuffer */ - SystemEaBuffer = ExAllocatePool(NonPagedPool, - EaLength); - if(SystemEaBuffer == NULL) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - _SEH_LEAVE; - } - - RtlCopyMemory(SystemEaBuffer, - EaBuffer, - EaLength); - } - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if(!NT_SUCCESS(Status)) - { - return Status; - } - } - else - { - if(AllocationSize != NULL) - SafeAllocationSize = *AllocationSize; - else - SafeAllocationSize.QuadPart = 0; - - if(EaBuffer != NULL && EaLength > 0) - { - SystemEaBuffer = EaBuffer; - } - } - - if(Options & IO_CHECK_CREATE_PARAMETERS) - { - DPRINT1("FIXME: IO_CHECK_CREATE_PARAMETERS not yet supported!\n"); - } - - RtlMapGenericMask(&DesiredAccess, &IoFileObjectType->TypeInfo.GenericMapping); - - /* First try to open an existing named object */ - Status = ObOpenObjectByName(ObjectAttributes, - NULL, - AccessMode, - NULL, - DesiredAccess, - NULL, - &LocalHandle); - + PAGED_CODE(); + + if(Options & IO_NO_PARAMETER_CHECKING) + { + AccessMode = KernelMode; + } + else + { + AccessMode = ExGetPreviousMode(); + } + + if(AccessMode != KernelMode) + { + _SEH_TRY + { + ProbeForWriteHandle(FileHandle); + ProbeForWrite(IoStatusBlock, + sizeof(IO_STATUS_BLOCK), + sizeof(ULONG)); + if (AllocationSize) + { + SafeAllocationSize = ProbeForReadLargeInteger(AllocationSize); + } + else + { + SafeAllocationSize.QuadPart = 0; + } + + if ((EaBuffer) && (EaLength)) + { + ProbeForRead(EaBuffer, + EaLength, + sizeof(ULONG)); + + /* marshal EaBuffer */ + SystemEaBuffer = ExAllocatePool(NonPagedPool, EaLength); + if(!SystemEaBuffer) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + _SEH_LEAVE; + } + + RtlCopyMemory(SystemEaBuffer, EaBuffer, EaLength); + } + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + if(!NT_SUCCESS(Status)) return Status; + } + else + { + if (AllocationSize) + { + SafeAllocationSize = *AllocationSize; + } + else + { + SafeAllocationSize.QuadPart = 0; + } + + if ((EaBuffer) && (EaLength)) SystemEaBuffer = EaBuffer; + } + + if(Options & IO_CHECK_CREATE_PARAMETERS) + { + DPRINT1("FIXME: IO_CHECK_CREATE_PARAMETERS not yet supported!\n"); + } + + RtlMapGenericMask(&DesiredAccess, &IoFileObjectType->TypeInfo.GenericMapping); + + /* First try to open an existing named object */ + Status = ObOpenObjectByName(ObjectAttributes, + NULL, + AccessMode, + NULL, + DesiredAccess, + NULL, + &LocalHandle); ObReferenceObjectByHandle(LocalHandle, DesiredAccess, NULL, @@ -999,10 +921,6 @@ FileObject->Type = IO_TYPE_FILE; FileObject->Size = sizeof(FILE_OBJECT);
- // - // stop stuff that should be in IopParseDevice - // - if (CreateOptions & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT)) { @@ -1034,107 +952,84 @@ { FileObject->Flags |= FO_OPENED_CASE_SENSITIVE; } - /* - * FIXME: We should get the access state from Ob once this function becomes - * a parse routine once the Ob is refactored. - */ - SeCreateAccessState(&AccessState, &AuxData, FILE_ALL_ACCESS, NULL); - - SecurityContext.SecurityQos = NULL; /* ?? */ - SecurityContext.AccessState = &AccessState; - SecurityContext.DesiredAccess = DesiredAccess; - SecurityContext.FullCreateOptions = CreateOptions; - - KeInitializeEvent(&FileObject->Lock, SynchronizationEvent, TRUE); - KeInitializeEvent(&FileObject->Event, NotificationEvent, FALSE); - - DPRINT("FileObject 0x%p\n", FileObject); - DPRINT("FileObject->DeviceObject 0x%p\n", FileObject->DeviceObject); - /* - * Create a new IRP to hand to - * the FS driver: this may fail - * due to resource shortage. - */ - Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, FALSE); - if (Irp == NULL) - { - ZwClose(LocalHandle); - return STATUS_UNSUCCESSFUL; - } - - /* Now set the IRP data */ - Irp->Tail.Overlay.OriginalFileObject = FileObject; - Irp->RequestorMode = AccessMode; - Irp->Flags = IRP_CREATE_OPERATION | - IRP_SYNCHRONOUS_API | - IRP_DEFER_IO_COMPLETION; - Irp->Tail.Overlay.Thread = PsGetCurrentThread(); - Irp->UserEvent = &FileObject->Event; - Irp->UserIosb = IoStatusBlock; - Irp->MdlAddress = NULL; - Irp->PendingReturned = FALSE; - Irp->UserEvent = NULL; - Irp->Cancel = FALSE; - Irp->CancelRoutine = NULL; - Irp->Tail.Overlay.AuxiliaryBuffer = NULL; - - /* - * Get the stack location for the new - * IRP and prepare it. - */ - StackLoc = (PEXTENDED_IO_STACK_LOCATION)IoGetNextIrpStackLocation(Irp); - StackLoc->Control = 0; - StackLoc->FileObject = FileObject; - - switch (CreateFileType) - { - default: - case CreateFileTypeNone: - StackLoc->MajorFunction = IRP_MJ_CREATE; - StackLoc->Flags = Options; - StackLoc->Parameters.Create.EaLength = SystemEaBuffer != NULL ? EaLength : 0; - StackLoc->Flags |= !(ObjectAttributes->Attributes & OBJ_CASE_INSENSITIVE) ? SL_CASE_SENSITIVE: 0; - break; - - case CreateFileTypeNamedPipe: - StackLoc->MajorFunction = IRP_MJ_CREATE_NAMED_PIPE; - StackLoc->Parameters.CreatePipe.Parameters = ExtraCreateParameters; - break; - - case CreateFileTypeMailslot: - StackLoc->MajorFunction = IRP_MJ_CREATE_MAILSLOT; - StackLoc->Parameters.CreateMailslot.Parameters = ExtraCreateParameters; - break; - } - - /* Set the common data */ - Irp->Overlay.AllocationSize = SafeAllocationSize; - Irp->AssociatedIrp.SystemBuffer = SystemEaBuffer; - StackLoc->Parameters.Create.Options = (CreateDisposition << 24) | (CreateOptions & 0x00FFFFFF); - StackLoc->Parameters.Create.FileAttributes = FileAttributes; - StackLoc->Parameters.Create.ShareAccess = ShareAccess; - StackLoc->Parameters.Create.SecurityContext = &SecurityContext; - - /* - * Now call the driver and - * possibly wait if it can - * not complete the request - * immediately. - */ - Status = IofCallDriver(FileObject->DeviceObject, Irp ); - DPRINT("Status :%x\n", Status); - - if (Status == STATUS_PENDING) - { - KeWaitForSingleObject(&FileObject->Event, - Executive, - AccessMode, - FALSE, - NULL); - Status = IoStatusBlock->Status; - } - else - { + + SeCreateAccessState(&AccessState, &AuxData, FILE_ALL_ACCESS, NULL); + SecurityContext.SecurityQos = NULL; /* ?? */ + SecurityContext.AccessState = &AccessState; + SecurityContext.DesiredAccess = DesiredAccess; + SecurityContext.FullCreateOptions = CreateOptions; + + KeInitializeEvent(&FileObject->Lock, SynchronizationEvent, TRUE); + KeInitializeEvent(&FileObject->Event, NotificationEvent, FALSE); + + Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, FALSE); + if (!Irp) + { + ZwClose(LocalHandle); + return STATUS_UNSUCCESSFUL; + } + + /* Now set the IRP data */ + Irp->Tail.Overlay.OriginalFileObject = FileObject; + Irp->RequestorMode = AccessMode; + Irp->Flags = IRP_CREATE_OPERATION | + IRP_SYNCHRONOUS_API | + IRP_DEFER_IO_COMPLETION; + Irp->Tail.Overlay.Thread = PsGetCurrentThread(); + Irp->UserEvent = &FileObject->Event; + Irp->UserIosb = IoStatusBlock; + Irp->MdlAddress = NULL; + Irp->PendingReturned = FALSE; + Irp->UserEvent = NULL; + Irp->Cancel = FALSE; + Irp->CancelRoutine = NULL; + Irp->Tail.Overlay.AuxiliaryBuffer = NULL; + + StackLoc = (PEXTENDED_IO_STACK_LOCATION)IoGetNextIrpStackLocation(Irp); + StackLoc->Control = 0; + StackLoc->FileObject = FileObject; + + switch (CreateFileType) + { + default: + case CreateFileTypeNone: + StackLoc->MajorFunction = IRP_MJ_CREATE; + StackLoc->Flags = Options; + StackLoc->Parameters.Create.EaLength = SystemEaBuffer != NULL ? EaLength : 0; + StackLoc->Flags |= !(ObjectAttributes->Attributes & OBJ_CASE_INSENSITIVE) ? SL_CASE_SENSITIVE: 0; + break; + + case CreateFileTypeNamedPipe: + StackLoc->MajorFunction = IRP_MJ_CREATE_NAMED_PIPE; + StackLoc->Parameters.CreatePipe.Parameters = ExtraCreateParameters; + break; + + case CreateFileTypeMailslot: + StackLoc->MajorFunction = IRP_MJ_CREATE_MAILSLOT; + StackLoc->Parameters.CreateMailslot.Parameters = ExtraCreateParameters; + break; + } + + /* Set the common data */ + Irp->Overlay.AllocationSize = SafeAllocationSize; + Irp->AssociatedIrp.SystemBuffer = SystemEaBuffer; + StackLoc->Parameters.Create.Options = (CreateDisposition << 24) | (CreateOptions & 0x00FFFFFF); + StackLoc->Parameters.Create.FileAttributes = FileAttributes; + StackLoc->Parameters.Create.ShareAccess = ShareAccess; + StackLoc->Parameters.Create.SecurityContext = &SecurityContext; + + Status = IofCallDriver(FileObject->DeviceObject, Irp ); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&FileObject->Event, + Executive, + AccessMode, + FALSE, + NULL); + Status = IoStatusBlock->Status; + } + else + { /* We'll have to complete it ourselves */ ASSERT(!Irp->PendingReturned); KeRaiseIrql(APC_LEVEL, &OldIrql); @@ -1144,38 +1039,34 @@ (PVOID*)&FileObject, &NormalContext); KeLowerIrql(OldIrql); - } - if (!NT_SUCCESS(Status)) - { - DPRINT("Failing create request with status %x\n", Status); - FileObject->DeviceObject = NULL; - FileObject->Vpb = NULL; - ObDereferenceObject(FileObject); - } - else - { - _SEH_TRY - { - *FileHandle = LocalHandle; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - } - - /* cleanup EABuffer if captured */ - if(AccessMode != KernelMode && SystemEaBuffer != NULL) - { - ExFreePool(SystemEaBuffer); - } - - ASSERT_IRQL(PASSIVE_LEVEL); - - DPRINT("Finished IoCreateFile() (*FileHandle) 0x%p\n", (*FileHandle)); - - return Status; + } + + if (!NT_SUCCESS(Status)) + { + FileObject->DeviceObject = NULL; + FileObject->Vpb = NULL; + ObDereferenceObject(FileObject); + } + else + { + _SEH_TRY + { + *FileHandle = LocalHandle; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + } + + /* cleanup EABuffer if captured */ + if (AccessMode != KernelMode && (SystemEaBuffer)) + { + ExFreePool(SystemEaBuffer); + } + + return Status; }
/*