使用SetPriorityClass让进程退出之后删除自己
2015-01-12 10:19
232 查看
VOID DeleteMyself() { TCHAR tchCmd[MAX_PATH] = {0}; TCHAR tchProcPath[MAX_PATH] = {0}; STARTUPINFO StartupInfo = {0}; PROCESS_INFORMATION ProcInfo = {0}; __try { if (!GetEnvironmentVariable(_T("COMSPEC"), tchCmd, MAX_PATH)) { printf("[DeleteMyself] : GetEnvironmentVariable failed. (%d) \n", GetLastError()); __leave; } if (!GetModuleFileName(NULL, tchProcPath, MAX_PATH)) { printf("[DeleteMyself] : GetModuleFileName failed. (%d) \n", GetLastError()); __leave; } _tcscat_s(tchCmd, MAX_PATH, _T(" /c del \"")); _tcscat_s(tchCmd, MAX_PATH, tchProcPath); _tcscat_s(tchCmd, MAX_PATH, _T("\"")); // 设置本程序进程的执行级别为实时执行,这本程序马上获取CPU执行权,快速退出。 if (!SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)) { printf("[DeleteMyself] : SetPriorityClass failed. (%d) \n", GetLastError()); __leave; } // if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL)) // { // printf("[DeleteMyself] : SetThreadPriority failed. (%d) \n", GetLastError()); // __leave; // } StartupInfo.cb = sizeof(STARTUPINFO); StartupInfo.dwFlags = STARTF_USESHOWWINDOW; StartupInfo.wShowWindow = SW_HIDE; if (!CreateProcess(NULL, tchCmd, NULL, NULL, FALSE, CREATE_SUSPENDED | CREATE_NO_WINDOW | DETACHED_PROCESS, NULL, NULL, &StartupInfo, &ProcInfo)) { printf("[DeleteMyself] : CreateProcess failed. (%d) \n", GetLastError()); __leave; } // 设置命令行进程的执行级别为空闲执行,这使本程序有足够的时间从内存中退出。 if (!SetPriorityClass(ProcInfo.hProcess, IDLE_PRIORITY_CLASS)) { printf("[DeleteMyself] : SetPriorityClass failed. (%d) \n", GetLastError()); __leave; } // if (!SetThreadPriority(ProcInfo.hThread, THREAD_PRIORITY_IDLE)) // { // printf("[DeleteMyself] : SetThreadPriority failed. (%d) \n", GetLastError()); // __leave; // } if (ResumeThread(ProcInfo.hThread) == -1) { printf("[DeleteMyself] : ResumeThread failed. (%d) \n", GetLastError()); __leave; } } __finally { if (ProcInfo.hProcess) CloseHandle(ProcInfo.hProcess); if (ProcInfo.hThread) CloseHandle(ProcInfo.hThread); } ExitProcess(ERROR_SUCCESS); return ; }
相关文章推荐
- 使用SHChangeNotify让进程立即删除自己
- 在Minifilter中使用PsSetCreateProcessNotifyRoutine之后监控到的一些进程信息
- 深入解析父子线程(父子线程相互独立,子线程使用自己的栈空间,进程要等到所有线程终止运行之后才终止运行)
- 使用 Perl 检测 系统进程,实现进程意外退出重启
- 使用BlazeDS实现java与flex传对象时,RemoteClass中包含自己写的类,后台无法转换的问题
- 如何让进程退出前删除自身EXE
- Excel对象使用后进程不能退出的完美解决办法
- LINUX man XX之后 ,使用q键退出.
- Set改写成Map使用,自己写的一个Map
- 使用InternetSetCookie删除cookie
- 为什么nohup在终端退出之后进程会退出
- WPF BitmapImage 图片资源无法删除,文件正在被另一个进程使用
- 进程退出前删除自身EXE
- 对文件操作(复制/移动/删除)时 报“文件正由另一进程使用,因此该进程无法访问此文件”的解决办法
- 线程优先级SetThreadPriority的使用
- MonitorServer代码阅读笔记(一):使用sigaction( SIGPIPE, &sa, 0)避免写一个已关闭的socket导致进程退出
- 进程退出前删除自身EXE
- 关闭SQL SERVER用户进程,防止因为用户正在使用数据库,导致数据库恢复或删除失败
- 使用prctl API, 在父进程退出后,让子进程也退出
- 使用BlazeDS实现java与flex传对象时,RemoteClass中包含自己写的类,后台无法转换的问题