2015-09-22 1 views
1

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; 

Répondre

0

Je pense que ces commandes ATA bloqué par OS: SÉCURITÉ MOT DE PASSE, LA SÉCURITÉ UNITÉ ERASE. Parce que j'ai exécuté avec succès au-dessus du programme à Windows 7 32bit et Windows 7 64bit mais dans Windows 8 (32bit/64bit) et Windows 10 (32bit/64bit), le même programme affiche erreur de paramètre invalide (code d'erreur 87).