Откройте Raw Disk и получите размер OS X - PullRequest
10 голосов
/ 31 января 2012

Используя следующий код, я могу успешно открыть сырой диск на моей машине, но когда я получаю длину диска, я получаю 0 каждый раз ...

// Where "Path" is /dev/rdisk1 -- is rdisk1 versus disk1 the proper way to open a raw disk?
Device = open(Path, O_RDWR);
if (Device == -1)
{
    throw xException("Error opening device");
}

И получение размера с помощью обоих этих методов возвращает 0:

struct stat st;

if (stat(Path, &st) == 0)
    _Length = st.st_size;

/

_Length = (INT64)lseek(Device, 0, SEEK_END);
        lseek(Device, 0, SEEK_SET);

Я не совсем знаком с программированием на платформах, отличных от Windows, поэтому, пожалуйста, прости все, что кажется странным. Мои вопросы здесь:

  1. Это правильный способ открыть сырой диск под OS X?
  2. Что может быть причиной того, что размер диска будет возвращен как 0?

Диск, о котором идет речь, - это неформатированный диск, но для тех, кому нужна информация из Дисковой утилиты (с удаленными несущественными данными):

Name :  ST920217 AS Media
Type :  Disk

Partition Map Scheme :  Unformatted
Disk Identifier      :  disk1
Media Name           :  ST920217 AS Media
Media Type           :  Generic
Writable             :  Yes
Total Capacity       :  20 GB (20,003,880,960 Bytes)
Disk Number          :  1
Partition Number     :  0

1 Ответ

8 голосов
/ 19 марта 2012

После небольшого поиска по ioctl кодам запроса я нашел что-то, что действительно работает.

#include <sys/disk.h>
#include <sys/ioctl.h>
#include <fcntl.h>

int main()
{
    // Open disk
    uint32_t dev = open("/dev/disk1", O_RDONLY);

    if (dev == -1) {
        perror("Failed to open disk");
        return -1;
    }

    uint64_t sector_count = 0;
    // Query the number of sectors on the disk
    ioctl(dev, DKIOCGETBLOCKCOUNT, &sector_count);

    uint32_t sector_size = 0;
    // Query the size of each sector
    ioctl(dev, DKIOCGETBLOCKSIZE, &sector_size);

    uint64_t disk_size = sector_count * sector_size;
    printf("%ld", disk_size);
    return 0;
}

Нечто подобное должно сработать. Я просто скопировал код, который у меня был, поэтому я не уверен, что он будет хорошо скомпилирован, но он должен.

...