J'ai essayé ATA_PASS_THROUGH_EX ou ATA_PASS_THROUGH_DIRECT en fonction DeviceIoControl() avec la commande ATA SECURITY_SET_PASSWORD mais il a toujours échoué avec GetLastError() = 87 (paramètre non valide). Mais la commande ATA IDENTIFY réussit toujours.SECURITY_SET_PASSWORD utilisant DeviceIoControl() avec ATA_PASS_THROUGH_EX a échoué
Environnement de l'environnement: Windows 8.1 64 bits, Visual Studio 2010, mon application a administrateur privillage.
Mon objectif est question SÉCURITÉ ERASE UNIt comme cette page dans le 64bit de Windows 8.1: https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase
Comme ci-dessus page Web, quand j'ai essayé d'utiliser « hdparm » dans le ubuntu CD live pour émettre effacement sécurisé a été sans problème avec le même matériel, et même SSD.
Pourriez-vous s'il vous plaît me guider ce qui ne va pas avec mon code?
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;
si 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;
}
autre
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;