1、提升权限函数
1 static BOOL EnaleDebugPrivilege() 2 { 3 HANDLE hToken; 4 BOOL fOk = FALSE; 5 6 if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 7 { 8 TOKEN_PRIVILEGES tp; 9 tp.PrivilegeCount = 1 ; 10 ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid); 11 12 tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; 13 14 AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); 15 fOk = (ERROR_SUCCESS == GetLastError()); 16 CloseHandle(hToken); 17 } 18 return fOk; 19 }
2、增加自启动函数
1 static void AutoRunRegister() 2 { 3 HKEY hKey; 4 char pathtofile[256] = {0}; 5 HMODULE GetModH = GetModuleHandle(NULL); 6 7 GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile)); 8 9 LONG lstatus = RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hKey); 10 11 if (ERROR_SUCCESS == lstatus) 12 { 13 lstatus = RegSetValueEx(hKey, "ProcessKiller",0,REG_SZ,(const byte *)pathtofile,strlen(pathtofile)+1); 14 RegCloseKey(hKey); 15 } 16 }
3、杀进程函数
1 BOOL KillProcess(DWORD ProcessId) 2 { 3 DWORD error = 0; 4 5 HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,TRUE, ProcessId); 6 7 if(hProcess==NULL) 8 { 9 error = ::GetLastError(); 10 return FALSE; 11 } 12 13 14 if(!TerminateProcess(hProcess,0)) 15 { 16 error = ::GetLastError(); 17 18 ::CloseHandle(hProcess); 19 20 return FALSE; 21 } 22 23 ::CloseHandle(hProcess); 24 return TRUE; 25 }
4、检查指定进程名是否存活的函数
1 bool isProcessExist(char *ProcessName, DWORD &processid) 2 { 3 bool bExist = 0; 4 HANDLE hProcessSnap; 5 PROCESSENTRY32 stcPe32 = { 0 }; 6 stcPe32.dwSize = sizeof(PROCESSENTRY32); 7 char FindName[256] = {0}; 8 char ExeName[256] = {0}; 9 10 processid = 0xffffffff; 11 12 _tcscpy(FindName, ProcessName); 13 _tcslwr(FindName); 14 15 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 16 if (hProcessSnap == INVALID_HANDLE_VALUE) 17 return false; 18 19 if (!Process32First(hProcessSnap, &stcPe32)) 20 { 21 CloseHandle(hProcessSnap); 22 return false; 23 } 24 25 do 26 { 27 _tcscpy(ExeName, stcPe32.szExeFile); 28 _tcslwr(ExeName); 29 30 if (NULL != strstr(ExeName,FindName)) 31 { 32 bExist = true; 33 processid = stcPe32.th32ProcessID; 34 break; 35 } 36 } while (Process32Next(hProcessSnap, &stcPe32)); 37 38 CloseHandle(hProcessSnap); 39 40 return bExist; 41 }
5、指定目录的文件和文件夹遍历
1 void getFiles(TCHAR *Root, 2 vector<CString>& vtFolderList, 3 vector<CString>& vtFileList) 4 { 5 if (_tcslen(Root) < 1) return; 6 7 CString dir(Root); 8 dir += "\\"; 9 10 TCHAR pLogFileDirectory[1024] = { 0 }; 11 _tcscpy(pLogFileDirectory, dir); 12 _tcscat(pLogFileDirectory, _T("*")); 13 14 size_t iLen = _tcslen(pLogFileDirectory); 15 pLogFileDirectory[iLen] = 0; 16 pLogFileDirectory[iLen+1] = 0; 17 18 WIN32_FIND_DATA findFileData; 19 HANDLE hFind = FindFirstFile(pLogFileDirectory, &findFileData); 20 if (INVALID_HANDLE_VALUE == hFind) 21 { 22 int iErrno = GetLastError(); 23 return; 24 } 25 26 BOOL bRet = FALSE; 27 28 do 29 { 30 if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 31 { 32 if (!_tcscmp(findFileData.cFileName, _T(".")) || !_tcscmp(findFileData.cFileName, _T(".."))) 33 { 34 } 35 else 36 { 37 CString subdir = dir + CString(findFileData.cFileName); 38 vtFolderList.push_back(subdir); 39 getFiles(subdir.GetBuffer(), vtFolderList, vtFileList); 40 41 } 42 } 43 else 44 { 45 46 CString file = dir + CString(findFileData.cFileName); 47 CString tmpfilepath(file); 48 49 vtFileList.push_back(file); 50 } 51 52 bRet = FindNextFile(hFind, &findFileData); 53 54 if (!bRet) 55 break; 56 57 58 }while(bRet); 59 60 FindClose(hFind); 61 }
6、防僵死的消息处理或者防僵死等待函数
1 //也常用名void DoEvents(DWORD millisecs) 2 void AsyncSleep(DWORD millisecs) 3 { 4 DWORD start = ::GetTickCount(); 5 MSG msg; 6 7 while (true) 8 { 9 if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 10 { 11 ::TranslateMessage(&msg); 12 ::DispatchMessage(&msg); 13 } 14 ::Sleep(15); 15 if (::GetTickCount() - start >=millisecs) 16 break; 17 } 18 }
7、全目录移动至另外一个目录
1 static bool Comp(const CString &a, const CString &b) 2 { 3 return a.GetLength() < b.GetLength(); 4 } 5 6 static bool Comp2(const CString &a, const CString &b) 7 { 8 return a.GetLength() > b.GetLength(); 9 } 10 11 12 extern void AsyncSleep(DWORD millisecs); 13 14 15 bool MoveFolderEx(CString strSource,CString strDes) 16 { 17 vector<CString> vtSrcFolderList; 18 vector<CString> vtSrcFileList; 19 vector<CString> vtSrcShortFoders; 20 21 getFiles(strSource.GetBuffer(),vtSrcFolderList,vtSrcFileList); 22 23 if (vtSrcFileList.size() < 1) return true; 24 int srcRootlen = strSource.GetLength(); 25 for (DWORD i = 0; i < vtSrcFolderList.size(); i++) 26 { 27 CString fullpath = vtSrcFolderList[i]; 28 int idx = fullpath.Find(strSource); 29 CString shortpath = fullpath.Mid(idx + srcRootlen); 30 vtSrcShortFoders.push_back(shortpath); 31 } 32 33 std::sort(vtSrcShortFoders.begin(), vtSrcShortFoders.end(), Comp); 34 35 ::CreateDirectory(strDes, NULL); 36 for (DWORD i = 0; i < vtSrcShortFoders.size(); i++) 37 { 38 CString foldertext = vtSrcShortFoders[i]; 39 CString subfolder = strDes + foldertext; 40 ::CreateDirectory(subfolder, NULL); 41 } 42 43 44 BOOL bCopied = true; 45 for (DWORD i = 0; i < vtSrcFileList.size(); i++) 46 { 47 CString srcfile = vtSrcFileList[i]; 48 int idx = srcfile.Find(strSource); 49 CString filetitle = srcfile.Mid(idx+srcRootlen); 50 CString desttitle = strDes + filetitle; 51 bCopied &= CopyFile(srcfile, desttitle, false); 52 //每个复制成功才算全部复制成功,假如失败则重新复制一下,最多复制3次 53 int copyCnt = 0; 54 while (!bCopied && copyCnt++ < 3) 55 { 56 AsyncSleep(100); 57 bCopied = CopyFile(srcfile, desttitle, false); 58 } 59 bCopied = true; //设置为true避免后面所有拷贝成功的文件也被拷贝3次 60 } 61 62 BOOL bDeleted = true; 63 //删除掉已经拷贝完成的文件 64 for (DWORD i = 0; i < vtSrcFileList.size(); i++) 65 { 66 CString srcfile = vtSrcFileList[i]; 67 bDeleted &= DeleteFile(srcfile); //只有所有全true才表示全部删除成功 68 69 //删除失败的重试3次 70 int DeleteCnt = 0; 71 while (!bDeleted && DeleteCnt++ < 3) 72 { 73 AsyncSleep(100); 74 bDeleted = DeleteFile(srcfile); 75 } 76 bDeleted = true; 77 } 78 79 if (bDeleted)AsyncSleep(100); 80 81 //排序:删除要让目录名最长的最先删除 82 std::sort(vtSrcShortFoders.begin(), vtSrcShortFoders.end(), Comp2); 83 84 //删除掉已经拷贝完成的文件、文件夹 85 for (DWORD i = 0; i < vtSrcShortFoders.size(); i++) 86 { 87 CString foldertext = vtSrcShortFoders[i]; 88 CString subfolder = strSource + foldertext; 89 ::RemoveDirectoryA(subfolder); 90 } 91 return true; 92 }
8、全目录删除包括子目录和下面的全部文件
1 bool DeleteFolderEx(CString strSource) 2 { 3 vector<CString> vtSrcFolderList; 4 vector<CString> vtSrcFileList; 5 vector<CString> vtSrcShortFoders; 6 7 getFiles(strSource.GetBuffer(),vtSrcFolderList,vtSrcFileList); 8 9 if (vtSrcFileList.size() < 1) return true; 10 int srcRootlen = strSource.GetLength(); 11 for (DWORD i = 0; i < vtSrcFolderList.size(); i++) 12 { 13 CString fullpath = vtSrcFolderList[i]; 14 int idx = fullpath.Find(strSource); 15 CString shortpath = fullpath.Mid(idx + srcRootlen); 16 vtSrcShortFoders.push_back(shortpath); 17 } 18 19 std::sort(vtSrcShortFoders.begin(), vtSrcShortFoders.end(), Comp); 20 21 BOOL bDeleted = true; 22 23 for (DWORD i = 0; i < vtSrcFileList.size(); i++) 24 { 25 CString srcfile = vtSrcFileList[i]; 26 bDeleted &= DeleteFile(srcfile); //只有所有全true才表示全部删除成功 27 28 //删除失败的重试3次 29 int DeleteCnt = 0; 30 while (!bDeleted && DeleteCnt++ < 3) 31 { 32 AsyncSleep(100); 33 bDeleted = DeleteFile(srcfile); 34 } 35 bDeleted = true; 36 } 37 38 if (bDeleted)AsyncSleep(100); 39 40 41 std::sort(vtSrcShortFoders.begin(), vtSrcShortFoders.end(), Comp2); 42 43 44 for (DWORD i = 0; i < vtSrcShortFoders.size(); i++) 45 { 46 CString foldertext = vtSrcShortFoders[i]; 47 CString subfolder = strSource + foldertext; 48 ::RemoveDirectoryA(subfolder); 49 } 50 return true; 51 }
原文:https://www.cnblogs.com/peixuewen/p/12670049.html