Форум: "Система";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
ВнизЧтение/запись сектора диска Найти похожие ветки
← →
Геннадий (2002-11-12 17:29) [0]Здравствуйте, знатоки-системщики!
Ниже приведён код, позволяющий прочитать нужный сектор на дискете. А как ЗАПИСАТЬ нужный сектор на дискете? И как с тем же (чтение/запись сектора) обратиться к другим дискам (HDD, CD) ?
type
pDIOCRegs = ^TDIOCRegs;
TDIOCRegs = packed record
rEBX, rEDX, rECX, rEAX, rEDI, rESI, rFlags : DWORD;
end;
const
VWIN32_DIOC_DOS_IOCTL = 1;
VWIN32_DIOC_DOS_INT13 = 4; // Prforms Interrupt 13h commands
SectorSize = 512;
function ReadSector(Head, Track, Sector: Integer; buffer: pointer;
Floppy: char):Boolean;
var
hDevice: THandle;
Regs: TDIOCRegs;
DevName: string;
nb: Cardinal;
begin
if WIN32PLATFORM <> VER_PLATFORM_WIN32_NT then
begin {Win95/98}
hDevice := CreateFile("\\.\vwin32",GENERIC_READ, 0, nil, 0,
FILE_FLAG_DELETE_ON_CLOSE, 0);
if (hDevice = INVALID_HANDLE_VALUE) then
begin
Result:=False;
Exit;
end;
Regs.rEDX := Head * $100 + Ord(Floppy in ["b","B"]);
Regs.rEAX := $201; // код операции read sector
Regs.rEBX := DWORD(buffer);
Regs.rECX := Track * $100 + Sector;
Regs.rFlags := $0;
Result := DeviceIOControl(hDevice, VWIN32_DIOC_DOS_INT13,
@Regs, sizeof(Regs), @Regs, sizeof(Regs), nb, nil)
and ((Regs.rFlags and $1)=0);
CloseHandle(hDevice);
end {Win95}
else
begin // Windows NT
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;
end;
← →
AngeL B. (2002-11-12 18:06) [1]Так а в чем сложность?
У тебя же почти все написано.
Поменяй ReadFile на WriteFile функцию чтения сектора на запись и все. Ну еще права на запись к файлу при открытии попроси.
← →
Геннадий (2002-11-12 18:47) [2]Для AngeL B.
Ага, это для NT. Но мне нужно и для 9х. Основная сложность - я не знаю код для записи. И код, для обращения к другим дискам.
← →
Геннадий (2002-11-13 20:18) [3]Никто не знает? Не верю!
Помогите советом, а?
← →
AngeL B. (2002-11-14 18:53) [4]:) Случайно заглянул на страницу, так бы никогдща и не ответил.
Итак.
На входе:
AH = 3 (Записать заданное количество секторов)
AL = Количество секторов
CH = Номер цилиндра
CL = Номер сектора
DH = Номер головки
DL = Номер диска :0 - А; 1 - В и т.д.
ES:BX = Адрес буфера
На выходе:
CF, AH
AL = Количество записанных секторов
Все тоже прерывание int 13h
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c