Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-80407
fidget
2002-02-26 12:14
2002.03.25
Объединение 2х баз.


1-80609
AndrewSM
2002-03-11 10:24
2002.03.25
Отладка COM+


1-80504
pashka
2002-03-11 12:41
2002.03.25
Разное


4-80725
Xia
2002-01-25 04:12
2002.03.25
delphi - asm


1-80490
BlankAlex
2002-03-12 10:43
2002.03.25
Обработка OnUpdateError





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский