Сабж. Нужно сделать образ дискеты (вместе с ее загрузочной дорожкой), т.е. получить байтовый массив и сохранить его в файл. И наоборот.
Код: Это было мной оптимизирована общая функция под NT поэтому много лишних переменных было убрано.
————————————————–
function ReadSector(Sector: Integer; buffer : pointer; Floppy: char):Boolean;
var
hDevice : THandle;
DevName : string; nb : DWORD;
const
SectorSize = 512;
begin
DevName :='\\.\A:';
if Floppy in ['b', 'B'] then DevName[5] := Floppy;
hDevice := CreateFile(pChar(Devname), GENERIC_READ, FILE_SHARE_READ
or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDevice = INVALID_HANDLE_VALUE) then
begin
Result := FALSE;
Exit;
end;
SetFilePointer(hDevice, (Sector-1)*SectorSize, nil, FILE_BEGIN); // нумерация с 1
Result := ReadFile(hDevice, buffer, SectorSize, nb, nil) and (nb=SectorSize);
CloseHandle(hDevice);
end;
————————————————–
Ошибка во время выполнения. Кажется ошибка на функции ReadFile.
Что не так? Есть другие способы?
2 октября 2007 в 21:04
ReadFile(hDevice, buffer^, ReadSize, nb, nil);
Работает, правда проверял на винте, дискеты не было =)
2 октября 2007 в 14:04
function ReadSector(buffer : pointer):Boolean;
var
hDevice : THandle;
DevName : string;
nb : DWORD;
const
ReadSize = 1024;//Изменяемая
begin
DevName :='\\.\A:';
hDevice := CreateFile(pChar(Devname), GENERIC_READ, FILE_SHARE_READ
or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDevice = INVALID_HANDLE_VALUE) then Exit;
ReadFile(hDevice, buffer, ReadSize, nb, nil);
ShowMessage(inttostr(nb));
CloseHandle(hDevice);
end;
Убрал лишнее.
Теперь если ReadSize поставить кратным 512 – то nb (число прочитанных байтов) принимает значение равное ReadSize, а после этого возникает ошибка. Если ставить иные значения nb принимает 0 и ошибки при этом не возникает.
2 октября 2007 в 9:01
Во первых, хорошо бы проверить установку указателя. Но, по-моему, ошибка в том, что четвертый параметр ReadFile должен быть указателем на переменную в которую сохраняется количество прочитаных байт. А Вы указываете собственно переменную, в ней, скорее всего ноль, и ReadFile пишет в начало памяти и падает при сиполнеии.
2 октября 2007 в 9:01
Если читать всё равно всю дискету, нет смысла открывать её каждый раз. Достаточно одного. Открывать на запись в функции чтения не нужно. Дергать указателем тоже.