分享
 
 
 

windows 服务学习笔记

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

这是在学习windows的服务安装机制时的笔记,主要是一些函数的说明,还有我自己的代码,没有整理过比较乱

OpenSCManager:

The OpenSCManager function establishes a connection to the service control manager on the specified computer and opens the specified service control manager database.

SC_HANDLE OpenSCManager(

LPCTSTR lpMachineName,

LPCTSTR lpDatabaseName,

DWORD dwDesiredAccess 如果以administrators的权限创建服务的话,该字段的值为SC_MANAGER_ALL_ACCESS

);

CreateService:

The CreateService function creates a service object and adds it to the specified service control manager database

SC_HANDLE CreateService(

SC_HANDLE hSCManager,

LPCTSTR lpServiceName, //服务的名称

LPCTSTR lpDisplayName,

DWORD dwDesiredAccess, //SERVICE_ALL_ACCESS

DWORD dwServiceType, //SERVICE_WIN32_OWN_PROCESS

DWORD dwStartType, //SERVICE_AUTO_START

DWORD dwErrorControl, //SERVICE_ERROR_IGNORE

LPCTSTR lpBinaryPathName, //指向二进制文件的路径

LPCTSTR lpLoadOrderGroup,

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_OWN_PROCESS Service that runs in its own process.

SERVICE_WIN32_SHARE_PROCESS Service that shares a process with other services.

StartService: 启动一个服务

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.

RegisterServiceCtrlHandler: 注册一个服务

SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler(

LPCTSTR lpServiceName, //服务的名字

LPHANDLER_FUNCTION lpHandlerProc //服务的控制函数的名字

);

创建服务线程 服务完成的功能在这里调用

CreateThread

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,

SIZE_T dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress, //线程函数的名字

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpThreadId

);

附上我的代码:

#include "windows.h"

#include "stdio.h"

//全局变量

SERVICE_STATUS ServiceStatus;

SERVICE_STATUS_HANDLE ServiceStatusHandle;

//函数声明

void InstallService(char *szServicePath);

void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv);

void WINAPI ServiceControl(DWORD dwCode);

DWORD WINAPI Service(LPVOID lpvThread); //服务功能函数

int main(int argc, char* argv[])

{

//定义SERVICE_TABLE_ENTRY DispatchTable[] 结构

SERVICE_TABLE_ENTRY DispatchTable[2] =

{

{"mixu_yy", ServiceStart},

{NULL, NULL}

};

//安装或者打开服务

StartServiceCtrlDispatcher(DispatchTable);

InstallService(argv[0]);

return 0;

}

//函数定义

void InstallService(char *szServicePath)

{

SC_HANDLE schSCManager;

SC_HANDLE schService;

SERVICE_STATUS InstallServiceStatus;

DWORD dwErrorCode;

//打开服务管理数据库

schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if(schSCManager == NULL)

{

//Open Service Control Manager Database Failed!;

return;

}

//创建服务

schService = CreateService(

schSCManager,

"mixu_yy",

"mixu_yy",

SERVICE_ALL_ACCESS,

SERVICE_WIN32_OWN_PROCESS,

SERVICE_AUTO_START,

SERVICE_ERROR_IGNORE,

szServicePath,

NULL,

NULL,

NULL,

NULL,

NULL);

if(schService == NULL)

{

dwErrorCode = GetLastError();

if(dwErrorCode != ERROR_SERVICE_EXISTS)

{

//创建服务失败

CloseServiceHandle(schSCManager);

return;

}

else

{

//要创建的服务已经存在

schService = OpenService(schSCManager, "mixu_yy", SERVICE_START);

if(schService == NULL)

{

//Open Service Failed!;

CloseServiceHandle(schSCManager);

return;

}

}

}

else

{

//Create Service Success!;

}

//启动服务

if(StartService(schService, 0, NULL)==0 )

{

//启动失败

dwErrorCode = GetLastError();

if(dwErrorCode == ERROR_SERVICE_ALREADY_RUNNING)

{

//Service already run!;

CloseServiceHandle(schSCManager);

CloseServiceHandle(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!

}

//擦屁股

CloseServiceHandle(schSCManager);

CloseServiceHandle(schService);

return;

}

void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv)

{

HANDLE hThread;

ServiceStatus.dwServiceType = SERVICE_WIN32;

ServiceStatus.dwCurrentState = SERVICE_START_PENDING;

ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;

ServiceStatus.dwServiceSpecificExitCode = 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;

}

//创建服务线程 服务完成的功能在这里调用

hThread = CreateThread(NULL,

0,

Service,

NULL,

0,

NULL);

if(hThread == NULL)

{

//CreateThread error!

return;

}

CloseHandle(hThread);

return;

}

//服务控制模块

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 ;

}

//服务线程函数

DWORD WINAPI Service(LPVOID lpvThread)

{

//实现函数功能的地方。

return 1;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有