On 23/04/2021 13:44, Rémi Bernon wrote:
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.
Right, sorry for the mistake, will resend shortly.