您的位置:首页 > 其它

使用硬盘ATA命令读取磁盘

2013-03-31 22:45 155 查看
看网上也没有什么类似的代码,这里我就发一个,下面的程序是读取硬盘的第1个扇区!

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <winioctl.h>
#define ULONG_PTR ULONG
#include <ntddscsi.h> //SDK里面的头文件
using namespace std;

int main(int argc, char* argv[])
{
HANDLE hDevice;
ATA_PASS_THROUGH_DIRECT aptd;
BYTE DataBuffer[512] = {0};
DWORD ByteReturned;

hDevice = CreateFile("\\\\.\\PHYSICALDRIVE0",GENERIC_ALL,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hDevice != INVALID_HANDLE_VALUE)
{
aptd.Length = sizeof(ATA_PASS_THROUGH_DIRECT);
aptd.AtaFlags = ATA_FLAGS_DATA_IN;
aptd.PathId = 0;
aptd.TargetId = 0;
aptd.Lun = 0;
aptd.ReservedAsUchar = 0;
aptd.DataTransferLength = sizeof(DataBuffer);
aptd.TimeOutValue = 3;
aptd.ReservedAsUlong = 0;
aptd.DataBuffer = DataBuffer;
ZeroMemory(aptd.PreviousTaskFile,sizeof(aptd.PreviousTaskFile));
aptd.CurrentTaskFile[0] = 0; //Features Register
aptd.CurrentTaskFile[1] = 1; //Sector Count Register
aptd.CurrentTaskFile[2] = 0; //Sector Number Register
aptd.CurrentTaskFile[3] = 0; //Cylinder Low Register
aptd.CurrentTaskFile[4] = 0; //Cylinder High Register
aptd.CurrentTaskFile[5] = 0; //Device/Head Register
aptd.CurrentTaskFile[6] = 0x20; //Command Register
aptd.CurrentTaskFile[7] = 0; //Reserved
if(DeviceIoControl(hDevice,IOCTL_ATA_PASS_THROUGH_DIRECT,&aptd,sizeof(ATA_PASS_THROUGH_DIRECT),&aptd,sizeof(ATA_PASS_THROUGH_DIRECT),&ByteReturned,NULL))
{
for (int i = 0;i < 512;i++)
{
if (i%16 ==0)
{
printf("\n");
}
printf("%02X ",DataBuffer[i]);
}
printf("\n读取磁盘完成!\n");
}
else
{
printf("DeviceIoControl错误!");
}
}
else
{
printf("打开设备失败!");
}
CloseHandle(hDevice);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ATA命令 读取磁盘