1.监视硬盘
void CDiskOperDlg::OnButtonMonitorDisk() // 监视硬盘
{
UpdateData(TRUE); // 从控件获取数据
DWORD dwWaitStatus;
HANDLE dwChangeHandle;
dwChangeHandle=FindFirstChangeNotification(m_DiskName, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME);
if (dwChangeHandle==INVALID_HANDLE_VALUE)
return;
bMonitor = TRUE;
WriteLog("正在监视%c盘重命名操作......", m_DiskName[0]);
while (bMonitor)
{
dwWaitStatus = WaitForSingleObject(dwChangeHandle, INFINITE);
if (dwWaitStatus == WAIT_OBJECT_0)
{
WriteLog("检测到%s文件重命名操作",m_DiskName);
MessageBox(m_DiskName,"检测到磁盘重命名操作");
if (FindNextChangeNotification(dwChangeHandle) == FALSE)
bMonitor = FALSE;
}
Sleep(100);
}
FindCloseChangeNotification(dwChangeHandle);
}
2.格式化磁盘
void CDiskOperDlg::OnButtonFormat() // 格式化磁盘
{
UpdateData(TRUE);
UINT uiDriver = m_DiskName[0] - 'A';
HINSTANCE hInstance=LoadLibrary(_T("Shell32.dll"));
if (hInstance == NULL) return;
PFUNCTIONFORMAT pFunctionFormat=(PFUNCTIONFORMAT)GetProcAddress(hInstance, _T("SHFormatDrive"));
if(pFunctionFormat==NULL)
{ // 如果没有获取格式化SHFormatDrive函数的指针,则返回
FreeLibrary(hInstance);
return;
}
DWORD dwResult = (pFunctionFormat)(this->m_hWnd, uiDriver, SHFMT_ID_DEFAULT, SHFMT_OPT_FULL);
switch (dwResult)
{
case SHFMT_ERROR:
WriteLog("格式化磁盘%s发生错误", m_DiskName);
break;
case SHFMT_CANCEL:
WriteLog("取消格式化磁盘%s", m_DiskName);
break;
case SHFMT_NOFORMAT:
WriteLog("不能格式化磁盘%s", m_DiskName);
break;
default:
WriteLog("格式化磁盘%s成功", m_DiskName);
break;
}
FreeLibrary(hInstance);
return;
}
3.关闭磁盘共享
void CDiskOperDlg::OnButtonDelshare() // 关闭磁盘共享
{
UpdateData(TRUE); // 从控件获取数据
WCHAR wsz[MAX_PATH]; // 定义Unicode字符数组
CString disk; // 定义磁盘共享名称变量
disk.Format("%c$", m_DiskName[0]); // 格式化磁盘共享名称
wcscpy(wsz, disk.AllocSysString()); // 将共享名称转换到Unicode字符数组
NET_API_STATUS dwStatus = NetShareDel(NULL,(LPWSTR)wsz,0); // 关闭磁盘共享
switch(dwStatus) // 判断操作返回值,并输出提示信息
{
case NERR_Success:
WriteLog("成功关闭%s磁盘共享\n", disk);
break;
case ERROR_ACCESS_DENIED:
WriteLog("关闭%s磁盘共享错误\n原因=用户没有权限执行此项操作。", disk);
break;
case ERROR_INVALID_PARAMETER:
WriteLog("关闭%s磁盘共享错误\n原因=参数无效。", disk);
break;
case ERROR_NOT_ENOUGH_MEMORY:
WriteLog("关闭%s磁盘共享错误\n原因=内存不足。", disk);
break;
case NERR_NetNameNotFound:
WriteLog("关闭%s磁盘共享错误\n原因=不存在此共享名称。", disk);
break;
default:
WriteLog("关闭%s磁盘共享错误\n原因=未知。", disk);
break;
}
}
4.设置磁盘卷标
void CDiskOperDlg::OnButtonSetvolum() // 设置磁盘卷标
{
UpdateData(TRUE); // 从控件获取数据
if (SetVolumeLabel(m_DiskName, "我的系统盘")) // 设置磁盘卷标
WriteLog("设置%s磁盘卷标成功", m_DiskName);
else WriteLog("设置%s磁盘卷标失败", m_DiskName);
}
5.磁盘碎片整理
void CDiskOperDlg::OnButtonSpzl() // 磁盘碎片整理
{
system("defrag E:");
}
6.AT32转换为NTFS
void CDiskOperDlg::OnButtonFat32tontfs() // 从FAT32转换为NTFS
{
system("convert E: /FS:NTFS");
}
7.隐藏磁盘分区
void CDiskOperDlg::OnButtonHidedisk() // 隐藏磁盘分区
{
UpdateData(TRUE); // 从控件获取数据
memset(szPath,0x00, sizeof(szPath));// 初始化路径变量
CString csDisk; // 定义磁盘名称
csDisk.Format("%c:", m_DiskName[0]);// 格式化要隐藏的磁盘名称
if (QueryDosDeviceA(csDisk, szPath, MAX_PATH) == 0) // 查询磁盘对应的设备路径
{
WriteLog("获取磁盘分区%s路径名失败", csDisk); // 查询失败,显示结果
return; // 查询失败,返回
}
if (DefineDosDeviceA(DDD_REMOVE_DEFINITION, csDisk, NULL)) // 删除设备路径名称的定义,即隐藏磁盘分区
WriteLog("隐藏磁盘分区%s成功。\r\n路径名称=%s", csDisk, szPath); // 操作成功,显示操作日志
else
WriteLog("隐藏磁盘分区%s失败。\r\n路径名称=%s", csDisk, szPath); // 操作失败,显示操作日志
}
8.隐藏的磁盘分区
void CDiskOperDlg::OnButtonShowdisk() // 显示被隐藏的磁盘分区
{
UpdateData(TRUE); // 从控件获取数据
CString csDisk; // 定义磁盘名称
csDisk.Format("%c:", m_DiskName[0]);// 格式化要隐藏的磁盘名称
if (DefineDosDevice(DDD_RAW_TARGET_PATH, csDisk, szPath)) // 增加指定设备路径对应的磁盘名称
WriteLog("显示被隐藏的磁盘分区%s成功。\r\n路径名称=%s", csDisk, szPath);// 操作成功,显示操作日志
else
WriteLog("显示被隐藏的磁盘分区%s失败。\r\n路径名称=%s", csDisk, szPath);// 操作失败,显示操作日志
}
9.更改分区号
void CDiskOperDlg::OnButtonUpdatediskno() // 更改分区号
{
UpdateData(TRUE); // 从控件获取数据
HMODULE hKernel = GetModuleHandle("kernel32"); // 装载kernel32.dll
if (hKernel)
{
// 获取GetVolumeNameForVolumeMountPointA函数入口
PROCGET getAPI = (PROCGET)GetProcAddress(hKernel,"GetVolumeNameForVolumeMountPointA");
// 获取DeleteVolumeMountPointA函数入口
PROCDEL delAPI = (PROCDEL)GetProcAddress(hKernel,"DeleteVolumeMountPointA");
// 获取SetVolumeMountPointA函数入口
PROCSET setAPI = (PROCSET)GetProcAddress(hKernel,"SetVolumeMountPointA");
char szVolName [MAX_PATH]; // 定义卷名变量
DWORD dwLen; // 定义卷名长度变量
if (!getAPI(m_DiskName, szVolName, &dwLen)) // 查询指定分区的卷名
{
WriteLog("查询分区%s的卷名失败。", m_DiskName); // 显示错误信息
return; // 查询失败,返回
}
if (!delAPI(m_DiskName)) // 删除卷名对应的分区号
{
WriteLog("删除卷名为%s对应的%s分区号。", szVolName, m_DiskName); // 显示错误信息
return; // 删除失败,返回
}
if (!setAPI(_T("Z:\\"), szVolName)) // 为卷设置新的分区号为Z
{
WriteLog("将卷名为%s的分区号改为Z:失败。", szVolName); // 显示错误信息
return; // 设置失败,返回
}
WriteLog("将卷名为%s的分区号改为Z:成功。\r\n原来的分区号=%s", szVolName, m_DiskName);// 显示日志
}
else WriteLog("装载kernel32失败!"); // 显示装载DLL失败信息
}