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

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

View file

@ -967,7 +967,7 @@ GetVolumeNameForVolumeMountPointW(
RtlInitUnicodeString(&NtFileName, L"\\??\\MountPointManager"); RtlInitUnicodeString(&NtFileName, L"\\??\\MountPointManager");
InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); 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, &Iosb, FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SYNCHRONOUS_IO_NONALERT); FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))

View file

@ -887,7 +887,7 @@ AccpOpenNamedObject(LPWSTR pObjectName,
NULL); NULL);
Status = NtOpenFile(Handle, Status = NtOpenFile(Handle,
DesiredAccess, DesiredAccess /* | SYNCHRONIZE */,
&ObjectAttributes, &ObjectAttributes,
&IoStatusBlock, &IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 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.ObjectName = name;
attr.SecurityDescriptor = NULL; attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = 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 ) static NTSTATUS get_module_filename( HMODULE module, UNICODE_STRING *str, USHORT extra_len )
@ -1952,7 +1956,10 @@ static NTSTATUS lookup_winsxs(struct actctx_loader* acl, struct assembly_identit
attr.SecurityDescriptor = NULL; attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL; attr.SecurityQualityOfService = NULL;
if (!NtOpenFile( &handle, GENERIC_READ, &attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE, if (!NtOpenFile(&handle,
GENERIC_READ | SYNCHRONIZE,
&attr, &io,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT)) FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT))
{ {
sxs_ai = *ai; sxs_ai = *ai;

View file

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

View file

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

View file

@ -3578,7 +3578,8 @@ KdbpCliInit()
InitializeObjectAttributes(&ObjectAttributes, &FileName, 0, NULL, NULL); InitializeObjectAttributes(&ObjectAttributes, &FileName, 0, NULL, NULL);
/* Open the file */ /* 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_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT |
FILE_NO_INTERMEDIATE_BUFFERING); FILE_NO_INTERMEDIATE_BUFFERING);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))

View file

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