From 921d0b1fefd3e44a3109bb03a15ad6511dd21b32 Mon Sep 17 00:00:00 2001 From: midipix Date: Dec 23 2016 09:36:59 +0000 Subject: __ntapi_tt_stat(): clean-up, simplify logic. --- diff --git a/include/ntapi/nt_stat.h b/include/ntapi/nt_stat.h index 94890b5..ba88168 100644 --- a/include/ntapi/nt_stat.h +++ b/include/ntapi/nt_stat.h @@ -23,8 +23,7 @@ typedef struct _nt_stat { nt_falii falii; nt_fssi fssi; void * hfile; - uint32_t flags_in; - uint32_t flags_out; + uint32_t flags; uint32_t file_name_length; uint32_t file_name_hash; uint32_t dev_name_hash; diff --git a/src/fs/ntapi_tt_stat.c b/src/fs/ntapi_tt_stat.c index 9ad9975..f6b5849 100644 --- a/src/fs/ntapi_tt_stat.c +++ b/src/fs/ntapi_tt_stat.c @@ -32,10 +32,12 @@ int32_t __stdcall __ntapi_tt_stat( /* validation */ if (!hfile && !path) - return NT_STATUS_INVALID_HANDLE; + return NT_STATUS_INVALID_PARAMETER; /* hfile */ - if (!hfile) { + if (hfile) { + stat->flags = 0; + } else { /* oa */ oa.len = sizeof(nt_oa); oa.root_dir = hroot; @@ -45,55 +47,50 @@ int32_t __stdcall __ntapi_tt_stat( oa.sec_qos = 0; /* open file/folder */ - status = __ntapi->zw_open_file( - &hfile, - NT_SEC_SYNCHRONIZE | NT_FILE_READ_ATTRIBUTES | NT_FILE_READ_ACCESS, - &oa, - &iosb, - NT_FILE_SHARE_READ | NT_FILE_SHARE_WRITE, - open_options | NT_FILE_SYNCHRONOUS_IO_ALERT); - - if (status != NT_STATUS_SUCCESS) + if ((status = __ntapi->zw_open_file( + &hfile, + NT_SEC_SYNCHRONIZE + | NT_FILE_READ_ATTRIBUTES + | NT_FILE_READ_ACCESS, + &oa, + &iosb, + NT_FILE_SHARE_READ | NT_FILE_SHARE_WRITE, + open_options | NT_FILE_SYNCHRONOUS_IO_ALERT))) return status; - stat->flags_out = NT_STAT_NEW_HANDLE; + stat->flags = NT_STAT_NEW_HANDLE; } - stat->hfile = hfile; - stat->flags_in = flags; + stat->hfile = hfile; /* system-unique device name */ - status = __ntapi->zw_query_information_file( - hfile, - &iosb, - buffer, - buffer_size, - NT_FILE_ALL_INFORMATION); - - if (status != NT_STATUS_SUCCESS) + if ((status = __ntapi->zw_query_information_file( + hfile, + &iosb, + buffer, + buffer_size, + NT_FILE_ALL_INFORMATION))) return status; /* copy file info minus name */ - fai = (nt_fai *)buffer; __ntapi->tt_aligned_block_memcpy( (uintptr_t *)stat, - (uintptr_t *)fai, + (uintptr_t *)buffer, ((size_t)(&((nt_fai *)0)->name_info))); /* record the file name length, but do not hash */ + fai = (nt_fai *)buffer; stat->file_name_length = fai->name_info.file_name_length; stat->file_name_hash = 0; /* file system size information */ - status = __ntapi->zw_query_volume_information_file( - hfile, - &iosb, - &(stat->fssi), - sizeof(stat->fssi), - NT_FILE_FS_SIZE_INFORMATION); - - if (status != NT_STATUS_SUCCESS) + if ((status = __ntapi->zw_query_volume_information_file( + hfile, + &iosb, + &(stat->fssi), + sizeof(stat->fssi), + NT_FILE_FS_SIZE_INFORMATION))) return status; /* system-unique device name */ @@ -126,9 +123,9 @@ int32_t __stdcall __ntapi_tt_stat( && (wch[9]=='u') && (wch[10]=='p') && (wch[11]=='\\')) { - stat->flags_out |= NT_STAT_MUP_DEVICE; wch_mark = &wch[12]; hash = __DEVICE_MUP_PREFIX_HASH; + stat->flags |= NT_STAT_MUP_DEVICE; } else { wch_mark = &wch[8]; hash = __DEVICE_PATH_PREFIX_HASH; @@ -142,17 +139,18 @@ int32_t __stdcall __ntapi_tt_stat( hash,wch_mark, sizeof(wchar16_t)*(wch-wch_mark)); - if (flags & NT_STAT_DEV_NAME_COPY) { - if (stat->dev_name_maxlen < sdev->strlen) - /* does not justify failure */ - *stat->dev_name = 0; - else - __ntapi->tt_memcpy_utf16( - (wchar16_t *)stat->dev_name, - (wchar16_t *)sdev->buffer, - stat->dev_name_strlen); - } else + if (!(flags & NT_STAT_DEV_NAME_COPY)) { *stat->dev_name = 0; + return NT_STATUS_SUCCESS; + } else if (stat->dev_name_maxlen < sdev->strlen) { + *stat->dev_name = 0; + return NT_STATUS_BUFFER_TOO_SMALL; + } + + __ntapi->tt_memcpy_utf16( + (wchar16_t *)stat->dev_name, + (wchar16_t *)sdev->buffer, + stat->dev_name_strlen); - return status; + return NT_STATUS_SUCCESS; }