mirror of
https://github.com/reactos/reactos.git
synced 2024-08-08 12:18:13 +00:00
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:
parent
6c96aec67d
commit
8a7fe191c9
|
@ -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
|
||||
* PROJECT: ReactOS system libraries
|
||||
|
@ -99,29 +99,38 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
|
|||
switch (dwCreationDisposition)
|
||||
{
|
||||
case CREATE_NEW:
|
||||
DPRINT("Creation disposition is CREATE_NEW\n");
|
||||
dwCreationDisposition = FILE_CREATE;
|
||||
break;
|
||||
|
||||
case CREATE_ALWAYS:
|
||||
DPRINT("Creation disposition is CREATE_ALWAYS\n");
|
||||
dwCreationDisposition = FILE_OVERWRITE_IF;
|
||||
break;
|
||||
|
||||
case OPEN_EXISTING:
|
||||
DPRINT("Creation disposition is OPEN_EXISTING\n");
|
||||
dwCreationDisposition = FILE_OPEN;
|
||||
break;
|
||||
|
||||
case OPEN_ALWAYS:
|
||||
DPRINT("Creation disposition is OPEN_ALWAYS\n");
|
||||
dwCreationDisposition = FILE_OPEN_IF;
|
||||
break;
|
||||
|
||||
case TRUNCATE_EXISTING:
|
||||
DPRINT("Creation disposition is TRUNCATE_EXISTING\n");
|
||||
dwCreationDisposition = FILE_OVERWRITE;
|
||||
break;
|
||||
|
||||
default:
|
||||
DPRINT("Invalid creation disposition\n");
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return (INVALID_HANDLE_VALUE);
|
||||
}
|
||||
|
||||
#define DO_AND_DPRINT(__EXPR__) __EXPR__; DPRINT(#__EXPR__ "\n");
|
||||
|
||||
/* validate & translate the flags */
|
||||
if (dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED)
|
||||
{
|
||||
|
@ -130,7 +139,9 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
|
|||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
else
|
||||
Flags |= FILE_SYNCHRONOUS_IO_ALERT;
|
||||
{
|
||||
DO_AND_DPRINT(Flags |= FILE_SYNCHRONOUS_IO_ALERT)
|
||||
}
|
||||
|
||||
/* validate & translate the filename */
|
||||
if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
|
||||
|
@ -138,6 +149,7 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
|
|||
NULL,
|
||||
NULL))
|
||||
{
|
||||
DPRINT("Invalid path\n");
|
||||
SetLastError(ERROR_BAD_PATHNAME);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
@ -146,30 +158,53 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
|
|||
|
||||
/* translate the flags that need no validation */
|
||||
if(dwFlagsAndAttributes & FILE_FLAG_WRITE_THROUGH)
|
||||
Flags |= FILE_WRITE_THROUGH;
|
||||
{
|
||||
DO_AND_DPRINT(Flags |= FILE_WRITE_THROUGH)
|
||||
}
|
||||
|
||||
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)
|
||||
Flags |= FILE_RANDOM_ACCESS;
|
||||
{
|
||||
DO_AND_DPRINT(Flags |= FILE_RANDOM_ACCESS)
|
||||
}
|
||||
|
||||
if(dwFlagsAndAttributes & FILE_FLAG_SEQUENTIAL_SCAN)
|
||||
Flags |= FILE_SEQUENTIAL_ONLY;
|
||||
{
|
||||
DO_AND_DPRINT(Flags |= FILE_SEQUENTIAL_ONLY)
|
||||
}
|
||||
|
||||
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(dwDesiredAccess & GENERIC_READ)
|
||||
Flags |= FILE_OPEN_FOR_BACKUP_INTENT;
|
||||
if(dwDesiredAccess & GENERIC_ALL)
|
||||
{
|
||||
DO_AND_DPRINT(Flags |= FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_FOR_RECOVERY)
|
||||
}
|
||||
else
|
||||
{
|
||||
if(dwDesiredAccess & GENERIC_READ)
|
||||
{
|
||||
DO_AND_DPRINT(Flags |= FILE_OPEN_FOR_BACKUP_INTENT)
|
||||
}
|
||||
|
||||
if(dwDesiredAccess & GENERIC_WRITE)
|
||||
Flags |= FILE_OPEN_FOR_RECOVERY;
|
||||
if(dwDesiredAccess & GENERIC_WRITE)
|
||||
{
|
||||
DO_AND_DPRINT(Flags |= FILE_OPEN_FOR_RECOVERY)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
Flags |= FILE_NON_DIRECTORY_FILE;
|
||||
{
|
||||
DO_AND_DPRINT(Flags |= FILE_NON_DIRECTORY_FILE)
|
||||
}
|
||||
|
||||
/* FILE_FLAG_POSIX_SEMANTICS is handled later */
|
||||
|
||||
|
@ -183,14 +218,27 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
|
|||
#endif
|
||||
|
||||
/* translate the desired access */
|
||||
if (dwDesiredAccess & GENERIC_READ)
|
||||
dwDesiredAccess |= FILE_GENERIC_READ;
|
||||
if (dwDesiredAccess & GENERIC_ALL)
|
||||
{
|
||||
DO_AND_DPRINT(dwDesiredAccess |= FILE_ALL_ACCESS)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dwDesiredAccess & GENERIC_READ)
|
||||
{
|
||||
DO_AND_DPRINT(dwDesiredAccess |= FILE_GENERIC_READ);
|
||||
}
|
||||
|
||||
if (dwDesiredAccess & GENERIC_WRITE)
|
||||
dwDesiredAccess |= FILE_GENERIC_WRITE;
|
||||
if (dwDesiredAccess & GENERIC_WRITE)
|
||||
{
|
||||
DO_AND_DPRINT(dwDesiredAccess |= FILE_GENERIC_WRITE);
|
||||
}
|
||||
|
||||
if (dwDesiredAccess & GENERIC_EXECUTE)
|
||||
dwDesiredAccess |= FILE_GENERIC_EXECUTE;
|
||||
if (dwDesiredAccess & GENERIC_EXECUTE)
|
||||
{
|
||||
DO_AND_DPRINT(dwDesiredAccess |= FILE_GENERIC_EXECUTE);
|
||||
}
|
||||
}
|
||||
|
||||
/* build the object attributes */
|
||||
InitializeObjectAttributes(
|
||||
|
@ -204,12 +252,17 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
|
|||
if (lpSecurityAttributes)
|
||||
{
|
||||
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))
|
||||
ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE;
|
||||
{
|
||||
DO_AND_DPRINT(ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE)
|
||||
}
|
||||
|
||||
/* perform the call */
|
||||
Status = NtCreateFile (&FileHandle,
|
||||
|
@ -238,6 +291,9 @@ HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
|
|||
case FILE_OPENED:
|
||||
case FILE_CREATED:
|
||||
SetLastError(ERROR_ALREADY_EXISTS);
|
||||
break;
|
||||
|
||||
default:
|
||||
}
|
||||
|
||||
return FileHandle;
|
||||
|
|
Loading…
Reference in a new issue