Windows service learning notes

xiaoxiao2021-03-06  66

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;

}

转载请注明原文地址:https://www.9cbs.com/read-88774.html

New Post(0)