diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2019-11-04 23:21:42 +0100 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2019-11-07 00:47:52 +0100 |
commit | 21392ef30ddb383445783b1786541015cb937b37 (patch) | |
tree | 42f9be623866441e2eebb33007896e2951e858dd | |
parent | dc08b692401afdace6de02d81feb68cbf0752e12 (diff) | |
download | VeraCrypt-21392ef30ddb383445783b1786541015cb937b37.tar.gz VeraCrypt-21392ef30ddb383445783b1786541015cb937b37.zip |
Windows MBR Bootloader: workaround for SSD disks that don't allow write operations in BIOS mode with buffers less than 4096 bytes
-rw-r--r-- | src/Boot/Windows/Bios.h | 3 | ||||
-rw-r--r-- | src/Boot/Windows/BootDiskIo.cpp | 2 | ||||
-rw-r--r-- | src/Boot/Windows/BootDiskIo.h | 1 | ||||
-rw-r--r-- | src/Boot/Windows/BootEncryptedIo.cpp | 11 |
4 files changed, 14 insertions, 3 deletions
diff --git a/src/Boot/Windows/Bios.h b/src/Boot/Windows/Bios.h index 4e1cec59..7085e7a2 100644 --- a/src/Boot/Windows/Bios.h +++ b/src/Boot/Windows/Bios.h @@ -24,7 +24,8 @@ enum { BiosResultSuccess = 0x00, - BiosResultInvalidFunction = 0x01 + BiosResultInvalidFunction = 0x01, + BiosResultTimeout = 0x80 }; typedef byte BiosResult; diff --git a/src/Boot/Windows/BootDiskIo.cpp b/src/Boot/Windows/BootDiskIo.cpp index 583840e0..437c462e 100644 --- a/src/Boot/Windows/BootDiskIo.cpp +++ b/src/Boot/Windows/BootDiskIo.cpp @@ -237,7 +237,7 @@ static BiosResult ReadWriteSectors (bool write, BiosLbaPacket &dapPacket, byte d } -static BiosResult ReadWriteSectors (bool write, byte *buffer, byte drive, const uint64 §or, uint16 sectorCount, bool silent) +BiosResult ReadWriteSectors (bool write, byte *buffer, byte drive, const uint64 §or, uint16 sectorCount, bool silent) { BiosLbaPacket dapPacket; dapPacket.Buffer = (uint32) buffer; diff --git a/src/Boot/Windows/BootDiskIo.h b/src/Boot/Windows/BootDiskIo.h index d4e8cf04..621acd8f 100644 --- a/src/Boot/Windows/BootDiskIo.h +++ b/src/Boot/Windows/BootDiskIo.h @@ -112,6 +112,7 @@ BiosResult ReadSectors (uint16 bufferSegment, uint16 bufferOffset, byte drive, c BiosResult ReadSectors (byte *buffer, byte drive, const uint64 §or, uint16 sectorCount, bool silent = false); BiosResult ReadSectors (byte *buffer, byte drive, const ChsAddress &chs, byte sectorCount, bool silent = false); BiosResult ReadWriteSectors (bool write, uint16 bufferSegment, uint16 bufferOffset, byte drive, const uint64 §or, uint16 sectorCount, bool silent); +BiosResult ReadWriteSectors (bool write, byte *buffer, byte drive, const uint64 §or, uint16 sectorCount, bool silent); BiosResult WriteSectors (byte *buffer, byte drive, const uint64 §or, uint16 sectorCount, bool silent = false); BiosResult WriteSectors (byte *buffer, byte drive, const ChsAddress &chs, byte sectorCount, bool silent = false); diff --git a/src/Boot/Windows/BootEncryptedIo.cpp b/src/Boot/Windows/BootEncryptedIo.cpp index 25fe1dc4..380d3419 100644 --- a/src/Boot/Windows/BootEncryptedIo.cpp +++ b/src/Boot/Windows/BootEncryptedIo.cpp @@ -108,7 +108,16 @@ BiosResult WriteEncryptedSectors (uint16 sourceSegment, uint16 sourceOffset, byt EncryptDataUnits (SectorBuffer, &dataUnitNo, 1, BootCryptoInfo); } - result = WriteSectors (SectorBuffer, drive, sector + writeOffset, 1); + result = ReadWriteSectors (true, SectorBuffer, drive, sector + writeOffset, 1, false); + if (BiosResultTimeout == result) + { + result = ReadWriteSectors (false, TC_BOOT_LOADER_BUFFER_SEGMENT, 0, drive, sector + writeOffset, 8, false); + if (BiosResultSuccess == result) + { + CopyMemory (SectorBuffer, TC_BOOT_LOADER_BUFFER_SEGMENT,0, TC_LB_SIZE); + result = ReadWriteSectors (true, TC_BOOT_LOADER_BUFFER_SEGMENT, 0, drive, sector + writeOffset, 8, false); + } + } if (result != BiosResultSuccess) break; |