Получить серийник NVMe диска
От: maks1180  
Дата: 11.09.20 18:27
Оценка:
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, ...)
===============================================
(реклама, удалена модератором)
Re: Получить серийник NVMe диска
От: MTimur  
Дата: 16.09.20 19:35
Оценка:
Здравствуйте, 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.