Add the SYNCHRONIZE flag to the DesiredAccess parameter when using the flags FILE_SYNCHRONOUS_IO_(NON)ALERT in NtCreateFile or NtOpenFile, even if one uses DesiredAccess == GENERIC_xxx (which should map to some FILE_GENERIC_xxx already containing the SYNCHRONIZE flag).

Indeed, it appears after extended testing that, when calling from user-mode, Windows checks the real presence of the SYNCHRONIZE flag when using FILE_SYNCHRONOUS_IO_(NON)ALERT even if we pass any of the GENERIC_xxx access flags...

Otherwise, when using FILE_GENERIC_(READ/WRITE) flags directly, there is no need to add the SYNCHRONIZE flag since it is already incorporated in it.

See CORE-7361 for more details.

svn path=/trunk/; revision=59514
This commit is contained in:
Hermès Bélusca-Maïto 2013-07-19 15:05:28 +00:00
parent 29dcad6c4e
commit 072209491b
9 changed files with 21 additions and 13 deletions

View file

@ -535,11 +535,11 @@ OpenFile(LPCSTR lpFileName,
ObjectAttributes.SecurityQualityOfService = NULL;
errCode = NtOpenFile (&FileHandle,
GENERIC_READ|SYNCHRONIZE,
GENERIC_READ | SYNCHRONIZE,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ,
FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT);
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT);
RtlFreeHeap(RtlGetProcessHeap(), 0, FileNameString.Buffer);

View file

@ -105,7 +105,7 @@ CreatePipe(PHANDLE hReadPipe,
/* Now try opening it for write access */
Status = NtOpenFile(&WritePipeHandle,
FILE_GENERIC_WRITE | SYNCHRONIZE,
FILE_GENERIC_WRITE,
&ObjectAttributes,
&StatusBlock,
FILE_SHARE_READ,

View file

@ -967,7 +967,7 @@ GetVolumeNameForVolumeMountPointW(
RtlInitUnicodeString(&NtFileName, L"\\??\\MountPointManager");
InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL);
Status = NtOpenFile(&FileHandle, FILE_GENERIC_READ | SYNCHRONIZE, &ObjectAttributes,
Status = NtOpenFile(&FileHandle, FILE_GENERIC_READ, &ObjectAttributes,
&Iosb, FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))

View file

@ -887,7 +887,7 @@ AccpOpenNamedObject(LPWSTR pObjectName,
NULL);
Status = NtOpenFile(Handle,
DesiredAccess,
DesiredAccess /* | SYNCHRONIZE */,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,

View file

@ -1618,7 +1618,11 @@ static NTSTATUS open_nt_file( HANDLE *handle, UNICODE_STRING *name )
attr.ObjectName = name;
attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL;
return NtOpenFile( handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT );
return NtOpenFile(handle,
GENERIC_READ | SYNCHRONIZE,
&attr, &io,
FILE_SHARE_READ,
FILE_SYNCHRONOUS_IO_ALERT);
}
static NTSTATUS get_module_filename( HMODULE module, UNICODE_STRING *str, USHORT extra_len )
@ -1952,8 +1956,11 @@ static NTSTATUS lookup_winsxs(struct actctx_loader* acl, struct assembly_identit
attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL;
if (!NtOpenFile( &handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT ))
if (!NtOpenFile(&handle,
GENERIC_READ | SYNCHRONIZE,
&attr, &io,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT))
{
sxs_ai = *ai;
file = lookup_manifest_file( handle, &sxs_ai );

View file

@ -168,7 +168,7 @@ IopWriteLogFile(PWSTR LogText)
NULL);
Status = ZwCreateFile(&FileHandle,
FILE_APPEND_DATA,
FILE_APPEND_DATA | SYNCHRONIZE,
&ObjectAttributes,
&IoStatusBlock,
NULL,

View file

@ -161,7 +161,7 @@ IopStartRamdisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
// Open a handle to the driver
//
Status = ZwOpenFile(&DriverHandle,
GENERIC_ALL,
GENERIC_ALL | SYNCHRONIZE,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE,

View file

@ -3578,7 +3578,8 @@ KdbpCliInit()
InitializeObjectAttributes(&ObjectAttributes, &FileName, 0, NULL, NULL);
/* Open the file */
Status = ZwOpenFile(&hFile, FILE_READ_DATA, &ObjectAttributes, &Iosb, 0,
Status = ZwOpenFile(&hFile, FILE_READ_DATA | SYNCHRONIZE,
&ObjectAttributes, &Iosb, 0,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT |
FILE_NO_INTERMEDIATE_BUFFERING);
if (!NT_SUCCESS(Status))

View file

@ -391,10 +391,10 @@ KdbpSymLoadModuleSymbols(
DPRINT("Attempting to open image: %wZ\n", FileName);
Status = ZwOpenFile(&FileHandle,
FILE_READ_ACCESS,
FILE_READ_ACCESS | SYNCHRONIZE,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{