DeviceIOcontrol获取物理磁盘个数
时间: 2024-04-29 13:23:13 浏览: 128
获得磁盘物理磁盘号代码
4星 · 用户满意度95%
可以使用DeviceIOControl函数获取物理磁盘的个数。具体实现方法如下:
1. 打开一个物理磁盘设备句柄,调用CreateFile函数,设置参数为:
文件名:物理磁盘设备路径,例如"\\\\.\\PhysicalDrive0",数字0表示第一个物理磁盘。
访问模式:GENERIC_READ | GENERIC_WRITE
共享模式:FILE_SHARE_READ | FILE_SHARE_WRITE
安全性描述符:NULL
2. 调用DeviceIOControl函数,设置参数为:
设备句柄:上一步中返回的句柄
控制码:IOCTL_STORAGE_QUERY_PROPERTY
输入缓冲区:STORAGE_PROPERTY_QUERY结构体,其中的PropertyId字段设置为StorageDeviceProperty,QueryType字段设置为PropertyStandardQuery
输入缓冲区大小:sizeof(STORAGE_PROPERTY_QUERY)
输出缓冲区:存放设备属性信息的缓冲区,可以先设置为一定大小,如果返回的信息超过缓冲区大小,则继续调用DeviceIOControl函数,并增大缓冲区大小,直到返回的信息能够全部存放在缓冲区中
输出缓冲区大小:缓冲区大小
返回值:如果函数调用成功,则返回非零值,否则返回0
3. 解析返回的设备属性信息,判断是否为物理磁盘,并统计物理磁盘的个数。
4. 关闭设备句柄,调用CloseHandle函数。
参考代码如下:
```c++
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
int main()
{
HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed, error code: %d\n", GetLastError());
return 0;
}
STORAGE_PROPERTY_QUERY query;
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
STORAGE_DESCRIPTOR_HEADER header;
DWORD dwBytesReturned = 0;
BOOL bRet = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &header, sizeof(header), &dwBytesReturned, NULL);
if (!bRet)
{
printf("DeviceIoControl failed, error code: %d\n", GetLastError());
CloseHandle(hDevice);
return 0;
}
DWORD dwBufferSize = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512;
PSTORAGE_DEVICE_DESCRIPTOR pDesc = (PSTORAGE_DEVICE_DESCRIPTOR)malloc(dwBufferSize);
ZeroMemory(pDesc, dwBufferSize);
pDesc->Size = dwBufferSize;
bRet = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), pDesc, dwBufferSize, &dwBytesReturned, NULL);
if (!bRet)
{
printf("DeviceIoControl failed, error code: %d\n", GetLastError());
CloseHandle(hDevice);
free(pDesc);
return 0;
}
if ((pDesc->DeviceType == DIRECT_ACCESS_DEVICE) && (pDesc->BusType == BusTypeSata))
{
printf("This is a physical disk.\n");
}
else
{
printf("This is not a physical disk.\n");
}
CloseHandle(hDevice);
free(pDesc);
return 0;
}
```
阅读全文