Невозможно перейти в НЕ ЗАМОРОЖЕННОЕ состояние для дисковода с помощью DeviceIoControl () - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь написать программу безопасного стирания как для твердотельных накопителей, так и для жестких дисков. Из того, что я собрал по указанной ссылке (https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase), перед вами есть ряд шагов, которые необходимо выполнить может выдать команду ATA_SECURE_ERASE_UNIT на ваш диск, смутные шаги:

  1. Убедитесь, что ваш диск не заморожен.
  2. Установите пароль для вашего диска.
  3. Отправить Команда ATA_SECURE_ERASE_PREPARE.
  4. Наконец, отправьте ATA_SECURE_ERASE_UNIT для выпуска secure_erase.

Я написал программу для этого, и я попытался запустить ее из предварительной среды windows, надеясь, что диск остается не замороженным, но после выдачи ATA_IDENTIFY_DEVICE возвращает security_frozen параметр как 1.

Теперь я где-то читал, что перевод вашего диска в спящий режим с помощью SLEEP и сброс его с помощью DEVICE_RESET может перевести ваш диск в состояние NOT FROZEN , Но это не похоже на работу. Я попробовал это, и вызовы DeviceIoControl () использовали go через штраф, но, несмотря на это, IDENTIFY_DEVICE возвращает security_frozen как 1.

Вот код, который я написал:

char buffer_sleep[512 + sizeof(ATA_PASS_THROUGH_EX)] = { 0 };
    ATA_PASS_THROUGH_EX& PTE_sleep = *(ATA_PASS_THROUGH_EX*)buffer_sleep;
    IDEREGS* ir_sleep = (IDEREGS*)PTE_sleep.CurrentTaskFile;
    PTE_sleep.AtaFlags = ATA_FLAGS_DATA_IN | ATA_FLAGS_DRDY_REQUIRED;
    PTE_sleep.Length = sizeof(PTE_sleep);
    PTE_sleep.DataTransferLength = 512;
    PTE_sleep.TimeOutValue = 10;
    PTE_sleep.DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX);
    ir_sleep->bCommandReg = IDE_COMMAND_SLEEP;

rs = DeviceIoControl(ssdDiskObj, IOCTL_ATA_PASS_THROUGH, &PTE_sleep, sizeof(PTE_sleep) ,&buffer_sleep, sizeof(buffer_sleep), &bytes, NULL);
    if (rs == FALSE) {
        printf("\nError returned on sleep CMD: %d\n\n", GetLastError());
    }
    else printf("\n\nSleep BOOL returned : %d\n", rs);
    printf("Sleep BYTES RETURNED : %d\n", bytes);

   char buffer_reset[512 + sizeof(ATA_PASS_THROUGH_EX)] = { 0 };
    ATA_PASS_THROUGH_EX& PTE_reset = *(ATA_PASS_THROUGH_EX*)buffer_reset;
    IDEREGS* ir_reset = (IDEREGS*)PTE_reset.CurrentTaskFile;
    PTE_reset.AtaFlags = ATA_FLAGS_DATA_OUT | ATA_FLAGS_DRDY_REQUIRED;
    PTE_reset.Length = sizeof(PTE_reset);
    PTE_reset.DataTransferLength = 512;
    PTE_reset.TimeOutValue = 10;
    PTE_reset.DataBufferOffset = sizeof(PTE_reset);
    ir_reset->bCommandReg = IDE_COMMAND_ATAPI_RESET;

    rs = DeviceIoControl(ssdDiskObj, IOCTL_ATA_PASS_THROUGH, &buffer_reset, sizeof(buffer_reset), &buffer_reset, sizeof(buffer_reset), &bytes, NULL);
    if (rs == FALSE) {
        printf("\nError returned on reset CMD: %d\n\n", GetLastError());
    }
    else printf("\n\nReset BOOL returned : %d\n", rs);
    printf("Reset BYTES RETURNED : %d\n", bytes);

    char buffer_post_reset[512 + sizeof(ATA_PASS_THROUGH_EX)] = { 0 };
    ATA_PASS_THROUGH_EX& PTE_post_reset = *(ATA_PASS_THROUGH_EX*)buffer_post_reset;
    IDEREGS* ir_post_reset = (IDEREGS*)PTE_post_reset.CurrentTaskFile;

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

    ir_post_reset->bCommandReg = IDE_COMMAND_IDENTIFY;

    rs = DeviceIoControl(ssdDiskObj, IOCTL_ATA_PASS_THROUGH, &PTE_post_reset, sizeof(PTE_post_reset), buffer_post_reset, sizeof(buffer_post_reset), &bytes, NULL);
    if (rs == FALSE) {
        printf("Error returned on identify device CMD: %d", GetLastError());
    }
    else printf("\n\nPrint BOOL returned : %d\n", rs);
    printf("Print BYTES RETURNED : %d\n", bytes);
    data = *(PIDENTIFY_DEVICE_DATA)(buffer_post_reset + sizeof(PTE_post_reset));
    revcode = data.MasterPasswordID;
    printf("\n---------------------------DRIVE STATISTICS-----------------------------------\n");
    printf("SECURITY PARAMETERS :\n\nsecurity_supported:%d\nsecurity_enabled:%d\nsecurity_locked:%d\nsecurity_frozen:%d\nenhanced_secure_erase_unit_supported:%d\nsanitize feature supported:%d\nmaster_password_id:%d",
        data.SecurityStatus.SecuritySupported, data.SecurityStatus.SecurityEnabled,
        data.SecurityStatus.SecurityLocked, data.SecurityStatus.SecurityFrozen,
        data.SecurityStatus.EnhancedSecurityEraseSupported, data.SanitizeFeatureSupported,
        data.MasterPasswordID);
    printf("\n\nGENERAL CONFIGURATION :\n\nIs Fixed Device :%d\nIs Removable Media : %d\nDevice Type :%d",
        data.GeneralConfiguration.FixedDevice, data.GeneralConfiguration.RemovableMedia,
        data.GeneralConfiguration.DeviceType);
    printf("\n\nERASE TIMINGS :\n\nsecure erase time : %d seconds\nenhanced secure erase time : %d seconds\n",
        data.NormalSecurityEraseUnit.TimeRequired, data.EnhancedSecurityEraseUnit.TimeRequired);
    printf("\n------------------------------------------------------------------------------\n");

Что я делаю не так ?? Может кто-нибудь выручить меня с помощью сна, перезагрузки или еще предложить лучший способ разморозить устройство. Я тестирую на ноутбуке, поэтому физическое отключение кабелей SATA для меня невозможно.

PS: Команды IDE, приведенные в bCommandReg, являются макросами для реальных команд ATA.

Любая помощь очень ценится. Заранее спасибо !!

...