diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2023-10-13 23:55:19 +0200 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2023-10-13 23:55:19 +0200 |
commit | 5e0aec534f0c3a54ab4d726ce43e9c4ee34e9da2 (patch) | |
tree | bf1ec87bf9e2f7e69e0d1628db03a3cdc0deb192 /src/Format/InPlace.c | |
parent | 4cfb4b03a726140a9c5360b3e0be7e2d433b3855 (diff) | |
download | VeraCrypt-5e0aec534f0c3a54ab4d726ce43e9c4ee34e9da2.tar.gz VeraCrypt-5e0aec534f0c3a54ab4d726ce43e9c4ee34e9da2.zip |
Windows: fallback to absolute positioning if relative positioning fails
This can serve as workaround if a disk rejects relative positioning for
some reason.
Diffstat (limited to 'src/Format/InPlace.c')
-rw-r--r-- | src/Format/InPlace.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/Format/InPlace.c b/src/Format/InPlace.c index 877ff7eb..b1483631 100644 --- a/src/Format/InPlace.c +++ b/src/Format/InPlace.c @@ -2208,24 +2208,27 @@ BOOL SaveNonSysInPlaceEncSettings (int delta, WipeAlgorithmId newWipeAlgorithm, // SetFilePointerEx() with FILE_BEGIN as the reference point, reaching the end of large drives // during in-place encryption can cause significant slowdowns. By moving the file pointer // relatively, these performance issues are mitigated. +// +// We fall back to absolute positioning if the relative positioning fails. BOOL MoveFilePointer (HANDLE dev, LARGE_INTEGER offset) { LARGE_INTEGER currOffset; LARGE_INTEGER diffOffset; currOffset.QuadPart = 0; - if (SetFilePointerEx (dev, currOffset, &currOffset, FILE_CURRENT) == 0) - return FALSE; - - diffOffset.QuadPart = offset.QuadPart - currOffset.QuadPart; - if (diffOffset.QuadPart == 0) - return TRUE; + if (SetFilePointerEx (dev, currOffset, &currOffset, FILE_CURRENT)) + { + diffOffset.QuadPart = offset.QuadPart - currOffset.QuadPart; + if (diffOffset.QuadPart == 0) + return TRUE; - // Moves the file pointer by the difference between current and desired positions - if (SetFilePointerEx (dev, diffOffset, NULL, FILE_CURRENT) == 0) - return FALSE; + // Moves the file pointer by the difference between current and desired positions + if (SetFilePointerEx (dev, diffOffset, NULL, FILE_CURRENT)) + return TRUE; + } - return TRUE; + // An error occurred, fallback to absolute positioning + return SetFilePointerEx (dev, offset, NULL, FILE_BEGIN); } // Repairs damaged sectors (i.e. those with read errors) by zeroing them. |