Frage

Vor, poste ich hier eine Frage um Rat zu fragen, wie man Daten lesen und schreiben von und in das Laufwerk, nicht über Datei-Label wie „aaa.txt“, sondern nur Sektoren .. Ich wurde geraten, um zu versuchen, lesen und schreiben .... aber neue problems'v angehoben ... die haarigen Parameter

int _read( int handle, void *buffer, unsigned int count );

, wenn ich die Funktion und wanto lesen Sektoren aus Laufwerk ... i scheint ich brauche die Zählung einstellen x * 512 zu sein. es hat mehrmals von 512 Bytes sein ...

warum ??? Gibt es einige rohen Funktionen, mit denen mich direkt Byte für Byte verwenden ... Thanx ... btb, wenn ich Wanto das tun, sollte ich meine eigenen I / O-Treiber-Programme entwickeln? Thanx

War es hilfreich?

Lösung

Liest und schreibt an Geräte müssen sowohl Sektor ausgerichtet werden, und mit Bytezählwerte die ganzzahlige Vielfache der Sektorgröße sind.

Sie keine Annahmen über die Sektorgröße machen, sollten Sie die Sektorgröße für jedes Gerät abfragen, und damit dynamisch arbeiten. Typische Größen sind 512 für Festplatten und 2048 für optische Laufwerke.

Wenn Sie Funktionen wollen, mit denen Ihnen Byte für Byte auf Geräte lesen, ohne verschwenderischen Aufwand zu verursachen, versuchen Sie diesen Trick:

FILE *file_pointer = fopen("/path/to/device", "rb");
size_t sector_size;
ioctl(fd, BLKSSZGET, &sector_size);
setvbuf(file_pointer, NULL, _IOFBF, sector_size);

Wenn Sie die Sektorgröße unter Windows erhalten müssen Sie DeviceIoControl() mit IOCTL_DISK_GET_DRIVE_GEOMETRY .

Stdio wird ausrichten sucht Brocken Größe s s und zu lesen. Zusätzlich können Sie einen Puffer von Ihrem eigenen bieten mit posix_memalign() oder _aligned_malloc() , wenn die zugrunde liegende stdio Implementierung dies nicht tun.

Edit: Um eine gewisse Verwirrung in einem Kommentar zu klären

Sie arbeiten mit einem Gerät mit Sektorgröße 512, mit FILE *f;. Sie fseek() 37. f Position ausgeglichen wird aktualisiert, aber nicht versuchen, auf dem Gerät hergestellt wird. Sie fread() 500 Byte. lseek() wird mit einem Versatz von 0. 512 Bytes genannt in f-Puffer gelesen werden. Bytes 37-512 werden in den Puffer kopiert Sie zur Verfügung gestellt. lseek() wird mit einem Offset von 512. 512 Bytes genannt werden gelesen, und die restlichen 463 Bytes Sie erwarten, werden den Puffer Sie fread() weitergegeben kopiert werden. Wenn Sie jetzt sind ein einziges Byte fread(), wäre das einfach aus dem vorhandenen Puffer in f kopiert werden, ohne das Gerät zu treffen.

Andere Tipps

Hier, ich gehe davon aus Sie Linux als Plattform verwenden. Unter Linux wird jedes Gerät eine Datei. Sie erhalten einen Geräteeintrag in / dev finden. Das heißt, Sie können E / A auf dem Laufwerk Lese- / Schreib unter Verwendung z.B. Sie können Ihre Festplattenpartition durch Öffnen / dev / sda1 und lesen n Anzahl von Bytes direkt öffnen.

Verwenden Sie folgenden Code, um genaue Sektorgröße für das Laufwerk zu bestimmen (keinen Fehler im Code arbeiten). Wenn Sie n-ten Sektor lesen wollen, dann lesen Sie einfach n*sector_size Bytes aus dem geöffneten Gerät. Hoffe, das hilft, Ihr Problem zu lösen.

    #include <stdio.h>
    #include <linux/fs.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>

    #define SECTOR_NO 10 /*read 10th sector*/

    int main()
    {
            int sector_size;
            char *buf;
            int n = SECTOR_NO;

            int fd = open("/dev/sda1", O_RDONLY|O_NONBLOCK);
            ioctl(fd, BLKSSZGET, &sector_size);
            printf("%d\n", sector_size);
            lseek(fd, n*sector_size, SEEK_SET);

            buf = malloc(sector_size);
            read(fd, buf, sector_size);

            return 0;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top