本文共 2551 字,大约阅读时间需要 8 分钟。
- #include <Windows.h>
- #include <stdio.h>
- #include <WinBase.h>
-
- #define SLEEP_TIME 5000
- #define LOGFILE "D:\\memorylog.txt"
-
- SERVICE_STATUS ServiceStatus;
- SERVICE_STATUS_HANDLE hStatus;
-
- VOID WINAPI Handler(DWORD fdwControl);
- VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR lpszArgv);
- INT InitService(VOID);
- INT WriteToLog(char* str);
-
- VOID main(VOID){
- SERVICE_TABLE_ENTRY ServiceTable[]={ { "Pnig0srv",(LPSERVICE_MAIN_FUNCTION)ServiceMain},{NULL,NULL}};
- if(!StartServiceCtrlDispatcher(ServiceTable)){
- printf("Start Service failed.(%d)\n",GetLastError());
- }
- }
-
- VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR lpszArgv){
- int error;
- ServiceStatus.dwServiceType = SERVICE_WIN32;
- ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
- ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwServiceSpecificExitCode = 0;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
-
- hStatus = RegisterServiceCtrlHandler("Pnig0srv",(LPHANDLER_FUNCTION)Handler);
-
- if(hStatus == (SERVICE_STATUS_HANDLE)0){
- return;
- }
- error = InitService();
- if(error){
- ServiceStatus.dwCurrentState = SERVICE_STOP;
- ServiceStatus.dwWin32ExitCode = -1;
- SetServiceStatus(hStatus,&ServiceStatus);
- return;
- }
- ServiceStatus.dwCurrentState = SERVICE_RUNNING;
- SetServiceStatus(hStatus,&ServiceStatus);
-
- MEMORYSTATUS memory;
- while(ServiceStatus.dwCurrentState == SERVICE_RUNNING){
- char buffer[16];
- GlobalMemoryStatus(&memory);
- sprintf(buffer, "%d", memory.dwAvailPhys);
- int result = WriteToLog(buffer);
- if (result)
- {
- ServiceStatus.dwCurrentState =
- SERVICE_STOPPED;
- ServiceStatus.dwWin32ExitCode = -1;
- SetServiceStatus(hStatus,
- &ServiceStatus);
- return;
- }
- Sleep(SLEEP_TIME);
- }
- return;
- }
-
- VOID WINAPI Handler(DWORD fdwControl){
- switch(fdwControl)
- {
- case SERVICE_CONTROL_STOP:
- WriteToLog("Monitoring stopped.");
-
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus (hStatus, &ServiceStatus);
- return;
-
- case SERVICE_CONTROL_SHUTDOWN:
- WriteToLog("Monitoring stopped.");
-
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- SetServiceStatus (hStatus, &ServiceStatus);
- return;
-
- default:
- break;
- }
-
- SetServiceStatus (hStatus, &ServiceStatus);
-
- return;
- }
-
- INT WriteToLog(char* str)
- {
- FILE* log;
- log = fopen(LOGFILE, "a+");
- if (log == NULL)
- return -1;
- fprintf(log, "%s\n", str);
- fclose(log);
- return 0;
- }
-
- INT InitService(){
- int result;
- result = WriteToLog("Monitoring started.");
- return(result);
- }
本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/674402,如需转载请自行联系原作者