这两个操作是通过Windows自身提供的命令来实现,代码如下
void CheckFilesystem(int nDriveNo, BOOL bFixErrors)
{
wchar_t szMsg[CC_LONG_PATH+1], szParam[CC_LONG_PATH+1];
WCHAR szDriveRoot[] = { (WCHAR)('A' + nDriveNo), ':', 0 };
if (bFixErrors && AskWarnYesNo("FILESYS_REPAIR_CONFIRM_BACKUP") == IDNO)
return;
swprintf(szMsg, GetString(bFixErrors ? "REPAIRING_FS" : "CHECKING_FS"), szDriveRoot);
swprintf(szParam, bFixErrors ? L"/C echo %s & chkdsk %s /F /X & pause" : L"/C echo %s & chkdsk %s & pause", szMsg, szDriveRoot);
ShellExecuteW(NULL, IsUnAdminButSupportUAC() ? L"runas" : L"open", L"cmd.exe", szParam, NULL, SW_SHOW);
}
BOOL RemoveDeviceWriteProtection(HWND hWnd, LPCWSTR lpVolumePath)
{
int iDeviceNumber;
int iPartitionNumber;
WCHAR szTemp[CC_LONG_PATH+1];
WCHAR szCmdBatch[CC_LONG_PATH+1];
WCHAR szDiskpartScript[CC_LONG_PATH+1];
if (swscanf(lpVolumePath, L"\\Device\\Harddisk%d\\Partition%d", &iDeviceNumber, &iPartitionNumber) != 2)
{
return FALSE;
}
if (GetTempPathW(ARRAYSIZE(szTemp), szTemp) == 0)
{
return FALSE;
}
swprintf_s(szCmdBatch, ARRAYSIZE(szCmdBatch), L"%s\\CnCrypt_Write_Protection_Removal.cmd", szTemp);
swprintf_s(szDiskpartScript, ARRAYSIZE(szDiskpartScript), L"%s\\CnCrypt_Write_Protection_Removal.diskpart", szTemp);
FILE *fFile = _wfopen(szCmdBatch, L"w");
if (!fFile)
{
handleWin32Error(hWnd);
return FALSE;
}
fwprintf(fFile, L"@diskpart /s \"%s\"\n@pause\n@del \"%s\" \"%s\"", szDiskpartScript, szDiskpartScript, szCmdBatch);
CheckFileStreamWriteErrors(fFile, szCmdBatch);
fclose(fFile);
fFile = _wfopen(szDiskpartScript, L"w");
if (!fFile)
{
handleWin32Error(hWnd);
DeleteFileW(szCmdBatch);
return FALSE;
}
fwprintf(fFile, L"select disk %d\nattributes disk clear readonly\n", iDeviceNumber);
if (iPartitionNumber != 0)
{
fwprintf(fFile, L"select partition %d\nattributes volume clear readonly\n", iPartitionNumber);
}
fwprintf(fFile, L"exit\n");
CheckFileStreamWriteErrors(fFile, szDiskpartScript);
fclose(fFile);
ShellExecuteW(NULL, IsUnAdminButSupportUAC() ? L"runas" : L"open", szCmdBatch, NULL, NULL, SW_SHOW);
return TRUE;
}