BOOL WINAPI DeviceIoControl(
_In_ HANDLE hDevice,
_In_ DWORD dwIoControlCode,
_In_opt_ LPVOID lpInBuffer,
_In_ DWORD nInBufferSize,
_Out_opt_ LPVOID lpOutBuffer,
_In_ DWORD nOutBufferSize,
_Out_opt_ LPDWORD lpBytesReturned,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
hDevice
:设备句柄,通过CreateFile获得dwIoControlCode
:控制码,每个控制码都提供了lpInBuffer,nInBufferSize,lpOutBuffer和nOutBufferSize参数的使用细节lpInBuffer
,nInBufferSize
,lpOutBuffer
,nOutBufferSize
根据控制码不同lpOutBuffer
缓冲区大于实际缓冲区则lpBytesReturned 为实际缓冲区大小,如果lpOutBuffer
缓冲区小于实际缓冲区则lpBytesReturned为lpOutBuffer
缓冲区大小lpOverlapped
基本不使用,直接NULL通过CreateFile
打开设备驱动程序的句柄时,应指定FILE_SHARE_READ
和FILE_SHARE_WRITE
访问标志。但是,当您打开通信资源(如串行端口)时,必须指定独占访问权限。FileName通常以如下形式:
文件名称 | 含义 |
---|---|
\\.\PhysicalDriveX | 获取物理驱动器X的信息,X以下标0开始计算 |
\\.\X: | 获取逻辑分区X的信息,例如C盘:\\.\C: |
bool getDiskDesc(int index)
{
TCHAR szDrvName[MAX_PATH] = _T("");
_stprintf_s<MAX_PATH>(szDrvName, _T("\\\\.\\PhysicalDrive%d"), index);
HANDLE hDevice = NULL;
try
{
hDevice = CreateFile(szDrvName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
return false;
}
DWORD dwOutBytes = 0;
STORAGE_PROPERTY_QUERY Query;
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
std::string buf(1024, 0);
BOOL bResult = ::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &Query, sizeof(Query), (char *)buf.data(), buf.capacity() - 1, &dwOutBytes, NULL);
if (bResult)
{
PSTORAGE_DEVICE_DESCRIPTOR pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)buf.data();
if (pDevDesc->Size >= buf.capacity())
{
buf.resize(pDevDesc->Size + 1);
bResult = ::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, &Query, sizeof(Query), (char *)buf.data(), buf.capacity() - 1, &dwOutBytes, NULL);
if (!bResult)
{
CloseHandle(hDevice);
return false;
}
pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)buf.data();
}
STORAGE_BUS_TYPE bsutype = pDevDesc->BusType;
//char *SerialNumber = &buf[pDevDesc->SerialNumberOffset];
//char *Vendor = &buf[pDevDesc->VendorIdOffset];
if (pDevDesc->ProductIdOffset > 0)
{
char *ProductId = &buf[pDevDesc->ProductIdOffset];
printf("DISK pId:%s,type:%d\r\n", ProductId, bsutype);
}
CloseHandle(hDevice);
return true;
}
}
catch (...)
{
}
CloseHandle(hDevice);
return false;
}
枚举所有物理驱动器信息:
int nindex = 0;
while (getDiskDesc(nindex++)){};
type 7:表示usb设备