[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