Windows 10 возвращает нормальный размер и модель диска, но заместо серийника ерунда, но для SATA дисков всё хорошо возвращает, делаю так:
char szDriveName[64];
sprintf(szDriveName, "\\\\.\\PhysicalDrive%u", dwDrive);
HANDLE hDrive = ::CreateFile(szDriveName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
DeviceIoControl(hDrive, IOCTL_STORAGE_QUERY_PROPERTY, ...)
Здравствуйте, maks1180, Вы писали:
M>Windows 10 возвращает нормальный размер и модель диска, но заместо серийника ерунда, но для SATA дисков всё хорошо возвращает, делаю так:
M>char szDriveName[64];
M>sprintf(szDriveName, "\\\\.\\PhysicalDrive%u", dwDrive);
M>HANDLE hDrive = ::CreateFile(szDriveName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
M>DeviceIoControl(hDrive, IOCTL_STORAGE_QUERY_PROPERTY, ...)
HANDLE hScsiDriveIOCTL = CreateFile ("\\\\.\\Scsi0:",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING,
0,
NULL);
for (nDrive = 0; nDrive < 2; nDrive++)
{
char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];
SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer;
SENDCMDINPARAMS *pin =
(SENDCMDINPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
DWORD dummy;
memset (buffer, 0, sizeof (buffer));
p -> HeaderLength = sizeof (SRB_IO_CONTROL);
p -> Timeout = 10000;
p -> Length = SENDIDLENGTH;
p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
strncpy ((char *) p -> Signature, "SCSIDISK", 8);
pin -> irDriveRegs.bCommandReg = 0xEC;
pin -> bDriveNumber = nDrive;
if (DeviceIoControl (hScsiDriveIOCTL,
IOCTL_SCSI_MINIPORT,
buffer,
sizeof (SRB_IO_CONTROL) + sizeof (SENDCMDINPARAMS) - 1,
buffer,
sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
&dummy, NULL))
{
SENDCMDOUTPARAMS *pOut = (SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
/// ===>>> pId->sSerialNumber
}
}
CloseHandle (hScsiDriveIOCTL);