SysUtils.cpp
上传用户:fengliqin8
上传日期:2007-04-13
资源大小:28k
文件大小:7k
源码类别:

进程与线程

开发平台:

Visual C++

  1. //
  2. // 系统扩展
  3. // 最后更新: 2003.08.18
  4. // 历史:
  5. // 1. create by alone on 2003.08.18
  6. // 2. modified by alone on 2004.06.14: 添加关闭Windows函数
  7. //
  8. #include "stdafx.h"
  9. #include "SysUtils.h"
  10. #pragma comment(lib, "shlwapi.lib")
  11. // 判断文件是否存在
  12. BOOL IsFileExists(char *pszPathName)
  13. {
  14. WIN32_FIND_DATA FindFileData;
  15. HANDLE hFind;
  16. hFind = FindFirstFile(pszPathName, &FindFileData);
  17. if(hFind == INVALID_HANDLE_VALUE)
  18. return FALSE;
  19. else
  20. {
  21. FindClose(hFind);
  22. return TRUE;
  23. }
  24. }
  25. // 提取文件路径
  26. char *ExtractFilePath(char *pszSrc, char *pszDst)
  27. {
  28. int i;
  29. ASSERT(pszSrc != NULL);
  30. ASSERT(pszDst != NULL);
  31. int nLen = strlen(pszSrc);
  32. ASSERT(nLen < MAX_PATH);
  33. for(i = nLen - 1; i >= 0; i-- )
  34. {
  35. if(pszSrc[i] == ':' || pszSrc[i] == '\')
  36. {
  37. break;
  38. }
  39. }
  40. if(i == -1)
  41. {
  42. pszDst[0] = 0;
  43. }
  44. else
  45. {
  46. strncpy(pszDst, pszSrc, i + 1);
  47. pszDst[i + 1] = 0; // zero terminated;
  48. }
  49. return pszDst;
  50. }
  51. // 创建多层目录
  52. BOOL ForceDirectories(char *pszDir)
  53. {
  54. // 验证字符串的合法性
  55. ASSERT(pszDir != NULL);
  56. int nLen = strlen(pszDir);
  57. if(nLen == 0 || nLen >= MAX_PATH) return FALSE;
  58. char pszCurDir[MAX_PATH]; // 当前需要创建的目录
  59. char pszUpDir[MAX_PATH]; // 更上一层的目录
  60. // 去尾
  61. strcpy(pszCurDir, pszDir);
  62. if(pszCurDir[nLen - 1] == '\')
  63. {
  64. pszCurDir[nLen -1 ] = 0;
  65. nLen-- ;
  66. }
  67.   
  68. if (nLen < 3 || PathFileExists(pszCurDir) || strcmp(ExtractFilePath(pszCurDir, pszUpDir), pszCurDir) == 0)
  69. {
  70. return TRUE;
  71. }
  72.   return  ForceDirectories(pszUpDir) && CreateDirectory(pszCurDir, NULL);
  73. }
  74. // 重新启动Windows 9x
  75. BOOL RebootWin9x()
  76. {
  77. ExitWindowsEx(EWX_REBOOT, 0);
  78. return TRUE;
  79. }
  80. // 重新启动Windows NT/2000/XP
  81. BOOL RebootWinNT()
  82. {
  83. HANDLE hToken = 0, hThread = 0;
  84. DWORD dwRtn = 0;
  85. hThread =(HANDLE)AfxGetApp()->m_hThread;
  86. TOKEN_PRIVILEGES tp;
  87. LUID luid;
  88. tp.PrivilegeCount = 1;
  89. if (!::OpenProcessToken(GetCurrentProcess(),
  90. TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  91. {
  92. // MessageBox("Current proccess can't apply for the reboot priviledge!");
  93. return FALSE;
  94. }
  95. else
  96. {
  97. if (!LookupPrivilegeValue(NULL, // lookup privilege on local system
  98. SE_SHUTDOWN_NAME, // privilege to lookup 
  99. &luid))
  100. {
  101. // MessageBox("Current proccess can't apply for the reboot priviledge!");
  102. CloseHandle(hToken);
  103. return FALSE;
  104. }
  105. else
  106. {
  107. // receives LUID of privilege
  108. tp.PrivilegeCount = 1;
  109. tp.Privileges[0].Luid = luid;
  110. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  111. // Enable the privilege or disable all privileges.
  112. AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tp, &dwRtn);
  113. if (GetLastError() == ERROR_SUCCESS)
  114. {
  115. ExitWindowsEx(EWX_REBOOT, 0);
  116. CloseHandle(hToken);
  117. return TRUE;
  118. }
  119. else
  120. {
  121. // MessageBox("Current proccess can't apply for the reboot priviledge!");
  122. CloseHandle(hToken);
  123. return FALSE;
  124. }
  125. }
  126. }
  127. }
  128. // 重新启动操作系统
  129. BOOL RebootWindows()
  130. {
  131. // 获取操作系统版本
  132. DWORD dwVersion = GetVersion();
  133. if (dwVersion < 0x80000000) // Windows NT/2000/XP
  134. {
  135. return RebootWinNT();
  136. }
  137. else // Windows 98
  138. {
  139. return RebootWin9x();
  140. }
  141. }
  142. // 设置程序是否在操作系统启动后自动运行
  143. void SetAutoRun(BOOL bEnable)
  144. {
  145. HKEY hKey;
  146. // 打开键
  147. if(RegOpenKey(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run", &hKey) !=ERROR_SUCCESS)
  148. return;
  149. if(bEnable) //启动时运行,设置键值
  150. {
  151. char szModule[MAX_PATH];
  152. GetModuleFileName(NULL, szModule, MAX_PATH);
  153. RegSetValueEx(hKey, _T("VLPRModule"), 0, REG_SZ, (CONST BYTE *)szModule, strlen(szModule));
  154. }
  155. else //删除键值
  156. {
  157. RegDeleteValue(hKey, _T("VLPRModule"));
  158. }
  159. RegCloseKey(hKey);
  160. }
  161. // 关闭Windows98
  162. BOOL ShutDownWin98()
  163. {
  164. ExitWindowsEx(EWX_SHUTDOWN, 0);
  165. return TRUE;
  166. }
  167. // 关闭Windows NT/2000/XP
  168. BOOL ShutDownWinNT()
  169. {
  170. HANDLE hToken = 0, hThread = 0;
  171. DWORD dwRtn = 0;
  172. hThread =(HANDLE)AfxGetApp()->m_hThread;
  173. TOKEN_PRIVILEGES tp;
  174. LUID luid;
  175. tp.PrivilegeCount = 1;
  176. if (!::OpenProcessToken(GetCurrentProcess(),
  177. TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  178. {
  179. // MessageBox("Current proccess can't apply for the reboot priviledge!");
  180. return FALSE;
  181. }
  182. else
  183. {
  184. if (!LookupPrivilegeValue(NULL, // lookup privilege on local system
  185. SE_SHUTDOWN_NAME, // privilege to lookup 
  186. &luid))
  187. {
  188. // MessageBox("Current proccess can't apply for the reboot priviledge!");
  189. CloseHandle(hToken);
  190. return FALSE;
  191. }
  192. else
  193. {
  194. // receives LUID of privilege
  195. tp.PrivilegeCount = 1;
  196. tp.Privileges[0].Luid = luid;
  197. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  198. // Enable the privilege or disable all privileges.
  199. AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tp, &dwRtn);
  200. if (GetLastError() == ERROR_SUCCESS)
  201. {
  202. ExitWindowsEx(EWX_SHUTDOWN, 0);
  203. CloseHandle(hToken);
  204. return TRUE;
  205. }
  206. else
  207. {
  208. // MessageBox("Current proccess can't apply for the reboot priviledge!");
  209. CloseHandle(hToken);
  210. return FALSE;
  211. }
  212. }
  213. }
  214. }
  215. // 删除文件
  216. BOOL DeleteFileEx(char *szPathName, BOOL bAllowUndo)
  217. {
  218. SHFILEOPSTRUCT fo;
  219. char chPathName[MAX_PATH + 1];
  220. memset(chPathName, 0, MAX_PATH + 1);
  221. strcpy(chPathName, szPathName);
  222. memset(&fo, 0, sizeof(SHFILEOPSTRUCT));
  223. fo.wFunc = FO_DELETE;
  224. fo.pFrom = chPathName;
  225. if(bAllowUndo)
  226. fo.fFlags = FOF_ALLOWUNDO;
  227. fo.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
  228. fo.fAnyOperationsAborted = FALSE;
  229. return (SHFileOperation(&fo) == 0);
  230. }
  231. BOOL RenameFileEx(char *szOldPathName, char *szNewPathName)
  232. {
  233. SHFILEOPSTRUCT fo;
  234. char chOldPathName[MAX_PATH + 1];
  235. char chNewPathName[MAX_PATH + 1];
  236. memset(chOldPathName, 0, MAX_PATH + 1);
  237. strcpy(chOldPathName, szOldPathName);
  238. memset(chNewPathName, 0, MAX_PATH + 1);
  239. strcpy(chNewPathName, szNewPathName);
  240. memset(&fo, 0, sizeof(SHFILEOPSTRUCT));
  241. fo.wFunc = FO_RENAME;
  242. fo.pFrom = chOldPathName;
  243. fo.pTo = chNewPathName;
  244. fo.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
  245. fo.fAnyOperationsAborted = FALSE;
  246. return (SHFileOperation(&fo) == 0);
  247. }
  248. BOOL MoveFileEx(char *szSrcPathName, char *szDstPathName)
  249. {
  250. SHFILEOPSTRUCT fo;
  251. char chSrcPathName[MAX_PATH + 1];
  252. char chDstPathName[MAX_PATH + 1];
  253. memset(chSrcPathName, 0, MAX_PATH + 1);
  254. strcpy(chSrcPathName, szSrcPathName);
  255. memset(chDstPathName, 0, MAX_PATH + 1);
  256. strcpy(chDstPathName, szDstPathName);
  257. memset(&fo, 0, sizeof(SHFILEOPSTRUCT));
  258. fo.wFunc = FO_MOVE;
  259. fo.pFrom = chSrcPathName;
  260. fo.pTo = chDstPathName;
  261. fo.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
  262. fo.fAnyOperationsAborted = FALSE;
  263. return (SHFileOperation(&fo) == 0);
  264. }
  265. BOOL CopyFileEx(char *szSrcPathName, char *szDstPathName)
  266. {
  267. SHFILEOPSTRUCT fo;
  268. char chSrcPathName[MAX_PATH + 1];
  269. char chDstPathName[MAX_PATH + 1];
  270. memset(chSrcPathName, 0, MAX_PATH + 1);
  271. strcpy(chSrcPathName, szSrcPathName);
  272. memset(chDstPathName, 0, MAX_PATH + 1);
  273. strcpy(chDstPathName, szDstPathName);
  274. memset(&fo, 0, sizeof(SHFILEOPSTRUCT));
  275. fo.wFunc = FO_COPY;
  276. fo.pFrom = chSrcPathName;
  277. fo.pTo = chDstPathName;
  278. fo.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
  279. fo.fAnyOperationsAborted = FALSE;
  280. return (SHFileOperation(&fo) == 0);
  281. }
  282. // 判断字符串是否是合法的文件名
  283. // 文件名不能包含的字符有9个字符/:*?"<>|
  284. BOOL IsLegalFileName(char *szFileName)
  285. {
  286. return (strpbrk(szFileName, "\/:*?"<>|") == NULL);
  287. }