/* Handle Cygwin edge case of re-opening FileObject by handle by passing in only existing Handle we deflect the call to ObDuplicateObject because we don't need OpenPacket or other calls in this case. We have all we need for this already. */ /* caller provided a handle, no ObjectName in ObjectAttributes, detect this combination and execute different code branch */ if ((ObjectAttributes->ObjectName->Length <= 1 || (!ObjectAttributes->ObjectName->Length) || (!ObjectAttributes->ObjectName) || (!ObjectAttributes->ObjectName->Buffer)) && (ObjectAttributes->RootDirectory != 0) && (ObjectAttributes->RootDirectory != NULL)) { Status = ObReferenceObjectByHandle(NtCurrentProcess(), PROCESS_DUP_HANDLE, PsProcessType, PreviousMode, (PVOID*)&SourceProcess, NULL); if (!NT_SUCCESS(Status)) { DPRINT1("(PID %lx) IopCreateFile call to ObReferenceObjectByHandle for Source Process failed - status: %lx\n", PsGetCurrentProcessId(), Status); return Status; } Status = ObDuplicateObject(SourceProcess, ObjectAttributes->RootDirectory, SourceProcess, &LocalHandle, DesiredAccess, ObjectAttributes->Attributes, CreateOptions, PreviousMode); if (!NT_SUCCESS(Status)) { DPRINT1("(PID %lx) IopCreateFile call to ObDuplicateObject failed - status: %lx\n", PsGetCurrentProcessId(), Status); ObDereferenceObject(SourceProcess); return Status; } ObDereferenceObject(SourceProcess); if (AccessMode != KernelMode) { /* probe for write access for non-kernel mode */ _SEH2_TRY { /* Probe the output parameters */ ProbeForWriteHandle(FileHandle); ProbeForWriteIoStatusBlock(IoStatusBlock); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { /* Get the exception status */ Status = _SEH2_GetExceptionCode(); } _SEH2_END; } /* perform write back of handle and status information */ _SEH2_TRY { *FileHandle = LocalHandle; /* IoStatusBlock->Information = OpenPacket->Information; */ /* since we do not use Io for this calling mode set up 'fake' Io status and final status if we didn't crash before this point we succeeded */ IoStatusBlock->Status = STATUS_SUCCESS; Status = STATUS_SUCCESS; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { /* Get the exception status */ Status = _SEH2_GetExceptionCode(); } _SEH2_END; if (!NT_SUCCESS(Status)) { if (LocalHandle != 0) { DPRINT1("(PID %lx) IopCreateFile Completed status != NT_SUCCESS - returning status: 0x%lx handle: %p FileName: %wZ \n", PsGetCurrentProcessId(), Status, LocalHandle, ObjectAttributes->ObjectName ); } else { DPRINT1("(PID %lx) IopCreateFile Completed status != NT_SUCCESS - returning status: 0x%lx handle: 0x0 FileName: %wZ \n", PsGetCurrentProcessId(), Status, ObjectAttributes->ObjectName ); } } return Status; } /* cygwin edge case conde branch ends here */