Я пытаюсь написать программу безопасного стирания как для твердотельных накопителей, так и для жестких дисков. Из того, что я собрал по указанной ссылке (https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase), перед вами есть ряд шагов, которые необходимо выполнить может выдать команду ATA_SECURE_ERASE_UNIT на ваш диск, смутные шаги:
- Убедитесь, что ваш диск не заморожен.
- Установите пароль для вашего диска.
- Отправить Команда ATA_SECURE_ERASE_PREPARE.
- Наконец, отправьте 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.
Любая помощь очень ценится. Заранее спасибо !!