WNDOWS编程获取系统磁盘序号及硬件ID

编程中经常需要排除系统磁盘,如何实现?以下是一些基本概念。

1. 磁盘序号:在磁盘管理页面显示的磁盘0/1/2等,0、1、2即磁盘序号。

2. 磁盘硬件ID:设备管理器页面某设备右键->详细信息->硬件ID。

获取步骤:

1. 通过GetSystemDirectory)获取系统路径。

        2. 通过DeviceIOControl获取磁盘序号。

3. 查看注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Disk\Enum,查找磁盘序号对应的磁盘硬件ID。



详细代码如下:

//获取系统磁盘信息,包含系统磁盘序号、硬件ID。
//系统磁盘序号由函数返回,硬件ID以参数的形式获取。
//返回-1,代表函数失败。
 int GetSysDiskInfo(char *pDiskHardID, int nBufLen)
{
	int nDiskOrder = -1;
	HANDLE hDevice = INVALID_HANDLE_VALUE; 
	DWORD nRealRead = 0;

	STORAGE_DEVICE_NUMBER sdnDisk;
	char sSystemDriveName[WIN_PATH_MAX_LEN]; //系统所在驱动器,一般为\\.\C:。
	memset(&sdnDisk, 0, sizeof(STORAGE_DEVICE_NUMBER));
	memset(sSystemDriveName, 0, sizeof(sSystemDriveName));

	const char DiskEnumRegPath[] = "SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum\\";
	HKEY DiskEnumRegKey = NULL;

	if (NULL == pDiskHardID || nBufLen < 0)
	{
		goto END;
	}

	//获取系统盘符
	sprintf_s(sSystemDriveName, sizeof(sSystemDriveName), "\\\\.\\");
	GetSystemDirectory(sSystemDriveName + strlen(sSystemDriveName), sizeof(sSystemDriveName) - strlen(sSystemDriveName));
	if (NULL == strchr(sSystemDriveName + strlen("\\\\.\\"), '\\'))
	{
		goto END;
	}
	*(strchr(sSystemDriveName + strlen("\\\\.\\"), '\\')) = 0;

	//获取系统磁盘序号
	if ((hDevice = CreateFile(sSystemDriveName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE
			|| 0 == DeviceIoControl(hDevice, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdnDisk, sizeof(sdnDisk), &nRealRead, NULL))
	{
		goto END;
	}
	
	//磁盘序号转换成字符串
	memset(sSystemDriveName, 0, sizeof(sSystemDriveName));
	itoa(sdnDisk.DeviceNumber, sSystemDriveName, 10);
	if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, DiskEnumRegPath, 0, KEY_READ, &DiskEnumRegKey)
			|| ERROR_SUCCESS != RegQueryValueEx(DiskEnumRegKey, sSystemDriveName, NULL, NULL, (LPBYTE)pDiskHardID, (LPDWORD)&nBufLen))
	{
		goto END;
	}
	nDiskOrder = sdnDisk.DeviceNumber;
END:
	if (hDevice != INVALID_HANDLE_VALUE)
	{
		CloseHandle(hDevice);
	}  
	if (DiskEnumRegKey != NULL)
	{
		RegCloseKey(DiskEnumRegKey);
	}

	return nDiskOrder;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值