windows服务开发用到的主要函数详解参考

编程实现  一个完整的服务分为安装服务程序,主体服务程序和卸载服务程序。我们先来写服务的主体部分,示例代码如下:void main(){SERVICE_TABLE_ENTRY ServiceTable[] ={{"scuhkr", BDServiceMain},{NULL, NULL} //"哨兵"};//连接到服务控制管理器StartServiceCtrlDispatcher(ServiceTable);}

路人甲:什么,就这么短?你想侮辱广大鸟儿的智慧?呵呵,先别急,听我慢慢道来:上面代码中,我们先给出了一个SERVICE_TABLE_ENTRY结构数组,每个成员描述了调用进程提供的服务,这里我们只安装了一个服务名为Scuhkr的服务,,后面的BDServiceMain()我们称之为服务主函数,通过回调该函数提供了服务入口地址,它原形的参数必须定义成如下形式:VOID WINAPI BDServiceMain( DWORD dwArgc, //lpszArgv参数个数 LPTSTR* lpszArgv//该数组第一个的参数指定了服务名,可以在后面被 StartService()来调用);SERVICE_TABLE_ENTRY结构数组要求最后一个成员组都为NULL,我们称之为“哨兵”(所有值都为NULL),表示该服务表末尾。一个服务启动后,马上调用StartServiceCtrlDispatcher()通知服务控制程序服务正在执行,并提供服务函数的地址。StartServiceCtrlDispatcher()只需要一个至少有两SERVICE_TABLE_ENTRY结构的数组,它为每个服务启动一个线程,一直等到它们结束才返回。本程序只提供了一个服务函数BDServiceMain(),下面我们来下完成这个函数的功能,示例代码如下:

void WINAPI BDServiceMain(DWORD dwArgc, LPTSTR *lpszArgv){DWORD dwThreadId; //存放线程ID//通过RegisterServiceCtrlHandler()与服务控制程序建立一个通信的协议。//BDHandler()是我们的服务控制程序,它被可以被用来开始,暂停,恢复,停止服务等控制操作if (!(ServiceStatusHandle = RegisterServiceCtrlHandler("scuhkr", BDHandler)))return;

//表示该服务私有ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;//初始化服务,正在开始ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ////服务可以接受的请求,这里我们只接受停止服务请求和暂停恢复请求ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;//下面几个一般我们不大关心,全为0ServiceStatus.dwServiceSpecificExitCode = 0;ServiceStatus.dwWin32ExitCode = 0;ServiceStatus.dwCheckPoint = 0;ServiceStatus.dwWaitHint = 0;//必须调用SetServiceStatus()来响应服务控制程序的每次请求通知SetServiceStatus(ServiceStatusHandle, &ServiceStatus);

//开始运行服务ServiceStatus.dwCurrentState = SERVICE_RUNNING;ServiceStatus.dwCheckPoint = 0;ServiceStatus.dwWaitHint = 0;

SetServiceStatus(ServiceStatusHandle, &ServiceStatus);//我们用一个事件对象来控制服务的同步if (!(hEvent=CreateEvent(NULL, FALSE, FALSE, NULL)))return;

ServiceStatus.dwCurrentState = SERVICE_START_PENDING;ServiceStatus.dwCheckPoint = 0;ServiceStatus.dwWaitHint = 0;

SetServiceStatus(ServiceStatusHandle, &ServiceStatus);//开线程来启动我们的后门程序if (!(hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MainFn, (LPVOID)0, 0, &dwThreadId)))

ServiceStatus.dwCurrentState = SERVICE_RUNNING;ServiceStatus.dwCheckPoint = 0;ServiceStatus.dwWaitHint = 0;

WaitForSingleObject(hEvent, INFINITE);

CloseHandle(hThread);ExitThread(dwThreadId);CloseHandle(hEvent);

return;}

  上面我们调用了一个服务控制函数BDHandler(),由于只是简单的介绍,我们这里只处理服务停止控制请求的情况,其它暂停、恢复等功能,读者可以自己完善。下面是对BDHandler()的实现代码:void WINAPI BDHandler(DWORD dwControl){switch(dwControl){case SERVICE_CONTROL_STOP://等待后门程序的停止ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;ServiceStatus.dwCheckPoint = 0;ServiceStatus.dwWaitHint = 0;SetServiceStatus(ServiceStatusHandle, &ServiceStatus);//设时间为激发状态,等待下一个事件的到来SetEvent(hEvent);ServiceStatus.dwCurrentState = SERVICE_STOP;ServiceStatus.dwCheckPoint = 0;ServiceStatus.dwWaitHint = 0;//停止SetServiceStatus(ServiceStatusHandle, &ServiceStatus);break;default:break;}}

细数门前落叶,倾听窗外雨声,

windows服务开发用到的主要函数详解参考

相关文章:

你感兴趣的文章:

标签云: