API获取电脑物理硬盘总大小

易语言 2020-07-12 17:48:32

API获取电脑物理硬盘总大小

已经测试的操作系统:{
WINDOWS XP SP3
WINDOWS 7 X64 SP1
WINDOWS 2008 X64

其中包含的知识点:
【1】:CreateFile()打开物理驱动器操作,固定格式:“\\.\PhysicalDriveX”其中X为驱动器的序号。(注意,C语言中\需要转义);
打开后会返回操作的句柄,就可以根据这个句柄进行操作了。关于CreateFile函数,请点击这里查看
由于我们这里进行的是读取信息的操作,所以打开权限为“#GENERIC_READ”只读,同时将Flag置为:#OPEN_EXISTING,表示打开存在的。
这里需要注意一点,如果CreateFile函数执行失败,返回值为:INVALID_HANDLE_VALUE,他的值为-1,而不是0;

【2】:进行过打开之后,就要获取硬盘的信息了,使用API函数:DeviceIoControl,关于更具体的使用方法,请参见MSDN,点击这里(高能,英语不好者慎入)。
使用“#IOCTL_DISK_GET_LENGTH_INFO”可以告知,我们将要获取磁盘的长度,也就是大小。

pOutBuffer 需要的是GET_LENGTH_INFORMATION结构体的地址(点击查看详情),在易语言中使用“长整数”即可,同时将该参数的DLL声明选中“传址”以完成传递地址。
使用“取数据类型尺寸 (#长整数型)”获取长整数在内存中占用的尺寸。并传递给参数:nOutBufferSize;

【3】完成上述操作后,只需要对DeviceIoControl的返回值进行判断,如果为0则为失败,调用取错误信息,然后释放句柄,函数返回。
如果获取成功,则返回长整数。

硬盘句柄 = API_创建文件 (“\\.\PhysicalDrive” + 到文本 (硬盘序号), #GENERIC_READ, 位或 (#FILE_SHARE_READ, #FILE_SHARE_WRITE), 0, #OPEN_EXISTING, 0, 0)
.如果真 (硬盘句柄 = #INVALID_HANDLE_VALUE)
' 如果错误码=126 则为找不到指定的模块。 就是没有这块硬盘。
输出调试文本 (“打开物理硬盘失败,错误码:” + 到文本 (API_取错误信息 ()))
返回 (-1)
.如果真结束
.如果真 (API_设备操作 (硬盘句柄, #IOCTL_DISK_GET_LENGTH_INFO, 0, 0, 长整数, 取数据类型尺寸 (#长整数型), 0, 0) = 0)
输出调试文本 (“获取物理磁盘大小失败,磁盘序号:” + 到文本 (硬盘序号) + “,错误码:” + 到文本 (API_取错误信息 ()))
API_关闭内核对象 (硬盘句柄)
返回 (-1)