http://blog.9cbs.net/mixu_yy/archive/2004/11/22/190712.aspx This is the note when learning Windows service installation mechanism, mainly some functions, and my own code, No sorting
OpenSCManager:
The SERVICE CONTROL Manager Database.
SC_Handle OpenScManager
LPCTSTR LPMACHINENAME,
LPCTSTR LPDATABASENAME,
DWORD DWDESIREDACCESS If you create a service in Administrators, the value of this field is SC_Manager_All_Access
);
CREATSERVICE:
The CreateService Function Creates a Service Object And Adds It to the Specified Service Control Manager Database
SC_HANDLE CREATSERVICE
SC_HANDLE HSCMANAGER,
LPCTSTSTR LPSERVICENAME, // Name
LPCTSTR LPDISPLAYNAME,
DWORD DWDESIREDACCESS, // service_all_access
DWORD DWSERVICEPE, // service_win32_oen_process
DWORD DWSTARTTYPE, / / service_AUTO_START
DWORD DWERRORCONTROL, // service_error_ignore
LPCTSTR lpbinaryPathname, / / Point to binary files
LPCTSTR LPLOADERGROUP,
LPDWORD LPDWTAGID,
LPCTSTR LPDependencies,
LPCTSTR LPSERVICESTARTNAME,
LPCTSTR LPPASSWORD
);
Type meaning
Service_file_system_driver file system driver service.
Service_kernel_driver driver service.
Service_win32_oen_process service That Runs in Its Own Process.
Service_win32_share_process service triass a process with other service.
StartService: Start a service
Bool StartService
SC_HANDLE HSERVICE,
DWORD DWNUMSERVICEARGS,
LPCTSTR * LPSERVICEARGVECTORS
);
QueryServiceStatus:
Bool QueryServiceStatus
SC_HANDLE HSERVICE,
LPSERVICE_STATUS LPSERVICESTATUS
);
Return:
IF The Function Succeeds, The Return Value IS Nonzero.
If the function fails, the return value is zero. To get extended error information, call getlasterror.register: register a service
Service_status_handle registerServiceCtrlhandler
LPCTSTR LPSERVICENAME, / / The name of the service
LPHANDLER_FUNCTION LPHANDLERPROC // The name of the control function
);
Creating a service thread service is called here
CreateThread
Handle CreateThread
LPSecurity_attributes LPTHREADATIADATTRIBUTES,
Size_t dwstacksize,
LPTHREAD_START_ROUTINE LPSTARTADDRESS, / / Thread function name
LPVOID LPPARETER,
DWORD DWCREATIONFLAGS,
LPDWORD LPTHREADID
);
Attach my code:
#include "windows.h"
#include "stdio.h"
// Global variable
Service_status serviceArstatus;
Service_status_handle service .tatushandle;
// Function declaration
Void InstallService (Char * SzServicePath);
void WINAPI ServiceStart (DWORD dwArgc, LPTSTR * lpArgv);
Void WinApi ServiceControl (DWORD DWCODE);
DWORD WINAPI Service (LPVOID LPVTHREAD); // Service Function Function
Int main (int Argc, char * argv [])
{
/ / Define Service_Table_Entry DispatchTable [] Structure
Service_table_entry dispatchtable [2] =
{
{"Mixu_YY", serviceStart},
{Null, null}
}
/ / Install or open the service
StartServiceCtrlDispatcher (DispatchTable);
InstallService (Argv [0]);
Return 0;
}
// Function Definition
Void InstallService (Char * SZServicePath)
{
SC_HANDLE SCHSCMANAGER;
SC_HANDLE SCHSERVICE;
Service_status installServiceStatus;
DWORD DWERRORCODE;
// Open service management database
Schscmanager = OpenScManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
IF (SCHSCMANAGER == NULL)
{
// Open Service Control Manager Database Failed !;
Return;
}
// Create a service
SCHSERVICE = CREATSERVICE
SCHSCManager,
"Mixu_YY",
"Mixu_YY",
SERVICE_ALL_ACCESS,
Service_win32_oen_process,
Service_Auto_Start,
Service_ERROR_IGNORE,
SZServicePath,
NULL, NULL,
NULL,
NULL,
NULL);
IF (SCHSERVICE == NULL)
{
Dwerrorcode = getLastError ();
IF (dwerrorcode! = error_service_exists)
{
// Creating a service failed
ClosESERVICEHANDE (SCHSCMANAGER);
Return;
}
Else
{
// The service to be created already exists
SCHSERVICE = OpenService (SchscManager, "Mixu_yy", Service_Start);
IF (SCHSERVICE == NULL)
{
// Open service failed !;
ClosESERVICEHANDE (SCHSCMANAGER);
Return;
}
}
}
Else
{
// CREATE Service Success !;
}
// Start service
IF (STARTSERVICE (SCHSERVICE, 0, NULL) == 0)
{
//failed to activate
Dwerrorcode = getLastError ();
IF (dwerrorcode == error_service_already_running)
{
// service already run !;
ClosESERVICEHANDE (SCHSCMANAGER);
ClosESERVICEHANDE (SCHSERVICE);
Return;
}
}
Else
{
// service pending
}
While (QueryServiceStatus (SCHSERVICE, & InstallServiceStatus)! = 0)
{
IF (InstallServiceStatus.dwcurrentState == Service_Start_pending)
{
// SLEEP (100);
}
Else
{
Break;
}
}
IF (InstallServiceStatus.dwcurrentState! = service_running)
{
// failure!
}
Else
{
// Sucess!
}
// 屁 股
ClosESERVICEHANDE (SCHSCMANAGER);
ClosESERVICEHANDE (SCHSERVICE);
Return;
}
Void WinAPI ServicesTART (DWORD DWARGC, LPTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTSTS
{
Handle hthread;
ServiceStatus.dwserviceType = service_win32;
ServicesTatus.dwcurrentState = service_start_pend;
ServiceStatus.dwcontrolsAccepted = service_accept_stop | service_accept_pause_continue;
ServiceStatus.dwservicesPecIfficeXitcode = 0;
ServiceStatus.dwwin32exitcode = 0;
ServicesTatus.dwcheckpoint = 0;
ServiceStatus.dwwaithint = 0;
ServiceStatusHandle = RegisterServiceCtrlHandler ("Mixu_yy", ServiceControl);
IF (serviceStatushandle == 0) {
// Error
Return;
}
ServiceStatus.dwcurrentState = service_running;
ServicesTatus.dwcheckpoint = 0;
ServiceStatus.dwwaithint = 0;
IF (SETSERVICESTATUS (ServicesTatusHandle, & ServiceStatus) == 0)
{
// setServiceStatus Error!
Return;
}
// Creating a service thread service completed here call
hthread = CreateThread (NULL,
0,
Service,
NULL,
0,
NULL);
IF (hthread == null)
{
// CreateThread Error!
Return;
}
CloseHandle (HTHREAD);
Return;
}
// Service Control Module
Void WinApi ServiceControl (DWord Dwcode)
{
Switch (dwcode) {
Case service_control_pause:
ServiceStatus.dwcurrentState = service_paused;
Break;
Case Service_Control_Continue:
ServiceStatus.dwcurrentState = service_running;
Break;
Case Service_Control_Stop:
ServicesTatus.dwcurrentState = service_stopped;
ServiceStatus.dwwin32exitcode = 0;
ServicesTatus.dwcheckpoint = 0;
ServiceStatus.dwwaithint = 0;
IF (SETSERVICESTATUS (ServicesTatusHandle, & ServiceStatus) == 0)
{
// setServiceStatus Error!
}
Return;
Case Service_Control_Interrogate:
Break;
DEFAULT:
Break;
}
IF (SETSERVICESTATUS (ServicesTatusHandle, & ServiceStatus) == 0)
{
// setServiceStatus Error!
}
Return;
}
// Service thread function
DWORD WINAPI Service (LPVOID LPVTHREAD)
{
/ / Implement the function of function.
Return 1;
}