* fhandler_disk_file.cc (fhandler_base::fstat_by_name): Use
NtQueryFullAttributesFile instead of FindFirstFile. (fhandler_base::fstat_fs): Drop check for exec_state. Drop check for invalid characters. * ntdll.h (struct _FILE_NETWORK_OPEN_INFORMATION): Define. (NtQueryFullAttributesFile): Declare.
This commit is contained in:
parent
91d2f6eebf
commit
e25b3402ac
@ -1,3 +1,12 @@
|
|||||||
|
2007-07-19 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler_disk_file.cc (fhandler_base::fstat_by_name): Use
|
||||||
|
NtQueryFullAttributesFile instead of FindFirstFile.
|
||||||
|
(fhandler_base::fstat_fs): Drop check for exec_state. Drop check for
|
||||||
|
invalid characters.
|
||||||
|
* ntdll.h (struct _FILE_NETWORK_OPEN_INFORMATION): Define.
|
||||||
|
(NtQueryFullAttributesFile): Declare.
|
||||||
|
|
||||||
2007-07-19 Corinna Vinschen <corinna@vinschen.de>
|
2007-07-19 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler.cc (fhandler_base::open): Drop local wpath and upath
|
* fhandler.cc (fhandler_base::open): Drop local wpath and upath
|
||||||
|
@ -272,34 +272,35 @@ fhandler_base::fstat_by_handle (struct __stat64 *buf)
|
|||||||
int __stdcall
|
int __stdcall
|
||||||
fhandler_base::fstat_by_name (struct __stat64 *buf)
|
fhandler_base::fstat_by_name (struct __stat64 *buf)
|
||||||
{
|
{
|
||||||
int res;
|
int res = -1;
|
||||||
HANDLE handle;
|
NTSTATUS status;
|
||||||
WIN32_FIND_DATA local;
|
OBJECT_ATTRIBUTES attr;
|
||||||
|
FILE_NETWORK_OPEN_INFORMATION fnoi;
|
||||||
|
|
||||||
if (!pc.exists ())
|
if (!pc.exists ())
|
||||||
{
|
{
|
||||||
debug_printf ("already determined that pc does not exist");
|
debug_printf ("already determined that pc does not exist");
|
||||||
set_errno (ENOENT);
|
set_errno (ENOENT);
|
||||||
res = -1;
|
|
||||||
}
|
}
|
||||||
else if ((handle = FindFirstFile (pc, &local)) != INVALID_HANDLE_VALUE)
|
else if (NT_SUCCESS (status = NtQueryFullAttributesFile (
|
||||||
|
pc.get_object_attr (attr, sec_none_nih), &fnoi)))
|
||||||
{
|
{
|
||||||
FindClose (handle);
|
|
||||||
if (pc.is_rep_symlink ())
|
if (pc.is_rep_symlink ())
|
||||||
local.dwFileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
|
fnoi.FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
|
||||||
pc.file_attributes (local.dwFileAttributes);
|
pc.file_attributes (fnoi.FileAttributes);
|
||||||
res = fstat_helper (buf,
|
res = fstat_helper (buf,
|
||||||
local.ftLastWriteTime, /* see fstat_helper comment */
|
*(FILETIME *) (fnoi.ChangeTime.QuadPart
|
||||||
local.ftLastAccessTime,
|
? &fnoi.ChangeTime
|
||||||
local.ftLastWriteTime,
|
: &fnoi.LastWriteTime),
|
||||||
local.ftCreationTime,
|
*(FILETIME *) &fnoi.LastAccessTime,
|
||||||
|
*(FILETIME *) &fnoi.LastWriteTime,
|
||||||
|
*(FILETIME *) &fnoi.CreationTime,
|
||||||
pc.volser (),
|
pc.volser (),
|
||||||
(ULONGLONG) local.nFileSizeHigh << 32
|
fnoi.EndOfFile.QuadPart,
|
||||||
| local.nFileSizeLow,
|
fnoi.AllocationSize.QuadPart,
|
||||||
-1LL,
|
|
||||||
0ULL,
|
0ULL,
|
||||||
1,
|
1,
|
||||||
local.dwFileAttributes);
|
fnoi.FileAttributes);
|
||||||
}
|
}
|
||||||
else if (pc.isdir ())
|
else if (pc.isdir ())
|
||||||
{
|
{
|
||||||
@ -309,8 +310,7 @@ fhandler_base::fstat_by_name (struct __stat64 *buf)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
debug_printf ("FindFirstFile failed for '%s', %E", (char *) pc);
|
__seterrno_from_nt_status (status);
|
||||||
__seterrno ();
|
|
||||||
res = -1;
|
res = -1;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
@ -330,14 +330,7 @@ fhandler_base::fstat_fs (struct __stat64 *buf)
|
|||||||
else
|
else
|
||||||
return fstat_by_handle (buf);
|
return fstat_by_handle (buf);
|
||||||
}
|
}
|
||||||
/* If we don't care if the file is executable or we already know if it is,
|
|
||||||
then just do a "query open" as it is apparently much faster. */
|
|
||||||
if (pc.exec_state () != dont_know_if_executable)
|
|
||||||
{
|
|
||||||
if (pc.fs_is_fat () && !strpbrk (get_win32_name (), "?*|<>"))
|
|
||||||
return fstat_by_name (buf);
|
|
||||||
query_open (query_stat_control);
|
query_open (query_stat_control);
|
||||||
}
|
|
||||||
if (!(oret = open_fs (open_flags, 0)) && get_errno () == EACCES)
|
if (!(oret = open_fs (open_flags, 0)) && get_errno () == EACCES)
|
||||||
{
|
{
|
||||||
/* If we couldn't open the file, try a query open with no permissions.
|
/* If we couldn't open the file, try a query open with no permissions.
|
||||||
|
@ -520,6 +520,16 @@ typedef struct _FILE_STANDARD_INFORMATION {
|
|||||||
BOOLEAN Directory;
|
BOOLEAN Directory;
|
||||||
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
|
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
|
||||||
|
|
||||||
|
typedef struct _FILE_NETWORK_OPEN_INFORMATION {
|
||||||
|
LARGE_INTEGER CreationTime;
|
||||||
|
LARGE_INTEGER LastAccessTime;
|
||||||
|
LARGE_INTEGER LastWriteTime;
|
||||||
|
LARGE_INTEGER ChangeTime;
|
||||||
|
LARGE_INTEGER AllocationSize;
|
||||||
|
LARGE_INTEGER EndOfFile;
|
||||||
|
ULONG FileAttributes;
|
||||||
|
} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
|
||||||
|
|
||||||
typedef struct _FILE_INTERNAL_INFORMATION {
|
typedef struct _FILE_INTERNAL_INFORMATION {
|
||||||
LARGE_INTEGER FileId;
|
LARGE_INTEGER FileId;
|
||||||
} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
|
} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
|
||||||
@ -716,6 +726,8 @@ extern "C"
|
|||||||
BOOLEAN, PULONG, PULONG);
|
BOOLEAN, PULONG, PULONG);
|
||||||
NTSTATUS NTAPI NtQueryEaFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG,
|
NTSTATUS NTAPI NtQueryEaFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG,
|
||||||
BOOLEAN, PVOID, ULONG, PULONG, BOOLEAN);
|
BOOLEAN, PVOID, ULONG, PULONG, BOOLEAN);
|
||||||
|
NTSTATUS NTAPI NtQueryFullAttributesFile (POBJECT_ATTRIBUTES,
|
||||||
|
PFILE_NETWORK_OPEN_INFORMATION);
|
||||||
NTSTATUS NTAPI NtQueryInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID,
|
NTSTATUS NTAPI NtQueryInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID,
|
||||||
ULONG, FILE_INFORMATION_CLASS);
|
ULONG, FILE_INFORMATION_CLASS);
|
||||||
NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS,
|
NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user