WinAPI 编写基本服务程序

简介:

 

 
  1. #include <Windows.h> 
  2. #include <stdio.h> 
  3. #include <WinBase.h> 
  4.  
  5. #define SLEEP_TIME 5000 
  6. #define LOGFILE "D:\\memorylog.txt" 
  7.  
  8. SERVICE_STATUS ServiceStatus; 
  9. SERVICE_STATUS_HANDLE hStatus; 
  10.  
  11. VOID WINAPI Handler(DWORD fdwControl); 
  12. VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR lpszArgv); 
  13. INT InitService(VOID); 
  14. INT WriteToLog(char* str); 
  15.  
  16. VOID main(VOID){ 
  17.     SERVICE_TABLE_ENTRY ServiceTable[]={{"Pnig0srv",(LPSERVICE_MAIN_FUNCTION)ServiceMain},{NULL,NULL}}; 
  18.     if(!StartServiceCtrlDispatcher(ServiceTable)){ 
  19.         printf("Start Service failed.(%d)\n",GetLastError()); 
  20.     } 
  21.  
  22. VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR lpszArgv){ 
  23.     int error; 
  24.     ServiceStatus.dwServiceType = SERVICE_WIN32; 
  25.     ServiceStatus.dwCurrentState = SERVICE_START_PENDING; 
  26.     ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; 
  27.     ServiceStatus.dwWin32ExitCode = 0; 
  28.     ServiceStatus.dwServiceSpecificExitCode = 0; 
  29.     ServiceStatus.dwCheckPoint = 0; 
  30.     ServiceStatus.dwWaitHint = 0; 
  31.  
  32.     hStatus = RegisterServiceCtrlHandler("Pnig0srv",(LPHANDLER_FUNCTION)Handler); 
  33.  
  34.     if(hStatus == (SERVICE_STATUS_HANDLE)0){ 
  35.         return
  36.     } 
  37.     error = InitService(); 
  38.     if(error){ 
  39.         ServiceStatus.dwCurrentState = SERVICE_STOP; 
  40.         ServiceStatus.dwWin32ExitCode = -1; 
  41.         SetServiceStatus(hStatus,&ServiceStatus); 
  42.         return
  43.     } 
  44.     ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
  45.     SetServiceStatus(hStatus,&ServiceStatus); 
  46.  
  47.     MEMORYSTATUS memory; 
  48.     while(ServiceStatus.dwCurrentState == SERVICE_RUNNING){ 
  49.         char buffer[16]; 
  50.         GlobalMemoryStatus(&memory); 
  51.         sprintf(buffer, "%d", memory.dwAvailPhys); 
  52.         int result = WriteToLog(buffer); 
  53.         if (result) 
  54.         { 
  55.             ServiceStatus.dwCurrentState =  
  56.                 SERVICE_STOPPED;  
  57.             ServiceStatus.dwWin32ExitCode      = -1;  
  58.             SetServiceStatus(hStatus,  
  59.                 &ServiceStatus); 
  60.             return
  61.         } 
  62.         Sleep(SLEEP_TIME); 
  63.     } 
  64.     return
  65.  
  66. VOID WINAPI Handler(DWORD fdwControl){ 
  67.     switch(fdwControl)  
  68.     {  
  69.     case SERVICE_CONTROL_STOP:  
  70.         WriteToLog("Monitoring stopped."); 
  71.  
  72.         ServiceStatus.dwWin32ExitCode = 0;  
  73.         ServiceStatus.dwCurrentState = SERVICE_STOPPED;  
  74.         SetServiceStatus (hStatus, &ServiceStatus); 
  75.         return;  
  76.  
  77.     case SERVICE_CONTROL_SHUTDOWN:  
  78.         WriteToLog("Monitoring stopped."); 
  79.  
  80.         ServiceStatus.dwWin32ExitCode = 0;  
  81.         ServiceStatus.dwCurrentState = SERVICE_STOPPED;  
  82.         SetServiceStatus (hStatus, &ServiceStatus); 
  83.         return;  
  84.  
  85.     default
  86.         break
  87.     }  
  88.  
  89.     SetServiceStatus (hStatus, &ServiceStatus); 
  90.  
  91.     return;  
  92.  
  93. INT WriteToLog(char* str) 
  94.     FILE* log; 
  95.     log = fopen(LOGFILE, "a+"); 
  96.     if (log == NULL) 
  97.         return -1; 
  98.     fprintf(log, "%s\n", str); 
  99.     fclose(log); 
  100.     return 0; 
  101.  
  102. INT InitService(){ 
  103.     int result; 
  104.     result = WriteToLog("Monitoring started."); 
  105.     return(result);  

 

本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/674402,如需转载请自行联系原作者

相关文章
|
2月前
|
安全 程序员 开发者
BIOS/DOS功能调用:深入解析与代码实践
BIOS/DOS功能调用:深入解析与代码实践
|
10月前
|
网络协议 安全 API
驱动开发:内核远程线程实现DLL注入
在笔者上一篇文章`《内核RIP劫持实现DLL注入》`介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过`NtCreateThreadEx`这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首先得到该函数的入口地址,`NtCreateThreadEx`函数最终会调用`ZwCreateThread`,本章在寻找函数的方式上有所不同,前一章通过内存定位的方法得到所需地址,本章则是通过解析导出表实现。
4898 0
|
10月前
|
存储 程序员 编译器
windows下的串口编程,串口操作类封装
windows下的串口编程,串口操作类封装
|
10月前
驱动开发:内核LoadLibrary实现DLL注入
远程线程注入是最常用的一种注入技术,在应用层注入是通过`CreateRemoteThread`这个函数实现的,该函数通过创建线程并调用 `LoadLibrary` 动态载入指定的DLL来实现注入,而在内核层同样存在一个类似的内核函数`RtlCreateUserThread`,但需要注意的是此函数未被公开,`RtlCreateUserThread`其实是对`NtCreateThreadEx`的包装,但最终会调用`ZwCreateThread`来实现注入,`RtlCreateUserThread`是`CreateRemoteThread`的底层实现。
2501 1
|
11月前
编写使用中断的按键驱动程序
编写使用中断的按键驱动程序
82 0
|
程序员 Linux 芯片
按键驱动编写
按键驱动编写
85 0
按键驱动编写
9、IAR中断向量表与中断服务函数的编写
9、IAR中断向量表与中断服务函数的编写
182 0
|
Linux
树莓派内核驱动编写——添加与调用
树莓派内核驱动编写——添加与调用
399 0
C++ 编写DLL文件给易语言调用
  摸索了两天了,终于解决了所有问题,在此跟大家分享。   需要三个文件,dll_demo.h、dll_demo.cpp、dll_dome.def   直接上代码:   头文件如下: 1 #ifndef _DLL_DEMO_H_ 2 #define _DLL_DEMO_H_ 3 #ifdef DL...
2097 0
|
安全 Windows
IAR故障解决:由于找不到mfc140u.dll,无法继续执行代码
IAR故障解决:由于找不到mfc140u.dll,无法继续执行代码
IAR故障解决:由于找不到mfc140u.dll,无法继续执行代码