分类: 服务器与存储
2008-06-25 04:19:32
1、访问
在注册表
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDiskEnum
下面可以看到计算机当前的状态,这里可以看到所有的存储设备的情况,包括计算机的硬盘,通过情况下,名称为0的是计算机硬盘,所以在列出的选择设备时,会把名称为0的屏蔽,不然太危险,一旦造成系统的破坏,后果会很麻烦。对注册表的读写:
HKEY hkey;
char sz[256];
DWORD dwtype,sl = 256;
for(int i=1;i<8;i++)
{
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Services\Disk\Enum",
NULL, KEY_ALL_ACCESS, &hkey)==ERROR_SUCCESS)
{
CString id;
id.Format("%d",i);
if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)
{
CString str=(CString)sz;
m_select.AddString(sz);
}
}
}
RegCloseKey(hkey);
2、对磁盘的扇区的操作
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );由于访问的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。至于其他参数的使用与操作普通文件时的用法相同。
DWORD SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod);
int ReadDisk(CString driver,unsigned char *Buf,long addr)
3、用RC4加密算法对。
{
HANDLE hDevice;
BOOL bResult;
DWORD bytesread;
hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if(hDevice==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Error!");
return 0;
}
if(addr!=0)
{
SetFilePointer(hDevice,512*addr,NULL,NULL);
}
bResult=ReadFile(hDevice,Buf,512,&bytesread,NULL);
if((bResult==FALSE)||(bytesread<512))
{
AfxMessageBox("Error!");
return 0;
}
CloseHandle(hDevice);
return 1;
}
RC4_KEY rc4_key;
build_rc4_key(Key,strlen((char*)Key),&rc4_key);
rc4_handler(MBRBuf,strlen((char*)MBRBuf),&rc4_key);
4、U盘插入计算机时的自动感知
LRESULT CRawDiskDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
后期改进
{
if ( WM_DEVICECHANGE == message && FALSE == bCopy )
{
}
return CDialog::WindowProc(message, wParam, lParam);
}
可以让用户输入密码,将密码作为密钥去加密和解密。