C++ 打开原始磁盘并获取OS X的大小
使用下面的代码,我能够成功地在我的机器上打开一个原始磁盘,但是当我得到磁盘长度时,每次都得到0C++ 打开原始磁盘并获取OS X的大小,c++,macos,file-io,disk,C++,Macos,File Io,Disk,使用下面的代码,我能够成功地在我的机器上打开一个原始磁盘,但是当我得到磁盘长度时,每次都得到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"); } 使用这两种方法获取大小将
// 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;
/
我对在非Windows平台上编程并不完全熟悉,所以请原谅任何看起来奇怪的事情。我的问题是:
在搜索了一下
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, §or_count);
uint32_t sector_size = 0;
// Query the size of each sector
ioctl(dev, DKIOCGETBLOCKSIZE, §or_size);
uint64_t disk_size = sector_count * sector_size;
printf("%ld", disk_size);
return 0;
}
#包括
#包括
#包括
int main()
{
//开盘
uint32_t dev=open(“/dev/disk1”,仅适用于此);
如果(dev==-1){
perror(“无法打开磁盘”);
返回-1;
}
uint64扇区计数=0;
//查询磁盘上的扇区数
ioctl(开发、DKIOCGETBLOCKCOUNT和扇区计数);
uint32扇区大小=0;
//查询每个扇区的大小
ioctl(开发、DKIOCGETBLOCKSIZE和扇区大小);
uint64磁盘大小=扇区计数*扇区大小;
printf(“%ld”,磁盘大小);
返回0;
}
像这样的事情应该会奏效。我只是将我的代码复制到其中,所以我不确定它是否可以编译,但它应该可以。虽然是访问原始磁盘的好方法,但获得这样的大小可能不会如您所注意到的那样起作用(另外,您可能应该先尝试
lseek64
)。可能可以使用ioctl
或fcntl
获取大小,否则您必须通过一些特殊的OSX特定函数获取信息。@JoachimPileborg我已经定义了(文件)偏移量(位64)。。。这些行为是否不一样?@JoachimPileborg doing:lseek(设备,0x7fffff-1,SEEK\u SET)
实际上返回0x7fffffe,因此位被丢弃或者磁盘不支持lseek(…,0,SEEK\u END)代码>,但据我所知,他们应该。编辑:我不知道为什么我以前没有做lseek(设备,0xFFFFFFFF+5,SEEK\u SET)
,但是返回4,所以我假设位被删除了。好的。我今天出去了,意识到我今天的比赛还不是最棒的。0xFFFFFFFF+5由于位溢出(而不是将其强制转换为INT64)而生成4。当我直接搜索20003880960L
时,我的应用程序输出“磁盘已成功打开。长度:0x4A8530000”。很抱歉造成这种混乱…@Lander:您愿意自己编辑或简单回答您的问题吗?实际上它不会这样工作-无符号int扇区至少需要无符号长,否则第一个ioctl将导致其他堆栈变量被破坏(“dev”使用默认编译器设置和正在探测的相当小的磁盘将写入零)更恰当地说,根据sys/disk中的数据结构,这些变量需要是uint64_t和uint32_t。h@Lander我正在尝试你的代码,但我总是在“打开”中出错,您知道原因是什么吗?@RuLoViC可能与此有关,或者您需要以root用户身份运行应用程序。映射错误代码将为您提供更好的想法。系统调用将设置errno
,然后您可以将其与值进行比较。解决SIP的正确方法是什么?我试图打开一个设备(外部USB磁盘),但即使作为root用户,MacOS(10.1.4.2)也不会给我访问权限。
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
#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, §or_count);
uint32_t sector_size = 0;
// Query the size of each sector
ioctl(dev, DKIOCGETBLOCKSIZE, §or_size);
uint64_t disk_size = sector_count * sector_size;
printf("%ld", disk_size);
return 0;
}