用Delphi编写一个Svchost.exe调用的DLL模块
2010-02-27 10:28
288 查看
这个模块的代码在网上流传的是用C写的,这里用Delphi写了一个DLL,可以自己扩充各种功能.
[code]
{
文件名: ServiceDll.dpr
概述: 替换由svchost.exe启动的某个系统服务,具体服务由全局变量 ServiceName 决定.
经测试,生成的DLL文件运行完全正常.
测试环境: Windows 2003 Server + Delphi 7.0
代码只实现了一个框架,没有任何实际动作,仅作为学习用.
}
[code]
{
文件名: ServiceDll.dpr
概述: 替换由svchost.exe启动的某个系统服务,具体服务由全局变量 ServiceName 决定.
经测试,生成的DLL文件运行完全正常.
测试环境: Windows 2003 Server + Delphi 7.0
代码只实现了一个框架,没有任何实际动作,仅作为学习用.
}
library ServiceDll; uses SysUtils, Classes, winsvc, System, Windows; { 定义全局变量 } var // 服务控制信息句柄 SvcStatsHandle : SERVICE_STATUS_HANDLE; // 存储服务状态 dwCurrState : DWORD; // 服务名称 ServiceName : PChar = 'BITS'; { 调试函数,用于输出调试文本 } procedure OutPutText(CH:PChar); var FileHandle: TextFile; F : Integer; Begin try if not FileExists('zztestdll.txt') then F := FileCreate('zztestdll.txt'); finally if F > 0 Then FileClose(F); end; AssignFile(FileHandle,'zztestdll.txt'); Append(FileHandle); Writeln(FileHandle,CH); Flush(FileHandle); CloseFile(FileHandle); END; { dll入口和出口处理函数 } procedure DLLEntryPoint(dwReason : DWord); begin case dwReason of DLL_PROCESS_ATTACH: ; DLL_PROCESS_DETACH: ; DLL_THREAD_ATTACH: ; DLL_THREAD_DETACH: ; end; end; { 与SCM管理器通话 } function TellSCM(dwState : DWORD ; dwExitCode : DWORD; dwProgress : DWORD ): LongBool; 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 := 3000; 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 { try begin if ParamStr(1) <> '' then svcname := strNew(PChar(ParamStr(1))) else begin svcname := strAlloc(10 * Sizeof(Char)); svcname := 'none'; end; OutPutText(svcname); end finally strdispose(svcname); end; } // 注册控制函数 SvcStatsHandle := RegisterServiceCtrlHandler(ServiceName, @servicehandler); IF (SvcStatsHandle = 0) THEN BEGIN OutPutText('Error in RegisterServiceCtrlHandler'); exit; END else begin FreeConsole(); end; // 启动服务 TellSCM( SERVICE_START_PENDING, 0, 1 ); TellSCM( SERVICE_RUNNING, 0, 0 ); OutPutText('Service is Running'); // 这里可以执行我们真正要作的代码 while ((dwCurrState <> SERVICE_STOP_PENDING) and (dwCurrState <> SERVICE_STOPPED)) do begin sleep(1000); end; OutPutText('Service Exit'); end; // 导出函数列表 exports ServiceMain; { dll入口点 } begin DllProc := @DLLEntryPoint; end.
相关文章推荐
- 用Delphi编写一个Svchost.exe调用的DLL模块
- 用Delphi编写一个Svchost.exe调用的DLL模块
- 用Delphi编写一个Svchost.exe调用的DLL模块
- VS2013编写一个DLL,并创建EXE对DLL进行调用
- 在Delphi中调用C语言编写的DLL
- java 调用 delphi编写的dll
- Delphi中高级DLL的编写和调用
- C# 如何调用 Delphi 编写的 DLL 方法
- Delphi调用DLL中的接口(转)(一个FreeLibrary时 报错的解决方案)
- Java Native Interface(Java 调用Delphi、C、C++编写的DLL)
- [JNA系列]Java调用Delphi编写的Dll之JNA使用
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar
- Delphi中高级DLL的编写和调用
- Java中调用Delphi编写的DLL
- Delphi环境中编写调用DLL的方法和技巧
- 用vs2008写了一个动态库,其中有申请内存,用vc6.0写了一个exe调用动态库,并释放dll申请的内存:dbgheap.c Line:1011
- Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】
- VS2015编写能够被vb\delphi等调用的dll
- Delphi中高级DLL的编写和调用
- 一个DLL,在exe调用正常,换到OCX调用就内存溢出