[PATCH v6 4/4] ntdll: Allow renaming a file/directory to a different casing of itself.
Rémi Bernon
rbernon at codeweavers.com
Fri Apr 23 05:44:02 CDT 2021
On 4/22/21 3:00 PM, Gabriel Ivăncescu wrote:
>
> +/***********************************************************************
> + * nt_to_unix_file_name_with_casing
> + *
> + * Same as nt_to_unix_file_name, but additionally return unix file name
> + * without path, with the original casing from the NT file name.
> + */
> +static NTSTATUS nt_to_unix_file_name_with_casing( const OBJECT_ATTRIBUTES *attr, char **name_ret,
> + char **casing_ret, UINT disposition )
> +{
> + const WCHAR *nt_filename = attr->ObjectName->Buffer + attr->ObjectName->Length / sizeof(WCHAR);
> + NTSTATUS status;
> + char *casing;
> + int len;
> +
> + /* NT name may not be NUL terminated; look for last \ character */
> + for (; nt_filename != attr->ObjectName->Buffer; nt_filename--)
> + if (nt_filename[-1] == '\\')
> + break;
> + len = attr->ObjectName->Buffer + attr->ObjectName->Length / sizeof(WCHAR) - nt_filename;
> +
Nitpick: You could make it a bit less verbose by using len to store
attr->ObjectName->Length / sizeof(WCHAR)
instead of duplicating it here and above (initializing nt_filename in
the for, maybe).
> + if (!(casing = malloc( len * 3 ))) return STATUS_NO_MEMORY;
> +
> + status = nt_to_unix_file_name( attr, name_ret, disposition );
> + if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE)
> + {
> + free(casing);
Nitpick: it should probably be "free( casing )" to be consistent.
> + return status;
> + }
> +
> + len = ntdll_wcstoumbs( nt_filename, len, casing, len * 3, TRUE );
> + if (len > 0)
> + casing[len] = 0;
Not a nitpick: we probably need +1 for the zero-termination in the
malloc for the worst case?
Otherwise I think it looks nice.
--
Rémi Bernon <rbernon at codeweavers.com>
More information about the wine-devel
mailing list