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.