Zebediah Figura z.figura12@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).