Hallo: diesmal: CD-Sectors

01/05/2012 - 21:33 von Jens Kallup | Report spam
Hallo,

mit folgenden Snippet kann ich Sektoren der Boot-CD auslesn
und anzeigen lassen.
Weiss jetzt aber nicht, wie ich den TOC und das filesystem
auslesen kann...
also char an struct übergeben kann ..
jemand eine Idee?
Jens

struct disk_packet
{
byte size_pack;
byte reserved1;
byte no_of_blocks;
byte reserved2;
word offset;
word segment;
dword lba1;
dword lba2;
} disk_pack;

void LBASectorRead(void *buffer, unsigned long lba)
{
unsigned char bError = 0;
REGS regs;

disk_pack.size_pack = 16;
disk_pack.no_of_blocks = 1;
disk_pack.reserved1 = 0;
disk_pack.reserved2 = 0;
disk_pack.segment = (((unsigned int)buffer >> 16) << 12);
disk_pack.offset = ((unsigned int)buffer & 0xffff);
disk_pack.lba2 = lba >> 32;
disk_pack.lba1 = lba & 0xffffffff;

regs.b.ds = (((unsigned int)&disk_pack >> 16) << 12);
regs.b.si = ((unsigned int)&disk_pack &0xffff);
regs.b.dl = 0x9f;
regs.b.ah = 0x42;
int386(0x13,&regs,&regs);

printf("Error: %d",regs.b.ah);

}



{
static unsigned char buffer[2048] = { 0 };
LBASectorRead(buffer,16);

for (i = 0; i < 2048; i++)
{
if (console_cursor_xpos >= 80)
{
console_cursor_xpos = 0;
console_cursor_ypos++;
}

VideoPutChar(buffer[i],console_color_attribut,console_cursor_xpos,
console_cursor_ypos);
console_cursor_xpos++;
}
}
 

Lesen sie die antworten

#1 Jan Seiffert
02/05/2012 - 05:42 | Warnen spam
Jens Kallup schrieb:
Hallo,

mit folgenden Snippet kann ich Sektoren der Boot-CD auslesn
und anzeigen lassen.
Weiss jetzt aber nicht, wie ich den TOC und das filesystem
auslesen kann...



Na indem du den passenden Sektor ausliest und das alles entsprechen verarbeitest?

Aber ich glaube dein Problem liegt woanders.
Wenn du über BIOS calls die CD ansprichst, heist das, du benutzt die
drive emulation des BIOS. In der kannst du nur das gemapte
"Bootlaufwerk" auf der CD ansprechen.
So ich jetzt deinen Code da richtig verstehe.

also char an struct übergeben kann ..



???
Du meinst wie du die Daten in dem gelesenem Puffer benutzt?
Man kann den Puffer auf das struct casten, aber dann muss man zusehen dass
das struct genau mit der Format übereinstimmt, was bedeuten kann man muss
dem Compiler die Daumenschrauben anlegen, das ist nicht immer 100% Portabel.
Hübsch ist das nicht, sollte man vermeiden wo geht, aber es ist meist schnell,
es sei denn du musst eh die Endianess anpassen.

jemand eine Idee?
Jens

struct disk_packet
{
byte size_pack;
byte reserved1;
byte no_of_blocks;
byte reserved2;
word offset;
word segment;
dword lba1;
dword lba2;



Kann dein Compiler kein long long?

} disk_pack;

void LBASectorRead(void *buffer, unsigned long lba)



Ich würde mir ein typedef für lbas machen, damit man die nachher schnell gegen
was größeres austauschen kann.

{
unsigned char bError = 0;
REGS regs;

disk_pack.size_pack = 16;
disk_pack.no_of_blocks = 1;
disk_pack.reserved1 = 0;
disk_pack.reserved2 = 0;
disk_pack.segment = (((unsigned int)buffer >> 16) << 12);
disk_pack.offset = ((unsigned int)buffer & 0xffff);



Der Code um von linearer Adresse auf segment:offset zu kommen ist doch Banane

Sagen wir die Adresse von buffer ist 0xffff.
Du machst daraus segment 0 und offset 0xffff. Wenn du versuchst da einen Sektor
hinzulesen (512 byte) bekommst du einen Segmentüberlauf.

eigentlich müsste das was in der Art sein:
disk_pack.segment = (uintptr_t)buffer >> 4;
disk_pack.offset = (uintptr_t)buffer & 15;

Es sei denn der EDD kram spielt da auch mit linearen Adressen, nur in einem
komischen Format, oder far pointer, oder das ist aus der BIOS32 Ära.
Ist der Compiler im 16 Bit Modus?

disk_pack.lba2 = lba >> 32;
disk_pack.lba1 = lba & 0xffffffff;




Und solange deine lba nur long sind, ist der Code eh Banane.
Was so nicht schlimm wàre, wenn
lba >> 32
nicht undefiniertes Verhalten wàre. Du darfst in C nicht weiter
schieben als ein Datentyp Bits-1 hat. Liegt daran dass das verschiedene
CPUs unterschiedlich handhaben (einige machens brav, andere machen das
modulo, so das du in dem Fall 0 schieben würdest, andere unterstützen
das überhaupt nicht und der Compiler erzeugt dann Code der Bitmüll erzeugt).
Darum ist der Compiler frei hier von Anfang an Müll zu erzeugen.
Trick:
(lba >> 16) >> 16;

[snip]

Gruss
Jan

Ähnliche fragen