Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sektoren von der Festplatte lesen (https://www.delphipraxis.net/43032-sektoren-von-der-festplatte-lesen.html)

FProg 27. Mär 2005 20:29


Sektoren von der Festplatte lesen
 
Hi,

ich bin gerade dabei mich mit etwas... naja, "tiefgreifenderen" Dingen zu beschäftigen :) und versuche, Sektoren direkt von der Festplatte zu lesen. Leider habe ich dazu nur etwas eingestaubten TP-Code gefunden, den ich nicht in Delphi übersetzt bekomme :)

Ich kann ihn ja trotzdem mal posten.

Delphi-Quellcode:
function bios_ReadAbsSector(drv, head: byte; cyl: word; sector: byte; var
buffer): byte;
var regs: TRegisters;
begin
    regs.ah:=02;
    regs.dl:=drv;
    regs.dh:=head;
    regs.ch:=cyl and $ff;
    regs.cl:=(sector and $3f) or ((cyl and $300) shr 2);
    regs.al:=1;
    regs.es:=seg(buffer);
    regs.bx:=ofs(buffer);
    intr($13,regs);
    if (regs.flags and $01)=0 then begin
        bios_ReadAbsSector:=0;
    end else begin
        bios_ReadAbsSector:=regs.ah;
    end;
end;
Gefunden auf http://www.elists.org/pipermail/delp...er/016753.html

Es werden also die unterschiedlichsten Register belegt. Theoretisch ließe sich ja dieser Quelltext ja mit Delphi umsetzen, nur hängt es bei mir an zwei Stellen...
  • Wie bekomme ich die Befehle seg() und ofs() umgesetzt?
  • Wie ermittle ich die Werte, die hier so schön in regs.flags enthalten sind?

Hier nochmal der Delphi-Quelltext, soweit ich ihn habe:

Delphi-Quellcode:
function bios_ReadAbsSector(drv, head: byte; cyl: word; sector: byte; var
buffer): byte;
var b, bCyl: byte;
begin
    bCyl := cyl and $ff;
    b := (sector and $3f) or ((cyl and $300) shr 2);
    asm
        mov ah, 02
        mov dl, drv
        mov dh, head
        mov ch, bCyl
        mov cl, b
        mov al, 1
        mov es, {???}
        mov bx, {???}
        int 19
        {???}
    end;
    {???}
end;

Vielen dank schonmal!
FProg

stefan2005 27. Mär 2005 20:59

Re: Sektoren von der Festplatte lesen
 
hi,
soweit ich sehe, benutzt du den Bios Interrupt 13h (19 in dezimal) !
Bios Interrupts können nur im 16-Bit Mode ausgeführt werden (in MS-DOS z.B. oder auch im V86-Mode von Windows,so wie 16-Bit Turbo Pascal Programme emuliert werden) !
Da Delphi aber 32-Bit Code erstellt, dürfte dies leider nicht funktionieren !

cu,
stefan2005

FProg 27. Mär 2005 21:11

Re: Sektoren von der Festplatte lesen
 
Zitat:

Zitat von stefan2005
soweit ich sehe, benutzt du den Bios Interrupt 13h (19 in dezimal) !
Bios Interrupts können nur im 16-Bit Mode ausgeführt werden (in MS-DOS z.B. oder auch im V86-Mode von Windows,so wie 16-Bit Turbo Pascal Programme emuliert werden) !
Da Delphi aber 32-Bit Code erstellt, dürfte dies leider nicht funktionieren !

Oh... vielen Dank! Weiß jemand ob es sonst Möglichkeiten gibt, Sektoren auszulesen?

Viele Grüße
FProg

Luckie 27. Mär 2005 21:32

Re: Sektoren von der Festplatte lesen
 
Jupp: DiskImageNT: http://www.luckie-online.de/programme/DiskImageNT/

FProg 27. Mär 2005 21:48

Re: Sektoren von der Festplatte lesen
 
Zitat:

Zitat von Luckie

Vielen Dank, ich habe mir den Quelltext einmal angesehen. Die DeviceIoControl, die darin verwendet wird, ist schonmal sehr gut zu gebrauchen :) Leider wird das Laufwerk über CreateFile ausgelesen, was nur unter NT-basierten Betriebssystemen funktioniert - ich bräuchte den Code für WinME... :(

Noch jemand eine Idee?


Viele Grüße
FProg

moritz 27. Mär 2005 22:50

Re: Sektoren von der Festplatte lesen
 
Er schreibt ja selber:
Zitat:

I used this just under plain DOS. I have no clue, if it would work under
Win95 or up, but I guess it would work when booting to the command prompt
but most likely not when booting the GUI.
Die Windows-CMD läuft afaik noch unter 16-Bit. Wenn du also ein Programm dafür schreibst in Assembler schreibst, dass den per paramter übergeben Sektor aus der HDD liest und per Message an das Hauptprogramm übergibt, sollte das Problem auch gelöst sein.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz