2,新增“Apps”; 3,新增“Common”; 4,新增“FileList”; 5,新增“MediaX”; 6,新增“OpenSource”; 7,新增“Samples”; 8,新增“SoftwareBusinessLines”.
283 lines
8.2 KiB
C++
283 lines
8.2 KiB
C++
#if _MSC_VER >= 1600
|
||
#pragma execution_character_set("utf-8")
|
||
#endif
|
||
|
||
#include "DiskAccessor.h"
|
||
|
||
DiskAccessor::DiskAccessor()
|
||
{
|
||
m_eAccessMode = AM_None;
|
||
m_hDisk = NULL;
|
||
m_bOpen = false;
|
||
}
|
||
|
||
DiskAccessor::~DiskAccessor()
|
||
{}
|
||
|
||
bool DiskAccessor::OpenDisk(__in LARGE_INTEGER& varDiskCapacity , __in int nDiskID, AccessMode eAccessMode)
|
||
{
|
||
memset(&varDiskCapacity, 0, sizeof(LARGE_INTEGER) );
|
||
|
||
char szDriverBuffer[128] = {0};
|
||
memset(szDriverBuffer, 0, sizeof(szDriverBuffer) );
|
||
|
||
sprintf(szDriverBuffer, "\\\\.\\PhysicalDrive%d" , nDiskID);
|
||
|
||
DWORD dwDesiredAccess = GENERIC_READ;
|
||
|
||
switch(eAccessMode)
|
||
{
|
||
case AM_ReadOnly:
|
||
{
|
||
dwDesiredAccess = GENERIC_READ;
|
||
break;
|
||
}
|
||
case AM_WriteOnly:
|
||
{
|
||
dwDesiredAccess = GENERIC_WRITE;
|
||
break;
|
||
}
|
||
case AM_ReadWrite:
|
||
{
|
||
dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
dwDesiredAccess = GENERIC_READ;
|
||
break;
|
||
}
|
||
}
|
||
|
||
//CreateFile获取到设备句柄
|
||
m_hDisk = ::CreateFileA(
|
||
szDriverBuffer, // 设备名称,这里指第一块硬盘,多个硬盘的自己修改就好了
|
||
dwDesiredAccess/*GENERIC_READ | GENERIC_WRITE*/, // 指定访问方式
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享模式为读|写,0表示不能共享
|
||
NULL, // NULL表示该句柄不能被子程序继承
|
||
OPEN_EXISTING, // 打开已经存在的文件,文件不存在则函数调用失败
|
||
NULL, // 指定文件属性
|
||
NULL);
|
||
|
||
if(INVALID_HANDLE_VALUE == m_hDisk)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
DWORD dwBytesReturned = 0;
|
||
DeviceIoControl(m_hDisk,IOCTL_DISK_GET_LENGTH_INFO ,NULL, 0, &varDiskCapacity, sizeof(LARGE_INTEGER), &dwBytesReturned, NULL);
|
||
|
||
m_eAccessMode = eAccessMode;
|
||
m_bOpen = true;
|
||
|
||
return true;
|
||
}
|
||
|
||
void DiskAccessor::CloseDisk()
|
||
{
|
||
if(!m_bOpen)
|
||
{
|
||
return;
|
||
}
|
||
|
||
::CloseHandle(m_hDisk);
|
||
m_hDisk = NULL;
|
||
|
||
m_bOpen = false;
|
||
m_eAccessMode = AM_None;
|
||
}
|
||
|
||
bool DiskAccessor::ReadData(__out byte* pReadData, __in int nReadDataLen, __in LARGE_INTEGER varOffset)
|
||
{
|
||
if(!m_bOpen)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if(!(AM_ReadOnly == m_eAccessMode || AM_ReadWrite == m_eAccessMode) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
memset (pReadData, 0, nReadDataLen);
|
||
|
||
SetFilePointer(m_hDisk, varOffset.LowPart, &varOffset.HighPart, FILE_BEGIN);
|
||
|
||
DWORD dwReadDataSize = 0; //计数
|
||
|
||
BOOL bResult = ReadFile(m_hDisk, pReadData, nReadDataLen, &dwReadDataSize, NULL);
|
||
|
||
if(FALSE == bResult)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool DiskAccessor::WriteData(__in byte* pWriteData, __in int nWriteDataLen, __in LARGE_INTEGER varOffset)
|
||
{
|
||
if(!m_bOpen)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if(!(AM_WriteOnly == m_eAccessMode || AM_ReadWrite == m_eAccessMode) )
|
||
{
|
||
return false;
|
||
}
|
||
|
||
SetFilePointer(m_hDisk, varOffset.LowPart, &varOffset.HighPart, FILE_BEGIN);
|
||
|
||
DWORD dwWriteDataSize = 0; //计数
|
||
|
||
BOOL bResult = WriteFile(m_hDisk, pWriteData, nWriteDataLen, &dwWriteDataSize, NULL);
|
||
|
||
if(FALSE == bResult)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool DiskAccessor::EnumDisks(vector<DiskInfo>& vecDiskInfo)
|
||
{
|
||
char szDriverBuffer[128] = {0};
|
||
memset(szDriverBuffer, 0, sizeof(szDriverBuffer) );
|
||
|
||
vecDiskInfo.clear();
|
||
|
||
bool bDiskExist = false;
|
||
|
||
//格式化设备文件名称
|
||
for(int nDiskNo = 0; nDiskNo < 64; nDiskNo++)
|
||
{
|
||
sprintf(szDriverBuffer, "\\\\.\\PhysicalDrive%d" , nDiskNo);
|
||
|
||
//CreateFile获取到设备句柄
|
||
HANDLE hDevice = ::CreateFileA(
|
||
szDriverBuffer, // 设备名称,这里指第一块硬盘,多个硬盘的自己修改就好了
|
||
GENERIC_READ/* | GENERIC_WRITE*/, // 指定读访问方式
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享模式为读|写,0表示不能共享
|
||
NULL, // NULL表示该句柄不能被子程序继承
|
||
OPEN_EXISTING, // 打开已经存在的文件,文件不存在则函数调用失败
|
||
NULL, // 指定文件属性
|
||
NULL);
|
||
|
||
if(INVALID_HANDLE_VALUE != hDevice)
|
||
{
|
||
GET_LENGTH_INFORMATION varLength;
|
||
DWORD bytesReturned = 0;
|
||
DeviceIoControl(hDevice,IOCTL_DISK_GET_LENGTH_INFO ,NULL,0,&varLength,sizeof(varLength),&bytesReturned,NULL);
|
||
|
||
::CloseHandle(hDevice);
|
||
hDevice = NULL;
|
||
|
||
DiskInfo varDiskInfo = {0};
|
||
varDiskInfo.nDiskID = nDiskNo;
|
||
memcpy(&varDiskInfo.varDiskCapacity, &varLength, sizeof(LARGE_INTEGER) );
|
||
|
||
vecDiskInfo.push_back(varDiskInfo);
|
||
|
||
bDiskExist = true;
|
||
}
|
||
}
|
||
|
||
return bDiskExist;
|
||
}
|
||
|
||
bool DiskAccessor::GetDiskLength(LARGE_INTEGER& varDiskLength, int nDiskID)
|
||
{
|
||
memset(&varDiskLength, 0, sizeof(LARGE_INTEGER) );
|
||
|
||
char szDriverBuffer[128] = {0};
|
||
memset(szDriverBuffer, 0, sizeof(szDriverBuffer) );
|
||
|
||
sprintf(szDriverBuffer, "\\\\.\\PhysicalDrive%d" , nDiskID);
|
||
|
||
//CreateFile获取到设备句柄
|
||
HANDLE hDevice = ::CreateFileA(
|
||
szDriverBuffer, // 设备名称,这里指第一块硬盘,多个硬盘的自己修改就好了
|
||
GENERIC_READ/* | GENERIC_WRITE*/, // 指定读访问方式
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享模式为读|写,0表示不能共享
|
||
NULL, // NULL表示该句柄不能被子程序继承
|
||
OPEN_EXISTING, // 打开已经存在的文件,文件不存在则函数调用失败
|
||
NULL, // 指定文件属性
|
||
NULL);
|
||
|
||
if(INVALID_HANDLE_VALUE == hDevice)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
DWORD dwBytesReturned = 0;
|
||
DeviceIoControl(hDevice,IOCTL_DISK_GET_LENGTH_INFO ,NULL, 0, &varDiskLength, sizeof(LARGE_INTEGER), &dwBytesReturned, NULL);
|
||
|
||
::CloseHandle(hDevice);
|
||
hDevice = NULL;
|
||
|
||
return true;
|
||
}
|
||
|
||
HANDLE GetDiskHandle( int iDiskNo)
|
||
{
|
||
char szDriverBuffer[128];
|
||
memset (szDriverBuffer,0,128);
|
||
//格式化设备文件名称
|
||
sprintf(szDriverBuffer, "\\\\.\\PhysicalDrive%d" ,iDiskNo);
|
||
|
||
HANDLE m_hDevice = NULL;
|
||
|
||
//CreateFile获取到设备句柄
|
||
m_hDevice = CreateFileA(
|
||
szDriverBuffer, // 设备名称,这里指第一块硬盘,多个硬盘的自己修改就好了
|
||
GENERIC_READ/* | GENERIC_WRITE*/, // 指定读访问方式
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享模式为读|写,0表示不能共享
|
||
NULL, // NULL表示该句柄不能被子程序继承
|
||
OPEN_EXISTING, // 打开已经存在的文件,文件不存在则函数调用失败
|
||
NULL, // 指定文件属性
|
||
NULL);
|
||
|
||
if (m_hDevice==INVALID_HANDLE_VALUE)
|
||
{
|
||
m_hDevice = NULL;
|
||
//无效
|
||
return INVALID_HANDLE_VALUE;
|
||
}
|
||
//设备句柄
|
||
return m_hDevice;
|
||
}
|
||
|
||
BOOL ReadSectorData( HANDLE & hDevice, UINT64 redpos,__out char * lpOutBuffer512 )
|
||
{
|
||
memset (lpOutBuffer512,0,512);
|
||
|
||
LARGE_INTEGER li;
|
||
li.QuadPart = redpos*0x200; //0x200 = 512,求出扇区的 字节地址,通过设置读取的地址和长度进行read
|
||
|
||
SetFilePointer(hDevice,li.LowPart,&li.HighPart,FILE_BEGIN);
|
||
|
||
DWORD DCount = 0; //计数
|
||
|
||
BOOL bResult = ReadFile(hDevice, lpOutBuffer512,512, &DCount, NULL);
|
||
|
||
return bResult;
|
||
}
|
||
|
||
BOOL WriteSectorData( HANDLE & hDevice, UINT64 redpos,__in char * lpInBuffer512 )
|
||
{
|
||
//memset (lpOutBuffer512,0,512);
|
||
|
||
LARGE_INTEGER li;
|
||
li.QuadPart = redpos*0x200; //0x200 = 512,求出扇区的 字节地址,通过设置读取的地址和长度进行read
|
||
|
||
SetFilePointer(hDevice,li.LowPart,&li.HighPart,FILE_BEGIN);
|
||
|
||
DWORD DCount = 0; //计数
|
||
|
||
BOOL bResult = WriteFile(hDevice, lpInBuffer512,512, &DCount, NULL);
|
||
|
||
return bResult;
|
||
}
|