mirror of
https://github.com/reactos/reactos.git
synced 2024-11-24 12:03:31 +08:00
[NTOSKRNL] Quickly check for alignment in NtRead/WriteFile
This quick check based on bits and operation is for 2^ based sector sizes (most of the cases) and will perform faster than the modulo operation which is still used in fallback in case the sector size wouldn't be a power of 2.
This commit is contained in:
parent
44155053cd
commit
e19e907a2c
@ -2612,13 +2612,19 @@ NtReadFile(IN HANDLE FileHandle,
|
||||
/* Perform additional checks for non-cached file access */
|
||||
if (FileObject->Flags & FO_NO_INTERMEDIATE_BUFFERING)
|
||||
{
|
||||
/* Fail if Length is not sector size aligned */
|
||||
/* Fail if Length is not sector size aligned
|
||||
* Perform a quick check for 2^ sector sizes
|
||||
* If it fails, try a more standard way
|
||||
*/
|
||||
if ((DeviceObject->SectorSize != 0) &&
|
||||
(Length % DeviceObject->SectorSize != 0))
|
||||
((DeviceObject->SectorSize - 1) & Length) != 0)
|
||||
{
|
||||
/* Release the file object and and fail */
|
||||
ObDereferenceObject(FileObject);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
if (Length % DeviceObject->SectorSize != 0)
|
||||
{
|
||||
/* Release the file object and and fail */
|
||||
ObDereferenceObject(FileObject);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fail if buffer doesn't match alignment requirements */
|
||||
@ -3649,13 +3655,19 @@ NtWriteFile(IN HANDLE FileHandle,
|
||||
/* Perform additional checks for non-cached file access */
|
||||
if (FileObject->Flags & FO_NO_INTERMEDIATE_BUFFERING)
|
||||
{
|
||||
/* Fail if Length is not sector size aligned */
|
||||
/* Fail if Length is not sector size aligned
|
||||
* Perform a quick check for 2^ sector sizes
|
||||
* If it fails, try a more standard way
|
||||
*/
|
||||
if ((DeviceObject->SectorSize != 0) &&
|
||||
(Length % DeviceObject->SectorSize != 0))
|
||||
((DeviceObject->SectorSize - 1) & Length) != 0)
|
||||
{
|
||||
/* Release the file object and and fail */
|
||||
ObDereferenceObject(FileObject);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
if (Length % DeviceObject->SectorSize != 0)
|
||||
{
|
||||
/* Release the file object and and fail */
|
||||
ObDereferenceObject(FileObject);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fail if buffer doesn't match alignment requirements */
|
||||
|
Loading…
Reference in New Issue
Block a user