Форум: "WinAPI";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
ВнизСчитывания секторов на диске(А:) Найти похожие ветки
← →
yus (2002-01-24 21:06) [0]В книге по Delphi вычитал, как считать сектор с диска.Помогите разобраться, что есть "Head" в ф-ции "ReadSector" и правильно,ли я считываю данные с 1 сектора,1 трека .
Зарание СПАСИБО!
implementation
{$R *.DFM}
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;
procedure TForm1.Button1Click(Sender: TObject);
var
Bt : Array [1..512] of Byte;
PBt : PByte; i:integer;
begin
PBt:=@Bt;
ReadSector(2, 1,1,PBt,"a");
for i:= 1 to 512 do
begin
ListBox1.Items.Add(inttohex(bt[i],2));
end;
end;
← →
copyr25 (2002-01-24 21:59) [1]Ну, ей Богу, на ассемблере проще:))
← →
copyr25 (2002-01-24 22:09) [2]Прислать? Дело в том, что Windows хороша и одновременно плоха своим ненавязчивым сервисом:))
Задача, конечно, благородная - user сидит перед компом и играет в игры. А если игры - ну, такие игры?
:)) Тогда нужно использовать средства DOS. Нужно. Иначе оченна трудно.
Чтение сектора в DOS"e - это 4 строчки, и Ваш код, как пример.
Я всегда держу DOS и всю дорогу пользуюсь менюшкой "Загрузить
предыдущую версию DOS"
И Вам того же желаю:))
← →
yus (2002-01-25 06:29) [3]Ели это слишком мудрено подскажите, как подругому считать сектор(пример):))
← →
DMN (2002-01-25 16:20) [4]Head - номер головки. У флопа две головки, одна читает диск с одной стороны, другая - с другой.
← →
yus (2002-01-26 02:08) [5]Понял.
Я где,то ошибся, с использованьем function ReadSector.Читать-читает, но данные не те, что должны быть. Если кто знает - подскажите пожайлута в чем ошибка. Спасибо!
← →
copyr25 (2002-01-26 16:59) [6]code segment
assume cs:code,ds:code,es:code,ss:code
org 100h
start:
;;;;;;;;;;;;;;;;; СОХРАНЯЕМ СЕКТОРА В БУФЕРАХ
push es ; сохранение регистров
push ds
push cs
push cs
pop ds
pop es
push ds ; адрес данных сектора записи в es:bx
pop es
lea bx,buff1
mov bes,es
mov bbx,bx
mov ah,2 ; чтение
mov al,63 ; 63 секторов
mov ch,0 ; на 0-дорожке
mov cl,1 ; начиная с 1-го сектора
mov dh,1 ; на 1-стороне
mov dl,81h ; диск D:
int 13h
;;;;;;;;;;;;;;;;; СОХРАНЯЕМ БУФЕР В ФАЙЛЕ
;;;;;;;;;;;;;;;;; создание файла
mov ah,3ch
mov cx,0
mov dx,offset filenam1
int 21h
mov handle,ax
;;;;;;;;;;;;;;;;; запись данных в файл
mov ah,40h
mov bx,handle
mov cx,len1
mov dx,offset buff1
int 21h
;;;;;;;;;;;;;;;;; закрытие файла
mov ah,3eh
mov bx,handle
int 21h
mov ah,4ch ; и выход в ДОС
mov al,0
int 21h
;;;;;;;;;;;;;;;;;
buff1 db 32256 dup (0)
len1 equ $-buff1
bes dw ?
bbx dw ?
handle dw ?
filenam1 db "file.txt",0
code ends
end start
← →
yus (2002-01-26 18:43) [7]Спасибо !
Попробую в ассемблере , хотя и тот пример работает.
А записать возможно?
Regs.rEAX := $201; // код операции read sector
а на запись какой код?
← →
copyr25 (2002-01-27 02:00) [8]mov ah,3
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c