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初学者。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。