VC++信息安全编程(12)安全删除FAT磁盘数据文件
很多时候,为了保护商业秘密,一些文件仅仅许可出现一次,就必须删除。
但是Windows的删除是不完善的,可以通过回收站找回,即使Windows的彻底删除,也不是彻底删除。也可以通过数据恢复软件找回,
我们如何实现彻底删除,用二进制数据填充磁盘,来彻底清除相关数据呢
我们来亲身实践360自带的功能。
详细类源码如下,请见源码分析,安全删除FAT的类
#include "stdafx.h"
#include "SecureDelFAT.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSecureDelFAT::CSecureDelFAT()
{
}
CSecureDelFAT::~CSecureDelFAT()
{
}
int CSecureDelFAT::NtOr98()
{
OSVERSIONINFO osvi;
//判断本软件运行所在的系统版本号
osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx (&osvi);
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
return 2000;
else
{
if((osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
( (osvi.dwMajorVersion > 4) ||
( (osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0) ) ))
return 98;
else
return 0;
}
}
//*******************锁定分区***************************
//形参: 驱动器号、锁定允许、锁定等级
//返回值: 成功返回1,否则返回0
BOOL CSecureDelFAT::LockVolume(BYTE bDrive,DWORD dwPermission,BYTE bLevel)
{
BOOL fResult;
DWORD cb;
HANDLE hDev;
DIOC_REGISTERS reg;
reg.reg_EAX=0x440d;
reg.reg_EBX=MAKEWORD(bDrive,bLevel);
reg.reg_ECX=0x484a;
reg.reg_EDX=dwPermission;
hDev=::CreateFile("\\\\.\\vwin32",0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
fResult=::DeviceIoControl(hDev,VWIN32_DIOC_DOS_IOCTL,
®,sizeof(reg),®,sizeof(reg),&cb,0);
fResult=fResult && !(reg.reg_Flags & CARRY_FLAG);
CloseHandle(hDev);
return fResult;
}
//********************分区解锁*****************************
//形参: 驱动器号
//返回值: 成功返回1,否则返回0
BOOL CSecureDelFAT::UnlockVolume(BYTE bDrive)
{
BOOL fResult;
DWORD cb;
HANDLE hDev;
DIOC_REGISTERS reg={0};
reg.reg_EAX=0x440d;
reg.reg_EBX=bDrive;
reg.reg_ECX=0x486a;
hDev=::CreateFile("\\\\.\\vwin32",0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
fResult=::DeviceIoControl(hDev,VWIN32_DIOC_DOS_IOCTL,
®,sizeof(reg),®,sizeof(reg),&cb,0);
fResult=fResult && !(reg.reg_Flags & CARRY_FLAG);
CloseHandle(hDev);
return fResult;
}
//*************读取指定扇区的内容***************
//形参: 驱动器号、起始扇区、要读取扇区数、内存区
//返回值: 成功返回1,否则返回0
BOOL CSecureDelFAT::ReadSectors(BYTE bDrive,
DWORD dwStartSector,WORD wSectors,LPBYTE lpSectBuff)
{
BOOL fResult;
DWORDcb;
DISKIO dio={0};
DIOC_REGISTERS reg={0};
HANDLEhDev;
hDev=CreateFile("\\\\.\\vwin32",0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
dio.dwStartSector=dwStartSector; //要读取的起始扇区
dio.wSectors=wSectors; //要读取的扇区数
dio.dwBuffer=(DWORD)lpSectBuff; //存放读出扇区的缓冲区
reg.reg_EAX=0x7305;
reg.reg_EBX=(DWORD)&dio;
reg.reg_ECX=-1;
reg.reg_EDX=bDrive;
fResult=::DeviceIoControl(hDev,VWIN32_DIOC_DOS_DRIVEINFO,
 
补充:综合编程 , 安全编程 ,