HDDのSerianNumberを取得する方法

レジストリキーの

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi

以下のTreeに

\Scsi Port w\Scsi Bus x\Target Id y\Logical Unit Id z\SerialNumber

という値が存在するので、これを利用することにしました。
Wmi32_DiskDriveを使って、次のようなロジックで処理しました。

    WmiResult disk_drive = wmi.access(_T("SELECT * FROM Win32_DiskDrive"));
    if (disk_drive.items() == 0) {
        String msg = wmi.getErrorMessage();
        return;
    }
    COUT << disk_drive.print();

    for (size_t i = 0; i < disk_drive.size(); i++) {
        String reg_key = WmiCall::createSelect(_T("HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port %d\\Scsi Bus %d\\Target Id %d\\Logical Unit Id %d"),
                                                disk_drive.getLong(_T("SCSIPort"), i),
                                                disk_drive.getLong(_T("SCSIBus"), i),
                                                disk_drive.getLong(_T("SCSITargetId"), i),
                                                disk_drive.getLong(_T("SCSILogicalUnit"), i),
                                                NULL);
        HKEY hkey = NULL;
        int rc = ERROR_SUCCESS;
        if ((rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_key.c_str(), 0, KEY_READ, &hkey)) == ERROR_SUCCESS) {
            DWORD buffSize = 0;
            DWORD valueType = 0;
            rc = RegQueryValueEx(hkey, _T("SerialNumber"), 0, &valueType, NULL, &buffSize);
            String result;
            if (rc == ERROR_SUCCESS) {
                buffSize++;
                char *buff = (char *)calloc(buffSize, sizeof(char));
                if (buff != NULL) {
                    if (RegQueryValueEx(hkey, _T("SerialNumber"), 0, &valueType, (unsigned char *)buff, &buffSize) == ERROR_SUCCESS) {
                        _bstr_t value = _bstr_t(buff);
                        result = String((_TCHAR *)buff);    
                    }
                    free(buff);
                }
            }
            RegCloseKey(hkey);
            if (!result.empty()) {
                COUT << _T("SerialNumber = ") << result << endl;
            }
        }
    }