SECURITY_SET_PASSWORD с использованием DeviceIoControl() с ошибкой ATA_PASS_THROUGH_EX

Я пробовал ATA_PASS_THROUGH_EX или ATA_PASS_THROUGH_DIRECT в функции DeviceIoControl() с командой ATA SECURITY_SET_PASSWORD, но это всегда терпело неудачу с GetLastError()=87 (недопустимый параметр). Но команда ATA IDENTIFY всегда завершается успешно.

Среда ОС: Windows 8.1 64bit, Visual Studio 2010, мое приложение имеет права администратора.

Моя цель - выпустить SECURITY ERASE UNIT, как эта страница в 64-битной Windows 8.1: https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase

Как и на приведенной выше веб-странице, когда я пытался использовать «hdparm» на компакт-диске Ubuntu Live CD для безопасного стирания, не было проблем с тем же оборудованием и тем же SSD.

Не могли бы вы указать мне, что не так с моим кодом?

    m_h = CreateFile("\\\\.\\PhysicalDrive1", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);  
    if ( m_h == INVALID_HANDLE_VALUE ) 
        return 0;

#if 1
    char buffer[512 + sizeof(ATA_PASS_THROUGH_EX)] = { 0 };

    ATA_PASS_THROUGH_EX& PTE = *(ATA_PASS_THROUGH_EX *)buffer;

    PTE.Length = sizeof(PTE);
    PTE.DataTransferLength = 512;
    PTE.DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX);
    PTE.TimeOutValue = 10;
    PTE.AtaFlags = ATA_FLAGS_DATA_OUT | ATA_FLAGS_DRDY_REQUIRED;

    IDEREGS* ir = (IDEREGS*)PTE.CurrentTaskFile;
    ir->bCommandReg = 0xF1;

    strcpy(buffer + sizeof(ATA_PASS_THROUGH_EX) + 2, "test");

    DWORD bytes = 0;
    if (DeviceIoControl(m_h, IOCTL_ATA_PASS_THROUGH, &buffer, sizeof(buffer), &buffer, sizeof(buffer), &bytes, 0) == 0 ) {
        DWORD er = GetLastError();
        printf("error: %d\n", GetLastError());
        return false;
    }
#else   
    DWORD dataSize = sizeof(ATA_PASS_THROUGH_DIRECT) + 512;
    ATA_PASS_THROUGH_DIRECT* pPTD = (ATA_PASS_THROUGH_DIRECT*) VirtualAlloc(NULL, dataSize, MEM_COMMIT, PAGE_READWRITE);

    pPTD->Length = sizeof(ATA_PASS_THROUGH_DIRECT); 
    pPTD->DataTransferLength = 512; 
    pPTD->DataBuffer = ((char*)pPTD) + sizeof(ATA_PASS_THROUGH_DIRECT); // sizeof(ATA_PASS_THROUGH_DIRECT);
    pPTD->TimeOutValue =  10;
    pPTD->AtaFlags = ATA_FLAGS_DATA_OUT | ATA_FLAGS_DRDY_REQUIRED;
    pPTD->CurrentTaskFile[1] = 0x01;
    pPTD->CurrentTaskFile[6] = 0xF1;

    strcpy( ((char*)pPTD->DataBuffer) + 2, "test");

    DWORD bytes = 0;
    if (!DeviceIoControl(m_h, IOCTL_ATA_PASS_THROUGH_DIRECT,  pPTD,  dataSize, pPTD, dataSize, &bytes, NULL)) {
        printf("error: %d\n", GetLastError());
        return false;
    }
#endif  
    return true;

person luke    schedule 22.09.2015    source источник


Ответы (1)


Я думаю, что эти команды ATA заблокированы ОС: SECURITY SET PASSWORD, SECURITY ERASE UNIT. Поскольку я успешно запустил вышеуказанную программу в 32-битной и 64-битной Windows 7, но в Windows 8 (32-битная / 64-битная) и Windows 10 (32-битная / 64-битная) та же программа показывает недопустимую ошибку параметра (код ошибки 87).

person luke    schedule 27.09.2015
comment
Да вроде так: social.msdn.microsoft.com/Forums/windowsdesktop/en-US/ - person Ben; 06.03.2019