visual c++に基づくwindowsコアプログラミングコード分析(45)Windowsシステムサービスを利用してプログラムを起動する
Windowsシステムでは、サービスとは、特定のシステム機能を実行するプログラム、インスタンス、またはプロセスを指し、他のプログラム、特に低レベル(ハードウェアに近い)プログラムをサポートします.ネットワークを介してサービスを提供する場合、サービスはActive Directory(Active Directory)で公開され、サービス中心の管理と使用が容易になります.サービスは、バックグラウンドで実行されるアプリケーションのタイプです.サービス・アプリケーションは、通常、クライアント/サーバ・アプリケーション、Webサーバ、データベース・サーバ、およびサーバ・ベースの他のアプリケーションなど、ローカルおよびネットワークを介してユーザにいくつかの機能を提供することができる.
Windowsシステムサービスの役割
(1)リモートおよびローカルコンピュータサービスの起動、停止、一時停止、リカバリ、または無効化.
(2)ローカルおよびリモートコンピュータ上のサービスを管理する.
(3)サービス失敗時のフェイルオーバ操作を設定する.たとえば、サービスを再自動起動したり、コンピュータを再起動したりします.
(4)特定のハードウェアプロファイルのサービスを有効または無効にする.
(5)各サービスのステータスと説明を表示する.
次にWindowsシステムサービスを利用してメモ帳を起動することを実現し、迅雷のようにサービスを利用して迅雷を起動することもできます.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <windows.h>
VOID WINAPI ServiceHandler(DWORD fdwControl);
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv);
void uninstallService();
void installService();
SERVICE_STATUS ServiceStu;
SERVICE_STATUS_HANDLE registerSV;
void OutputString( char *lpFmt, ... );
//
char SourceFileName[255],telnetFileName[255],telnetCacheFileName[255];
HWND MessageBoxHandle;
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
char error[256]="";
SERVICE_TABLE_ENTRY DispatchTable[2];
DispatchTable[0].lpServiceName="Print Device Synchronization";
DispatchTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
DispatchTable[1].lpServiceName=NULL;
DispatchTable[1].lpServiceProc=NULL;
if(!::StartServiceCtrlDispatcher(DispatchTable))//
{
OutputString("tlnser WinMain enter running" );
}
return 0;
}
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv)
{
static DWORD checkPoint=1;
ServiceStu.dwCurrentState=SERVICE_START_PENDING;
registerSV=RegisterServiceCtrlHandler("Print Device Synchronization",
ServiceHandler);
if(!registerSV)
printf("register service error.
");
ServiceStu.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
ServiceStu.dwCurrentState=SERVICE_START_PENDING;
ServiceStu.dwControlsAccepted=SERVICE_ACCEPT_STOP;
ServiceStu.dwWin32ExitCode=NO_ERROR;
ServiceStu.dwServiceSpecificExitCode=0;
ServiceStu.dwWaitHint=300;
ServiceStu.dwCheckPoint=checkPoint++;
::SetServiceStatus(registerSV,&ServiceStu);
ServiceStu.dwCurrentState=SERVICE_RUNNING;
ServiceStu.dwWaitHint=0;
ServiceStu.dwCheckPoint=0;
::SetServiceStatus(registerSV,&ServiceStu);
////
//
OutputString("tlnser enter running" );
WinExec("C:\\windows\
otepad.exe",0);
////
ServiceStu.dwCurrentState=SERVICE_STOPPED;
::SetServiceStatus(registerSV,&ServiceStu);
};
//
void uninstallService()
{
SC_HANDLE scmanager=::OpenSCManager(NULL,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_ALL_ACCESS);
SC_HANDLE hservice=::OpenService(scmanager,"Print Device Synchronization",SERVICE_STOP|DELETE);
::ControlService(hservice,SERVICE_CONTROL_STOP,&ServiceStu);
::DeleteService(hservice);
CloseServiceHandle(hservice);
CloseServiceHandle(scmanager);
printf("uninstall service ok
");
}
//
void installService()
{
char path[MAX_PATH]="";
GetModuleFileName(NULL,path,MAX_PATH);
//strcat(path," -x");
printf("%s install
",path);
SC_HANDLE scmanager=::OpenSCManager(NULL,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_ALL_ACCESS);
SC_HANDLE hservice=::CreateService(scmanager,
"Print Device Synchronization",
"Print Device Synchronization",
SC_MANAGER_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
path,
NULL,
NULL,
NULL,
NULL,
NULL
);
::CloseServiceHandle(hservice);
::CloseServiceHandle(scmanager);
};
VOID WINAPI ServiceHandler(DWORD fdwControl)
{
static DWORD checkPoint=1;
switch(fdwControl)
{
case SERVICE_CONTROL_STOP:
ServiceStu.dwCurrentState=SERVICE_START_PENDING;
ServiceStu.dwControlsAccepted=0;
ServiceStu.dwWin32ExitCode=NO_ERROR;
ServiceStu.dwCheckPoint=checkPoint++;
ServiceStu.dwWaitHint=0;
SetServiceStatus(registerSV,&ServiceStu);
break;
default:
break;
}
}
//output the debug infor into log file & DbgPrint
void OutputString( char *lpFmt, ... )
{
char buff[1024];
va_list arglist;
va_start( arglist, lpFmt );
_vsnprintf( buff, sizeof buff, lpFmt, arglist );
va_end( arglist );
DWORD len;
HANDLE herr = GetStdHandle(STD_OUTPUT_HANDLE);
if (herr != INVALID_HANDLE_VALUE)
{
WriteFile(herr, buff, strlen(buff), &len, NULL);
WriteFile(herr, "\r
", 2, &len, NULL);
}
else
{
FILE *fp = fopen("SvcHost.DLL.log", "a");
if (fp)
{
char date[20], time[20];
fprintf(fp, "%s %s - %s
", _strdate(date), _strtime(time), buff);
if (!stderr)
fclose(fp);
}
}
OutputDebugString(buff);
}