当前位置:编程学习 > VC++ >>

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,

                  

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,