singlepost

CreateFile – считывание дискеты в файл и обратная запись на нее << На главную или назад  

Сабж. Нужно сделать образ дискеты (вместе с ее загрузочной дорожкой), т.е. получить байтовый массив и сохранить его в файл. И наоборот.

Код: Это было мной оптимизирована общая функция под 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.
Что не так? Есть другие способы?

4 ответов в теме “CreateFile – считывание дискеты в файл и обратная запись на нее”

  1. 4
    Анзор Апшев ответил:

    ReadFile(hDevice, buffer^, ReadSize, nb, nil);
    Работает, правда проверял на винте, дискеты не было =)

  2. 3
    Александр Kadymow ответил:

    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 и ошибки при этом не возникает.

  3. 2
    Игорь Федоров ответил:

    Во первых, хорошо бы проверить установку указателя. Но, по-моему, ошибка в том, что четвертый параметр ReadFile должен быть указателем на переменную в которую сохраняется количество прочитаных байт. А Вы указываете собственно переменную, в ней, скорее всего ноль, и ReadFile пишет в начало памяти и падает при сиполнеии.

  4. 1
    Игорь Федоров ответил:

    Если читать всё равно всю дискету, нет смысла открывать её каждый раз. Достаточно одного. Открывать на запись в функции чтения не нужно. Дергать указателем тоже.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.