CreateFileW: corrected a couple of buglets, added handling of GENERIC_ALL access, packed with DPRINTs to catch the bug that breaks gcc and cmd (sorry, last time I touch something I can't test)

svn path=/trunk/; revision=3364
This commit is contained in:
KJK::Hyperion 2002-08-18 16:01:11 +00:00
parent 6c96aec67d
commit 8a7fe191c9

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.25 2002/08/18 04:20:21 hyperion Exp $ /* $Id: create.c,v 1.26 2002/08/18 16:01:11 hyperion 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
@ -99,29 +99,38 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
switch (dwCreationDisposition) switch (dwCreationDisposition)
{ {
case CREATE_NEW: case CREATE_NEW:
DPRINT("Creation disposition is CREATE_NEW\n");
dwCreationDisposition = FILE_CREATE; dwCreationDisposition = FILE_CREATE;
break; break;
case CREATE_ALWAYS: case CREATE_ALWAYS:
DPRINT("Creation disposition is CREATE_ALWAYS\n");
dwCreationDisposition = FILE_OVERWRITE_IF; dwCreationDisposition = FILE_OVERWRITE_IF;
break; break;
case OPEN_EXISTING: case OPEN_EXISTING:
DPRINT("Creation disposition is OPEN_EXISTING\n");
dwCreationDisposition = FILE_OPEN; dwCreationDisposition = FILE_OPEN;
break; break;
case OPEN_ALWAYS: case OPEN_ALWAYS:
DPRINT("Creation disposition is OPEN_ALWAYS\n");
dwCreationDisposition = FILE_OPEN_IF; dwCreationDisposition = FILE_OPEN_IF;
break; break;
case TRUNCATE_EXISTING: case TRUNCATE_EXISTING:
DPRINT("Creation disposition is TRUNCATE_EXISTING\n");
dwCreationDisposition = FILE_OVERWRITE; dwCreationDisposition = FILE_OVERWRITE;
break;
default: default:
DPRINT("Invalid creation disposition\n");
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return (INVALID_HANDLE_VALUE); return (INVALID_HANDLE_VALUE);
} }
#define DO_AND_DPRINT(__EXPR__) __EXPR__; DPRINT(#__EXPR__ "\n");
/* validate & translate the flags */ /* validate & translate the flags */
if (dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED) if (dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED)
{ {
@ -130,7 +139,9 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
} }
else else
Flags |= FILE_SYNCHRONOUS_IO_ALERT; {
DO_AND_DPRINT(Flags |= FILE_SYNCHRONOUS_IO_ALERT)
}
/* validate & translate the filename */ /* validate & translate the filename */
if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName, if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
@ -138,6 +149,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
NULL, NULL,
NULL)) NULL))
{ {
DPRINT("Invalid path\n");
SetLastError(ERROR_BAD_PATHNAME); SetLastError(ERROR_BAD_PATHNAME);
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
} }
@ -146,30 +158,53 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
/* translate the flags that need no validation */ /* translate the flags that need no validation */
if(dwFlagsAndAttributes & FILE_FLAG_WRITE_THROUGH) if(dwFlagsAndAttributes & FILE_FLAG_WRITE_THROUGH)
Flags |= FILE_WRITE_THROUGH; {
DO_AND_DPRINT(Flags |= FILE_WRITE_THROUGH)
}
if(dwFlagsAndAttributes & FILE_FLAG_NO_BUFFERING) if(dwFlagsAndAttributes & FILE_FLAG_NO_BUFFERING)
Flags |= FILE_NO_INTERMEDIATE_BUFFERING; {
DO_AND_DPRINT(Flags |= FILE_NO_INTERMEDIATE_BUFFERING)
}
if(dwFlagsAndAttributes & FILE_FLAG_RANDOM_ACCESS) if(dwFlagsAndAttributes & FILE_FLAG_RANDOM_ACCESS)
Flags |= FILE_RANDOM_ACCESS; {
DO_AND_DPRINT(Flags |= FILE_RANDOM_ACCESS)
}
if(dwFlagsAndAttributes & FILE_FLAG_SEQUENTIAL_SCAN) if(dwFlagsAndAttributes & FILE_FLAG_SEQUENTIAL_SCAN)
Flags |= FILE_SEQUENTIAL_ONLY; {
DO_AND_DPRINT(Flags |= FILE_SEQUENTIAL_ONLY)
}
if(dwFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE) if(dwFlagsAndAttributes & FILE_FLAG_DELETE_ON_CLOSE)
Flags |= FILE_DELETE_ON_CLOSE; {
DO_AND_DPRINT(Flags |= FILE_DELETE_ON_CLOSE)
}
if(dwFlagsAndAttributes & FILE_FLAG_BACKUP_SEMANTICS) if(dwFlagsAndAttributes & FILE_FLAG_BACKUP_SEMANTICS)
{ {
if(dwDesiredAccess & GENERIC_READ) if(dwDesiredAccess & GENERIC_ALL)
Flags |= FILE_OPEN_FOR_BACKUP_INTENT; {
DO_AND_DPRINT(Flags |= FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_FOR_RECOVERY)
if(dwDesiredAccess & GENERIC_WRITE) }
Flags |= FILE_OPEN_FOR_RECOVERY; else
{
if(dwDesiredAccess & GENERIC_READ)
{
DO_AND_DPRINT(Flags |= FILE_OPEN_FOR_BACKUP_INTENT)
}
if(dwDesiredAccess & GENERIC_WRITE)
{
DO_AND_DPRINT(Flags |= FILE_OPEN_FOR_RECOVERY)
}
}
} }
else else
Flags |= FILE_NON_DIRECTORY_FILE; {
DO_AND_DPRINT(Flags |= FILE_NON_DIRECTORY_FILE)
}
/* FILE_FLAG_POSIX_SEMANTICS is handled later */ /* FILE_FLAG_POSIX_SEMANTICS is handled later */
@ -183,14 +218,27 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
#endif #endif
/* translate the desired access */ /* translate the desired access */
if (dwDesiredAccess & GENERIC_READ) if (dwDesiredAccess & GENERIC_ALL)
dwDesiredAccess |= FILE_GENERIC_READ; {
DO_AND_DPRINT(dwDesiredAccess |= FILE_ALL_ACCESS)
if (dwDesiredAccess & GENERIC_WRITE) }
dwDesiredAccess |= FILE_GENERIC_WRITE; else
{
if (dwDesiredAccess & GENERIC_EXECUTE) if (dwDesiredAccess & GENERIC_READ)
dwDesiredAccess |= FILE_GENERIC_EXECUTE; {
DO_AND_DPRINT(dwDesiredAccess |= FILE_GENERIC_READ);
}
if (dwDesiredAccess & GENERIC_WRITE)
{
DO_AND_DPRINT(dwDesiredAccess |= FILE_GENERIC_WRITE);
}
if (dwDesiredAccess & GENERIC_EXECUTE)
{
DO_AND_DPRINT(dwDesiredAccess |= FILE_GENERIC_EXECUTE);
}
}
/* build the object attributes */ /* build the object attributes */
InitializeObjectAttributes( InitializeObjectAttributes(
@ -204,12 +252,17 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
if (lpSecurityAttributes) if (lpSecurityAttributes)
{ {
if(lpSecurityAttributes->bInheritHandle) if(lpSecurityAttributes->bInheritHandle)
ObjectAttributes.Attributes |= OBJ_INHERIT; {
ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor; DO_AND_DPRINT(ObjectAttributes.Attributes |= OBJ_INHERIT)
}
DO_AND_DPRINT(ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor)
} }
if(!(dwFlagsAndAttributes & FILE_FLAG_POSIX_SEMANTICS)) if(!(dwFlagsAndAttributes & FILE_FLAG_POSIX_SEMANTICS))
ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE; {
DO_AND_DPRINT(ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE)
}
/* perform the call */ /* perform the call */
Status = NtCreateFile (&FileHandle, Status = NtCreateFile (&FileHandle,
@ -238,6 +291,9 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
case FILE_OPENED: case FILE_OPENED:
case FILE_CREATED: case FILE_CREATED:
SetLastError(ERROR_ALREADY_EXISTS); SetLastError(ERROR_ALREADY_EXISTS);
break;
default:
} }
return FileHandle; return FileHandle;