Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
8-86978
Dmitriyk
2002-09-02 03:16
2003.01.27
TMediaPlayer


9-86618
Miron
2002-07-26 11:32
2003.01.27
OpenGL


6-86995
AndrewVolkov
2002-11-28 12:37
2003.01.27
Indy components idFTP дата изменения файла.


3-86669
nomshar
2003-01-08 15:54
2003.01.27
Flash в базе данных


6-86988
wmz
2002-11-26 21:00
2003.01.27
HTTP-авторизация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский