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(a)codeweavers.com>