21xrx.com
2024-12-22 22:47:47 Sunday
登录
文章检索 我的文章 写文章
C++获取磁盘型号
2023-07-05 14:38:27 深夜i     --     --
C++语言 磁盘型号 获取方法

在进行磁盘管理时,我们需要获取磁盘的型号来进行一些特定的操作,如确定是否需要更新磁盘驱动程序或进行故障排除等。在C++语言中,获取磁盘型号可以通过系统API函数和设备管理器来实现。

1. 使用系统API函数

可以使用GetLogicalDriveStrings函数来获取系统中逻辑驱动器的名称。这个函数会返回一个包含所有逻辑驱动器名称的空间分隔字符串。我们可以遍历这个字符串,并使用GetDriveType函数来获取每个驱动器的类型。

当获取到磁盘驱动器时,可以使用DeviceIoControl函数以及IOCTL_STORAGE_QUERY_PROPERTY控制码来获取磁盘属性,如磁盘型号、序列号等。具体步骤如下:

首先,需要打开驱动器句柄,可以使用CreateFile函数来打开驱动器,例如打开C盘:

HANDLE hDrive = CreateFile(_T("\\\\.\\C:"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

接着,创建一个STORAGE_PROPERTY_QUERY结构体对象,并将其成员设置为获取磁盘属性:

STORAGE_PROPERTY_QUERY query;

memset(&query, 0, sizeof(STORAGE_PROPERTY_QUERY));

query.PropertyId = StorageDeviceProperty;

query.QueryType = PropertyStandardQuery;

然后,创建一个缓冲区来存储属性信息。读取属性信息的方法是将这个缓冲区作为输入参数传递给DeviceIoControl函数,并将获取到的属性信息写入到这个缓冲区中:

char buf[512] = { 0 };

DWORD dwBytesReturned = 0;

BOOL bRet = DeviceIoControl(hDrive, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(STORAGE_PROPERTY_QUERY), &buf, sizeof(buf), &dwBytesReturned, NULL);

最后,我们就可以从缓冲区中获取磁盘型号等属性信息了:

if (bRet)

{

  PSTORAGE_DEVICE_DESCRIPTOR pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)buf;

  char* pszModelNumber = buf + pDevDesc->ProductIdOffset;

  printf("磁盘型号:%s\n", pszModelNumber);

}

2. 使用设备管理器

除了使用系统API函数外,我们还可以使用设备管理器来获取磁盘型号。设备管理器是一个包含所有硬件设备信息的管理面板,它可以为我们提供设备的详细信息。我们可以通过枚举磁盘设备的方式来获取磁盘型号。

首先,需要加载设备管理器:

HMODULE hModule = LoadLibrary(_T("devmgr.dll"));

if (hModule == NULL)

  return 0;

接着,定义一个函数指针类型PfnDevMgr_Init,并通过GetProcAddress函数获取到DevMgr_Init函数的函数指针:

typedef BOOL(WINAPI* PfnDevMgr_Init)();

PfnDevMgr_Init pfnDevMgr_Init = (PfnDevMgr_Init)GetProcAddress(hModule, "DevMgr_Init");

if (pfnDevMgr_Init == NULL)

{

  FreeLibrary(hModule);

  return 0;

}

然后,通过调用DevMgr_Init函数来初始化设备管理器:

BOOL bRet = (*pfnDevMgr_Init)();

if (!bRet)

{

  FreeLibrary(hModule);

  return 0;

}

接着,通过调用DevMgr_EnumDevices函数来枚举所有设备:

typedef struct _EnumDevicesInfo

{

  DWORD dwIndex;

  WCHAR szDisplayName[512];

} ENUM_DEVICES_INFO, *PENUM_DEVICES_INFO;

typedef BOOL(WINAPI* PfnDevMgr_EnumDevices)(DWORD dwFlags, DWORD dwType, LPARAM lParam, PVOID pvReserved);

PfnDevMgr_EnumDevices pfnDevMgr_EnumDevices =

  (PfnDevMgr_EnumDevices)GetProcAddress(hModule, "DevMgr_EnumDevices");

if (pfnDevMgr_EnumDevices == NULL)

{

  FreeLibrary(hModule);

  return 0;

}

PENUM_DEVICES_INFO pInfo = new ENUM_DEVICES_INFO;

DWORD dwIndex = 0;

while ((*pfnDevMgr_EnumDevices)(0, DEVCLASS_DISKDRIVE, dwIndex, pInfo))

{

  // 找到磁盘设备

  if (wcsstr(pInfo->szDisplayName, L"Disk drives") != NULL)

  {

    // 获取设备详细信息

    TCHAR szDeviceID[MAX_DEVICE_ID_LEN] = { 0 };

    if (CM_Get_Device_ID((DEVINST)pInfo->dwIndex, szDeviceID, ARRAYSIZE(szDeviceID), 0) == CR_SUCCESS)

    {

      HKEY hKey;

      if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szDeviceID, 0, KEY_READ, &hKey) == ERROR_SUCCESS)

      {

        TCHAR szModel[256] = { 0 };

        DWORD dwSize = sizeof(szModel);

        if (RegQueryValueEx(hKey, _T("Model"), NULL, NULL, (LPBYTE)szModel, &dwSize) == ERROR_SUCCESS)

        {

          printf("磁盘型号:%S\n", szModel);

        }

        RegCloseKey(hKey);

      }

    }

  }

  dwIndex++;

}

最后,通过FreeLibrary函数释放加载的DLL模块:

FreeLibrary(hModule);

总结

以上两种方法都可以获取磁盘型号,方法一需要更多的代码,但是可以获取更多的磁盘属性信息;方法二使用了设备管理器,可以方便地获取设备详细信息。开发者可以选择更适合自己的方法来获取磁盘型号。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复