Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.028 c
3-80391           bas                   2002-02-25 16:33  2002.03.25  
Error 03232


6-80630           star                  2002-01-04 12:59  2002.03.25  
Как узнать, что outlook express отсылает письмо ?


1-80469           lipskiy               2002-03-08 02:25  2002.03.25  
Что такое отчет?


1-80601           Kozhanov              2002-03-11 13:21  2002.03.25  
проблема с MouseEnter и MouseLeave


6-80637           Jam                   2002-01-09 13:29  2002.03.25  
ClientSocket отправка