J'essaie d'identifier un périphérique en utilisant ATA_PASS_THROUGH_EX.Dispositif de commande ATA IDENTIFY
Lorsque je vois le tampon de sortie, il contient toutes les données non valides. Quelqu'un peut-il m'aider à ce que je fais mal?
#include <Windows.h>
#include <ntddscsi.h>
#include <iostream>
void main() {
WCHAR *fileName = (WCHAR *) "\\.\PhysicalDrive0";
HANDLE handle = CreateFile(
fileName,
GENERIC_READ | GENERIC_WRITE, //IOCTL_ATA_PASS_THROUGH requires read-write
FILE_SHARE_READ,
NULL, //no security attributes
OPEN_EXISTING,
0, //flags and attributes
NULL //no template file
);
ATA_PASS_THROUGH_EX inputBuffer;
inputBuffer.Length = sizeof(ATA_PASS_THROUGH_EX);
inputBuffer.AtaFlags = ATA_FLAGS_DATA_IN;
inputBuffer.DataTransferLength = 0;
inputBuffer.DataBufferOffset = 0;
IDEREGS *ir = (IDEREGS *) inputBuffer.CurrentTaskFile;
ir->bCommandReg = 0xEC; //identify device
ir->bSectorCountReg = 1;
unsigned int inputBufferSize = sizeof(ATA_PASS_THROUGH_EX);
UINT8 outputBuffer[512];
UINT32 outputBufferSize = 512;
LPDWORD bytesReturned = 0;
DeviceIoControl(handle, IOCTL_ATA_PASS_THROUGH_DIRECT, &inputBuffer, inputBufferSize, &outputBuffer, outputBufferSize, bytesReturned, NULL);
DWORD error = GetLastError();
std::cout << outputBuffer << std::endl;
system("pause");
}
mise à jour: Quand je vérifie la valeur d'erreur, il est 5, ce qui signifie qu'il est une violation d'accès. Je cours en mode admin. Est-ce que je fais quelque chose de mal?
-Nick
Je suis arrivé ce code d'ici .. http://stackoverflow.com/questions/5070987/sending-ata-commands-directly-to-device-in-windows?rq=1 – Nick
Une poignée est de ne pas créé? Donc, quelque chose doit être faux là .. – Nick
Vous ne vérifiez jamais la valeur de retour de 'CreateFile()'. Qu'est-ce que 'handle' après cet appel? –