unit installUnit1; interface uses SysUtils, Classes, winsvc, Windows; // 服务名称 var ServiceName: string = 'sefdwan'; function InstallService(): boolean; stdcall; function UninstallService(): boolean; stdcall; function StartServices(): Boolean; stdcall; implementation function GetDllPath: string; var ModuleName: string; begin SetLength(ModuleName, 255); //取得Dll自身路径 GetModuleFileName(HInstance, PChar(ModuleName), Length(ModuleName)); Result := PChar(ModuleName); end; function CreateRegeditStringValue(hRoot: HKEY; szSubKey: string; kType: DWORD; ValueName: string; Data: string): boolean; var hKeys: HKEY; lRet: Integer; Disposition: Integer; begin result := false; //打开注册表键,不存在则创建它 //long lRet=RegCreateKeyExW(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_WOW64_64KEY,NULL,&hKey,NULL); lRet := RegCreateKeyExW(hRoot, pchar(szSubKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hKeys, @Disposition); if (lRet <> ERROR_SUCCESS) then exit; //修改注册表键值,没有则创建它 lRet := RegSetValueExW(hKeys, pchar(ValueName), 0, kType, PBYTE(Data), sizeof(char) * (length(Data) + 1)); if (lRet <> ERROR_SUCCESS) then exit; RegCloseKey(hKeys); result := true; end; function CreateRegeditDwordValue(hRoot: HKEY; szSubKey: string; ValueName: string; Data: DWORD): boolean; var hKeys: HKEY; lRet: Integer; dwSize: DWORD; Disposition: Integer; begin result := false; //打开注册表键,不存在则创建它 //long lRet=RegCreateKeyExW(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_WOW64_64KEY,NULL,&hKey,NULL); lRet := RegCreateKeyExW(hRoot, pchar(szSubKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hKeys, @Disposition); // RegCreateKeyEx(hRoot, PChar(RegStr+'\ShellFolder'), 0, nil,REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, TempKey, @Disposition); if (lRet <> ERROR_SUCCESS) then exit; dwSize := sizeof(DWORD); //修改注册表键值,没有则创建它 lRet := RegSetValueExW(hKeys, pchar(ValueName), 0, REG_DWORD, @Data, dwSize); // RegSetValueEx(TempKey, PChar('Attributes'), 0, REG_DWORD, @Buffer,BufSize) if (lRet <> ERROR_SUCCESS) then exit; RegCloseKey(hKeys); result := true; end; { function WaitForService(ServiceHandle: Longword; AStatus: Longword): Boolean; var PendingStatus: Longword; ServiceStatus: _SERVICE_STATUS; Error: Integer; begin Result := False; case AStatus of SERVICE_RUNNING: PendingStatus := SERVICE_START_PENDING; SERVICE_STOPPED: PendingStatus := SERVICE_STOP_PENDING; end; repeat if not ControlService(ServiceHandle, SERVICE_CONTROL_INTERROGATE, ServiceStatus) then begin end; if ServiceStatus.dwWin32ExitCode <> 0 then Break; Result := ServiceStatus.dwCurrentState = AStatus; if not Result and (ServiceStatus.dwCurrentState = PendingStatus) then Sleep(ServiceStatus.dwWaitHint) else Break; until Result; end; //启动服务 function StartServices(const SvrName: string): Boolean; var a, b: SC_HANDLE; c: PChar; begin try Result := False; a := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); // test('StartServices:OpenSCManager' + SysErrorMessage(GetLastError())); if a <= 0 then Exit; b := OpenService(a, PChar(SvrName), SERVICE_ALL_ACCESS); WaitForService(b, SERVICE_RUNNING); // test('StartServices:OpenService' + SysErrorMessage(GetLastError())); if b <= 0 then Exit; try Result := StartService(b, 0, c); // test('StartServices:StartService' + SysErrorMessage(GetLastError())); finally CloseServiceHandle(b); CloseServiceHandle(a); end; except end; end; } //开启服务 function StartServices(): Boolean; var a, b: SC_HANDLE; c: PChar; SvrName, dllname: string; begin Result := False; dllname := GetDllPath(); SvrName := ExtractFileName(dllname); SvrName := ChangeFileExt(SvrName, ''); ServiceName := SvrName; OutputDebugStr('[InstallService] Service Start.....' + dllname + '----' + SvrName); a := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if a <= 0 then Exit; b := OpenService(a, PChar(SvrName), SERVICE_ALL_ACCESS); if b <= 0 then Exit; try Result := StartService(b, 0, c); CloseServiceHandle(b); CloseServiceHandle(a); OutputDebugStr('[InstallService] Service Start OK'); except CloseServiceHandle(b); CloseServiceHandle(a); Exit; end; end; //********** // Method: 服务安装接口 // Author: Janus // DateTime: [7/1/2016] //********** function InstallService(): boolean; var hscm: SC_HANDLE; szErr, szBin, szRePath: string; schService: SC_HANDLE; szFilePath: array[0..MAX_PATH] of char; hDll: HMODULE; cname, dllname: string; begin // TRACE(_T("[InstallService] Service is Begin....\r\n")); // if assigned(F) then // Fse:=F; dllname := GetDllPath(); cname := ExtractFileName(dllname); cname := ChangeFileExt(cname, ''); ServiceName := cname; OutputDebugStr('[InstallService] Service is Begin.....' + dllname + '----' + cname); result := false; hscm := OpenSCManagerW(nil, nil, SC_MANAGER_ALL_ACCESS); // WCHAR szErr[MAX_PATH] = {0}; szErr := ''; if hscm = 0 then // NULL) begin // wsprintf(szErr, _T("[InstallService] OpenSCManagerW Error:[%d]...\r\n"), GetLastError()); // TRACE(szErr); OutputDebugStr('[InstallService] OpenSCManagerW Error: ...' + SysErrorMessage(GetLastError())); exit; end else begin OutputDebugStr('[InstallService] OpenSCManagerW Successful......'); // TRACE(_T("[InstallService] OpenSCManagerW Successful...\r\n")); end; // WCHAR szBin[MAX_PATH] = {0}; // wcsncpy_s(szBin, _T("%SystemRoot%\\SysWOW64\\svchost.exe -k "), sizeof(szBin)); // 32位 //wcsncpy_s(szBin, _T("%SystemRoot%\\System32\\svchost.exe -k "), sizeof(szBin)); // 64位 //wcsncat_s(szBin, name, wcslen(name)); // szBin := '%SystemRoot%\SysWOW64\svchost.exe -k '; szBin := '%SystemRoot%\System32\svchost.exe -k '; szBin := szBin + cname; schService := CreateServiceW( hscm, // SCManager database pchar(cname), // name of service pchar(cname), // service name to display SERVICE_ALL_ACCESS, // desired access // SERVICE_WIN32_SHARE_PROCESS or SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS, // service type SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS, // service type SERVICE_AUTO_START, // start type SERVICE_ERROR_NORMAL, // error control type pchar(szBin), // service's binary nil, // no load ordering group nil, // no tag identifier nil, // no dependencies nil, // LocalSystem account nil); // no password if (schService = 0) then begin // wsprintf(szErr, _T("[InstallService] CreateService(%s) Error:[%d]...\r\n"), name, GetLastError()); // TRACE(szErr); OutputDebugStr('[InstallService] CreateService(%s) Error: ...' + SysErrorMessage(GetLastError())); exit; end else begin // wsprintf(szErr, _T("[InstallService] CreateService(%s) Successful...\r\n"), name); // TRACE(szErr); OutputDebugStr('[InstallService] CreateService...' + cname); end; CloseServiceHandle(schService); CloseServiceHandle(hscm); //服务名对应SYSTEM\\CurrentControlSet\\Services\\下面的 CreateRegeditStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost', REG_MULTI_SZ, cname, cname); // WCHAR szRePath[MAX_PATH] = {0}; // wsprintf(szRePath, _T("SYSTEM\\CurrentControlSet\\Services\\%s"), name); szRePath := 'SYSTEM\CurrentControlSet\Services\' + cname; CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_EXPAND_SZ, 'ImagePath', szBin); CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_SZ, 'DisplayName', cname); CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_SZ, 'Description', 'This is the service of fz'); //描述 CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_SZ, 'ObjectName', 'LocalSystem'); CreateRegeditDwordValue(HKEY_LOCAL_MACHINE, szRePath, 'ErrorControl', 1); CreateRegeditDwordValue(HKEY_LOCAL_MACHINE, szRePath, 'Start', 2); // 添加 Parameters svchost启动的服务动态库 // WCHAR szFilePath[MAX_PATH] = {0}; // hDll := GetModuleHandle(nil); //取调用DLL的EXE路径 // GetModuleFileName(HInstance, szFilePath, sizeof(szFilePath); //取调用DLL的EXE路径 if (GetModuleFileName(HInstance, szFilePath, sizeof(szFilePath)) = 0) then ////取得Dll自身路径 begin // wsprintf(szErr, _T("[InstallService] GetModuleFileName Error:[%d]...\r\n"), GetLastError()); // TRACE(szErr); // return false; OutputDebugStr('[InstallService] GetModuleFileName Error: ...' + SysErrorMessage(GetLastError())); exit; end else begin // TRACE(_T("[InstallService] GetModuleFileName Successful...\r\n")); OutputDebugStr('[InstallService] GetModuleFileName Successful..'); end; // changefileext(szFilePath,'.DLL'); // wsprintf(szRePath, _T("SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters"), name); szRePath := 'SYSTEM\CurrentControlSet\Services\' + cname + '\Parameters'; CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_EXPAND_SZ, 'ServiceDll', dllname); // szFilePath); // TRACE(_T("[InstallService] Service Install Sucessfull....\r\n")); OutputDebugStr('[InstallService] Service Install Sucessfull...'); CloseServiceHandle(schService); CloseServiceHandle(hscm); // StartServices(); result := true; end; //********** // Method: 服务卸载接口 // Author: Janus // DateTime: [7/1/2016] //********** function UninstallService(): boolean; var hSCM, hService: SC_HANDLE; ss: string; ServiceStatus: SERVICE_STATUS; buff: string; HKEYs: hKey; lRet: Integer; cname, dllname: string; begin try // if assigned(F) then // Fse:=F; //WCHAR szErr[MAX_PATH]; //卸载服务 dllname := GetDllPath(); cname := ExtractFileName(dllname); cname := ChangeFileExt(cname, ''); ServiceName := cname; OutputDebugStr('[InstallService] Service is Begin.....' + dllname + '----' + cname); hSCM := OpenSCManagerW(nil, nil, SC_MANAGER_ALL_ACCESS); if (hSCM = 0) then begin // wsprintf(szErr, _T("[UninstallService] OpenSCManagerW Error:[%d]...\r\n"), GetLastError()); //TRACE(szErr); //return false; OutputDebugStr('[UninstallService] OpenSCManagerW Error: ...' + SysErrorMessage(GetLastError())); exit; end else begin // TRACE(_T("[UninstallService] OpenSCManagerW Sucessfull...\r\n")); OutputDebugStr('[UninstallService] OpenSCManagerW Sucessfull...'); end; hService := OpenServiceW(hSCM, pchar(cname), SERVICE_ALL_ACCESS); // SERVICE_STOP);// or DELETE); if (hService = 0) then begin CloseServiceHandle(hSCM); // wsprintf(szErr, _T("[UninstallService] OpenServiceW Error:[%d]...\r\n"), GetLastError()); // TRACE(szErr); OutputDebugStr('[UninstallService] OpenServiceW Error:...' + SysErrorMessage(GetLastError())); end else begin //TRACE(_T("[UninstallService] OpenServiceW Sucessfull...\r\n")); OutputDebugStr('[UninstallService] OpenServiceW Sucessfull...'); end; //停止服务 ControlService(hService, SERVICE_CONTROL_STOP, ServiceStatus); DeleteService(hService); //释放服务 CloseServiceHandle(hSCM); CloseServiceHandle(hService); //清除注册表配置项 // HKEY hKey; //long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost"), 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hKey); // 不重新指向32位注册表,即还在64位注 lRet := RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost', 0, KEY_ALL_ACCESS, HKEYs); // 会重新指向32位的节点下 if (lRet = ERROR_SUCCESS) then begin //TRACE("[UninstallService] RegOpenKeyEx Successful...\r\n"); OutputDebugStr('[UninstallService] RegOpenKeyEx Successful...'); lRet := RegDeleteValue(HKEYs, PChar(cname)); RegCloseKey(HKEYs); end; // WCHAR buff[MAX_PATH]; // wcsncpy_s(buff, _T("SYSTEM\\CurrentControlSet\\Services\\"), sizeof buff); // wcsncat_s(buff, name, 100); buff := 'SYSTEM\CurrentControlSet\Services\' + cname; RegDeleteKey(HKEY_LOCAL_MACHINE, pchar(buff)); // TRACE("[UninstallService] UnInstall SvcHostDllSrv Successful...\r\n"); OutputDebugStr('[UninstallService] UnInstall SvcHostDllSrv Successful.....'); result := true; except OutputDebugStr('[UninstallService] UnInstall Error.....'); end; end; end. ---------------------------------------------- 永远是DELPHI初学者。 |
|
来自: 和谐世界 > 《Windows 服务》