VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Format
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2023-10-13 23:55:19 +0200
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2023-10-13 23:55:19 +0200
commit5e0aec534f0c3a54ab4d726ce43e9c4ee34e9da2 (patch)
treebf1ec87bf9e2f7e69e0d1628db03a3cdc0deb192 /src/Format
parent4cfb4b03a726140a9c5360b3e0be7e2d433b3855 (diff)
downloadVeraCrypt-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')
-rw-r--r--src/Format/InPlace.c23
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.