使用硬盘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;
}
#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;
}
相关文章推荐
- Linux下读取磁盘硬盘容量大小的C代码实现,不用df -h命令
- Linux 磁盘管理及基础命令使用
- Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍
- 实用Linux命令,不求最全但求实用-------磁盘使用情况du,df
- CMD文件中用FOR命令读取文本文件内容到变量,以及和PsExec搭配使用的方法和例子
- 使用FileInputStream类, 实现从磁盘读取本应用程序源代码文件,并将文件内容显示在屏幕上。
- linux查看硬盘使用情况命令
- 使用fdisk命令对linux硬盘进行操作
- ubuntu 查看磁盘使用情况命令
- 磁盘管理及文件系统管理中各种命令的使用
- [转]Linux查看磁盘使用情况命令
- 使用os包和flag包实现读取main命令入参
- Linux命令总结_查看主机磁盘使用
- linux: 基本命令之:查看磁盘空间, netstat, wc简单使用
- 磁盘必须经过初始化,逻辑磁盘管理器才能访问——笔记本硬盘作为移动硬盘使用时遇到的问题
- VirtualBox使用物理硬盘分区作虚拟机磁盘
- Linux系统中使用 DD 命令测试 USB 和 SSD 硬盘的读写速度
- 使用hdparm命令发送ATA“Secure Erase”指令恢复SSD硬盘的写性能
- linux下查看硬盘空间使用情况的命令
- df 查看磁盘使用情况命令