[PATCH] kernelbase: Implement ReOpenFile().
Alexandre Julliard
julliard at winehq.org
Mon Jan 27 09:28:56 CST 2020
Zebediah Figura <z.figura12 at gmail.com> writes:
> @@ -2550,10 +2553,60 @@ HANDLE WINAPI DECLSPEC_HOTPATCH OpenFileById( HANDLE handle, LPFILE_ID_DESCRIPTO
> /***********************************************************************
> * ReOpenFile (kernelbase.@)
> */
> -HANDLE WINAPI /* DECLSPEC_HOTPATCH */ ReOpenFile( HANDLE handle, DWORD access, DWORD sharing, DWORD flags )
> +HANDLE WINAPI DECLSPEC_HOTPATCH ReOpenFile( HANDLE handle, DWORD access, DWORD sharing, DWORD attributes )
> {
> - FIXME( "(%p, %d, %d, %d): stub\n", handle, access, sharing, flags );
> - return INVALID_HANDLE_VALUE;
> + SECURITY_QUALITY_OF_SERVICE qos;
> + OBJECT_NAME_INFORMATION *name;
> + OBJECT_ATTRIBUTES attr = {};
> + IO_STATUS_BLOCK io;
> + NTSTATUS status;
> + HANDLE file;
> + DWORD size;
> +
> + TRACE("handle %p, access %#x, sharing %#x, attributes %#x.\n", handle, access, sharing, attributes);
> +
> + if (attributes & 0x7ffff) /* FILE_ATTRIBUTE_* flags are invalid */
> + {
> + SetLastError(ERROR_INVALID_PARAMETER);
> + return INVALID_HANDLE_VALUE;
> + }
> +
> + status = NtQueryObject( handle, ObjectNameInformation, NULL, 0, &size );
> + if (status != STATUS_INFO_LENGTH_MISMATCH && !set_ntstatus( status ))
> + return INVALID_HANDLE_VALUE;
> +
> + if (!(name = RtlAllocateHeap( GetProcessHeap(), 0, size )))
> + {
> + SetLastError( ERROR_NOT_ENOUGH_MEMORY );
> + return INVALID_HANDLE_VALUE;
> + }
> +
> + status = NtQueryObject( handle, ObjectNameInformation, name, size, NULL );
> + if (!set_ntstatus( status ))
> + return INVALID_HANDLE_VALUE;
> +
> + if (attributes & FILE_FLAG_DELETE_ON_CLOSE)
> + access |= DELETE;
It should be possible to reopen the file by using the handle as a root
directory with an empty name, so that you don't need to retrieve the
full name (which may have changed).
--
Alexandre Julliard
julliard at winehq.org
More information about the wine-devel
mailing list