Files
CodeRepository/Apps/App_FastDiskAccessor/DiskAccessor.cpp
chenzhen 222dda1e43 1,新增“App_ThermalImageSystem”;
2,新增“Apps”;
3,新增“Common”;
4,新增“FileList”;
5,新增“MediaX”;
6,新增“OpenSource”;
7,新增“Samples”;
8,新增“SoftwareBusinessLines”.
2026-02-14 23:03:23 +08:00

283 lines
8.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}