GetFileAttributes() and SetFileAttributes() must use NtOpenFile() to open directories too.

svn path=/trunk/; revision=4404
This commit is contained in:
Eric Kohl 2003-03-23 04:01:16 +00:00
parent 8b0fa2ce3d
commit 68c3b158fc

View file

@ -1,4 +1,4 @@
/* $Id: file.c,v 1.42 2003/03/06 13:00:51 ekohl Exp $ /* $Id: file.c,v 1.43 2003/03/23 04:01:16 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -523,36 +523,64 @@ GetFileAttributesA(LPCSTR lpFileName)
DWORD STDCALL DWORD STDCALL
GetFileAttributesW(LPCWSTR lpFileName) GetFileAttributesW(LPCWSTR lpFileName)
{ {
FILE_BASIC_INFORMATION FileInformation;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
FILE_BASIC_INFORMATION FileBasic; UNICODE_STRING FileName;
HANDLE hFile; HANDLE FileHandle;
NTSTATUS errCode; NTSTATUS Status;
hFile = CreateFileW(lpFileName, DPRINT ("GetFileAttributeW(%S) called\n", lpFileName);
FILE_READ_ATTRIBUTES,
FILE_SHARE_READ, /* Validate and translate the filename */
if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
&FileName,
NULL, NULL,
OPEN_EXISTING, NULL))
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{ {
DPRINT ("Invalid path\n");
SetLastError (ERROR_BAD_PATHNAME);
return 0xFFFFFFFF;
}
DPRINT ("FileName: \'%wZ\'\n", &FileName);
/* build the object attributes */
InitializeObjectAttributes (&ObjectAttributes,
&FileName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
/* Open the file */
Status = NtOpenFile (&FileHandle,
SYNCHRONIZE | FILE_READ_ATTRIBUTES,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_SYNCHRONOUS_IO_NONALERT);
RtlFreeUnicodeString (&FileName);
if (!NT_SUCCESS (Status))
{
DPRINT ("NtOpenFile() failed (Status %lx)\n", Status);
SetLastErrorByStatus (Status);
return 0xFFFFFFFF; return 0xFFFFFFFF;
} }
errCode = NtQueryInformationFile(hFile, /* Get file attributes */
Status = NtQueryInformationFile (FileHandle,
&IoStatusBlock, &IoStatusBlock,
&FileBasic, &FileInformation,
sizeof(FILE_BASIC_INFORMATION), sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation); FileBasicInformation);
if (!NT_SUCCESS(errCode)) NtClose (FileHandle);
if (!NT_SUCCESS (Status))
{ {
CloseHandle(hFile); DPRINT ("NtQueryInformationFile() failed (Status %lx)\n", Status);
SetLastErrorByStatus(errCode); SetLastErrorByStatus (Status);
return 0xFFFFFFFF; return 0xFFFFFFFF;
} }
CloseHandle(hFile);
return (DWORD)FileBasic.FileAttributes; return (DWORD)FileInformation.FileAttributes;
} }
@ -590,50 +618,76 @@ WINBOOL STDCALL
SetFileAttributesW(LPCWSTR lpFileName, SetFileAttributesW(LPCWSTR lpFileName,
DWORD dwFileAttributes) DWORD dwFileAttributes)
{ {
FILE_BASIC_INFORMATION FileInformation;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
FILE_BASIC_INFORMATION FileBasic; UNICODE_STRING FileName;
HANDLE hFile; HANDLE FileHandle;
NTSTATUS errCode; NTSTATUS Status;
hFile = CreateFileW(lpFileName, DPRINT ("SetFileAttributeW(%S, 0x%lx) called\n", lpFileName, dwFileAttributes);
FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
FILE_SHARE_READ, /* Validate and translate the filename */
if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
&FileName,
NULL, NULL,
OPEN_EXISTING, NULL))
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{ {
DPRINT("SetFileAttributes CreateFileW failed with code %d\n", GetLastError()); DPRINT ("Invalid path\n");
SetLastError (ERROR_BAD_PATHNAME);
return FALSE;
}
DPRINT ("FileName: \'%wZ\'\n", &FileName);
/* build the object attributes */
InitializeObjectAttributes (&ObjectAttributes,
&FileName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
/* Open the file */
Status = NtOpenFile (&FileHandle,
SYNCHRONIZE | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_SYNCHRONOUS_IO_NONALERT);
RtlFreeUnicodeString (&FileName);
if (!NT_SUCCESS (Status))
{
DPRINT ("NtOpenFile() failed (Status %lx)\n", Status);
SetLastErrorByStatus (Status);
return FALSE; return FALSE;
} }
errCode = NtQueryInformationFile(hFile, Status = NtQueryInformationFile(FileHandle,
&IoStatusBlock, &IoStatusBlock,
&FileBasic, &FileInformation,
sizeof(FILE_BASIC_INFORMATION), sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation); FileBasicInformation);
if (!NT_SUCCESS(errCode)) if (!NT_SUCCESS(Status))
{ {
CloseHandle(hFile); DPRINT ("SetFileAttributes NtQueryInformationFile failed with status 0x%08x\n", Status);
DPRINT("SetFileAttributes NtQueryInformationFile failed with status 0x%08x\n", errCode); NtClose (FileHandle);
SetLastErrorByStatus(errCode); SetLastErrorByStatus (Status);
return FALSE; return FALSE;
} }
FileBasic.FileAttributes = dwFileAttributes;
errCode = NtSetInformationFile(hFile, FileInformation.FileAttributes = dwFileAttributes;
Status = NtSetInformationFile(FileHandle,
&IoStatusBlock, &IoStatusBlock,
&FileBasic, &FileInformation,
sizeof(FILE_BASIC_INFORMATION), sizeof(FILE_BASIC_INFORMATION),
FileBasicInformation); FileBasicInformation);
if (!NT_SUCCESS(errCode)) NtClose (FileHandle);
if (!NT_SUCCESS(Status))
{ {
CloseHandle(hFile); DPRINT ("SetFileAttributes NtSetInformationFile failed with status 0x%08x\n", Status);
DPRINT("SetFileAttributes NtSetInformationFile failed with status 0x%08x\n", errCode); SetLastErrorByStatus (Status);
SetLastErrorByStatus(errCode);
return FALSE; return FALSE;
} }
CloseHandle(hFile);
return TRUE; return TRUE;
} }