首页 > 系统相关 >windows 获取 磁盘 serialnum

windows 获取 磁盘 serialnum

时间:2023-12-19 11:11:37浏览次数:42  
标签:std windows storagePropertyQuery STORAGE serialnum DWORD 磁盘 serial buf

 

#include <Windows.h>
#include <iostream>
#include <iomanip>
#include <ntddscsi.h>

int main() {
const wchar_t* drivePath = L"\\\\.\\PhysicalDrive0"; // 设置为磁盘的路径,根据需要更改

HANDLE hDevice = CreateFileW(
drivePath,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
nullptr,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
nullptr
);

if (hDevice == INVALID_HANDLE_VALUE) {
DWORD error = GetLastError();
std::cerr << "Error opening the device. Error code: " << error << std::endl;
return 1;
}

STORAGE_PROPERTY_QUERY storagePropertyQuery;
storagePropertyQuery.PropertyId = StorageDeviceProperty;
storagePropertyQuery.QueryType = PropertyStandardQuery;

STORAGE_DESCRIPTOR_HEADER storageDescriptorHeader;
DWORD bytesReturned;

if (DeviceIoControl(
hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
&storagePropertyQuery,
sizeof(storagePropertyQuery),
&storageDescriptorHeader,
sizeof(storageDescriptorHeader),
&bytesReturned,
nullptr
))
{
// 根据返回的 STORAGE_DESCRIPTOR_HEADER 获取设备信息
DWORD bufferSize = storageDescriptorHeader.Size;
std::vector<char> buffer(bufferSize);

if (DeviceIoControl(
hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
&storagePropertyQuery,
sizeof(storagePropertyQuery),
buffer.data(),
bufferSize,
&bytesReturned,
nullptr
))
{
STORAGE_DEVICE_DESCRIPTOR* deviceDescriptor = reinterpret_cast<STORAGE_DEVICE_DESCRIPTOR*>(buffer.data());

// 序列号在设备描述符的后面,跳过 VendorId 和 ProductId
wchar_t* serialNumber = reinterpret_cast<wchar_t*>(buffer.data() + deviceDescriptor->SerialNumberOffset);

std::wcout << L"Serial Number: " << serialNumber << std::endl;
}
else {
DWORD error = GetLastError();
std::cerr << "Error getting storage query property. Error code: " << error << std::endl;
}
}
else {
DWORD error = GetLastError();
std::cerr << "Error getting storage query property header. Error code: " << error << std::endl;
}

CloseHandle(hDevice);

return 0;
}

 

 

 

 

std::string get_disk_smart_serials(int index)
{
std::string ret;

char physical[256]{ 0 };
sprintf_s(physical, 256, "\\\\.\\PhysicalDrive%d", index);

HANDLE disk = CreateFileA(physical, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (disk != INVALID_HANDLE_VALUE)
{
STORAGE_PROPERTY_QUERY query{ };
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;

const int b_size = 1024 * 10;
char* buf = new char[b_size];
if (buf)
{
memset(buf, 0, b_size);
DWORD r = 0;
BOOL status = DeviceIoControl(disk, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), buf, b_size, &r, NULL);
if (status)
{
STORAGE_DEVICE_DESCRIPTOR* descrip = (STORAGE_DEVICE_DESCRIPTOR*)buf;
if (descrip->SerialNumberOffset > 0)
{
std::string serial = buf + descrip->SerialNumberOffset;
serial.erase(std::remove_if(serial.begin(), serial.end(), [](unsigned char x) {return std::isspace(x); }), serial.end());
ret = serial;
}
}

delete[] buf;
}

CloseHandle(disk);
}

return ret;
}

参考:

https://blog.csdn.net/zzy1448331580/article/details/124696129

 

标签:std,windows,storagePropertyQuery,STORAGE,serialnum,DWORD,磁盘,serial,buf
From: https://www.cnblogs.com/rebrobot/p/17913235.html

相关文章

  • windows本地部署webUI框架遇到的问题及解决
    最近对stablediffusion比较感兴趣,就想着拿一些模型在本地跑一跑感受一下,也想训练一些自己的模型玩一玩,刚开始参照网上的教程及github上的官方教程一直安装不成功,总是报错:torch安装不成功或其他的一些,本人系统是win10,总结了一些可以尝试的解决方法如下:1.对conda使用不是很熟悉,......
  • linux系统,磁盘、镜像、目录挂载和未挂载,查看命令
    查看系统中存在磁盘或镜像、设备lsblk 使用lsblk命令查看系统上的所有块设备信息:blkid blkid命令可以更详细的查看未挂载磁盘,不仅能查看大小,还可以看到其他更多的信息fdisk-lfdisk-l命令可以列出系统中未挂载的所有磁盘,执行该命令后会列出当前系统的所有磁盘,其中......
  • Linux 查看磁盘空间
    一、查看文件系统使用率df-h二、查看目录下文件大小du-sh*#包含隐藏目录du-sh.[^.]**|sort-h......
  • 【Windows】微软自带的系统阴影副本(VSS)
    学习就是在生活的方方面面!在前两天和我的老哥的一次闲聊中,老哥介绍了Windows系统的NTFS磁盘自带的,类似于快照的系统,VSS于是我就开始了学习! 1.什么是VSSVSS是微软公司的一种技术,全称为VolumeShadowCopyService(卷影复制服务)。VSS是Windows操作系统中的一个功能,用于创建文......
  • Windows11忘记开机密码重置
    在锁屏页面按着shift键重启,找到命令行输入一下两行代码copyc:\windows\system\system32\utilman.exec:\windows\system32\utilman.exebakcopyc:\windows\system32\cmd.exec:\windows\system32\utilman.exe/y然后退出命令行,重启计算机,在输入密码页面右下角有一个轻松使......
  • GPU监控终端部署(windows)
    目的:使用nvidia_gpu_expoter配合prometheus+grafana监控GPU性能环境部署:WindowsPowerShellISE管理员打开#[Net.ServicepointManager]::SecurityProtocol  检查TLS是否支持1.2#如果支持下一步,不支持则输入(#[Net.ServicePointManager]::SecurityProtocol=[Net.Se......
  • Linux 查看磁盘空间
    一、查看文件系统使用率df-h二、查看目录下文件大小du-sh*#包含隐藏目录du-sh.[^.]**|sort-h......
  • LVM磁盘
    深入了解Linux中的逻辑卷管理(LVM)Linux作为一种强大的操作系统,提供了多种高级磁盘管理技术,其中之一就是逻辑卷管理(LogicalVolumeManagement,简称LVM)。LVM允许对磁盘空间进行更灵活、更动态的管理,提高了系统对存储资源的利用率。在这篇博客中,我们将深入研究Linux中LVM的概......
  • 磁盘阵列/视频监控系统EasyCVR新增邮件验证与定时更换登录密码功能
    TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,包括对人、车、......
  • 使用微pe装windows系统
      1、工具/原料:U盘(4g以上--因为win10的镜像有4个g以上)、微Pe软件 2、方法/操作首先,使用百度搜索“微Pe工具”下载软件,此软件相对来讲比较小,只有117M,而且操作简单。之后双击软件运行,在”安装至其它介质“后,选择第一个图标--安装PE至U盘。在弹出......