В соответствии с документацией вам необходимо убедиться, что память, в которую вы читаете, выравнивается по секторам.
Адреса буфера доступа к файлам для операций чтения и записи должны быть выровнены по физическому сектору, что означает выравнивание по адресам в памяти, которые являются целыми кратными размеру физического сектора тома. В зависимости от диска это требование может не выполняться.
Выделите два сектора памяти и затем продвигайтесь в пределах этого сектора на границу сектора.
var
buff: array [0..2*512-1] of Byte;
ptr: Pointer;
....
ptr := Pointer((NativeInt(@buff) + 512) and not (512-1));
После этого ptr
указывает на выровненное местоположение в вашем избыточном буфере. Выполните прямой доступ к диску с памятью, начиная с этого выровненного местоположения.
В последнем предложении выдержки объясняется, что это требование не может быть применено, поэтому ваш код может работать на некоторых машинах, но не на других.
Или, действительно, вам может быть повезло с вашими 32-битными сборками, которые, как им кажется, дают вам адрес с выровненной секцией. Ваше предполагаемое исправление в вопросе редактирования не помогает, поскольку GetMem
не имеет гарантии выравнивания по 512 байт. Если при вызове GetMem
произойдет возврат адреса, выравниваемого по 512 байт, это просто шанс. Вы не можете полагаться на это.
S S
B | |
+---------------------------------------------------------+
| ****************************** |
+---------------------------------------------------------+
P |
S: sector boundary (multiple of 512)
B: buffer (2*512 bytes in size!), not aligned to sector boundary
P: Ptr = buffer + offset to make ptr aligned to a sector boundary.
*: part of buffer you use (512 bytes), aligned to sector boundary
Судя по комментариям, возникает некоторая путаница. Позвольте мне посмотреть, могу ли я сказать это немного больше. Два аспекта прямого доступа к диску должны быть выровнены.
- Указатель диска и размер блока должны быть выровнены по секторам.
- Буфер памяти должен быть выровнен по секторам.
Я имею в виду второй из них. Вы отвечаете первому требованию, если размер сектора диска равен 512. Но вы не отвечаете второму требованию.