#include <stdio.h>
#include <windows.h>
#include <winioctl.h>
#include <ntddscsi.h>
int main(int argc, char* argv[])
{
HANDLE hDevice;
ATA_PASS_THROUGH_DIRECT aptd;
BYTE DataBuffer[512] = { 0 };
DWORD ByteReturned;
hDevice = CreateFile(L"\\\\.\\PHYSICALDRIVE0", GENERIC_ALL, 0, 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 | ATA_FLAGS_NO_MULTIPLE;
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] = 1; //Sector Number Register
aptd.CurrentTaskFile[3] = 1; //Cylinder Low Register
aptd.CurrentTaskFile[4] = 1; //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))
{
FILE * p = NULL;
fopen_s(&p,"22.txt","wb");
for (int i = 0; i < 512; i++)
{
if (i % 16 == 0)
{
printf("\n");
}
fwrite(&DataBuffer[i],1,1,p);
printf("%02X ", DataBuffer[i]);
}
fclose(p);
printf("\n读取磁盘完成!\n");
}
else
{
printf("DeviceIoControl错误!");
}
}
else
{
printf("打开设备失败!");
}
CloseHandle(hDevice);
getchar();
return 0;
}
ATA读取磁盘扇区数据
最新推荐文章于 2023-07-04 09:29:56 发布