下面著重講述學習C++時碰到的C++代碼編程的相關問題,以及如何進行編制C++代碼的技巧,如何更好的進行C++代碼編制,掌握了C++代碼編制問題就等於說是整個軟件開發周期少了不少彎路,降低工作的復雜性。
- void main()
- {
- SERVICE_TABLE_ENTRY ServiceTable[2];
- ServiceTable[0].lpServiceName = "Name";//線程名字
- ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;//線程入口地址
- ServiceTable[1].lpServiceName = NULL;
- ServiceTable[1].lpServiceProc = NULL;//最後一個必須為NULL
- StartServiceCtrlDispatcher(ServiceTable);// 啟動服務的控制分派機線程
- }
對於Service程序來說,它一般又由以下四部分組成:main(),ServiceMain)和Handler)當然還有我們的功能實現函數比如MyWork()它們之間的關系,用一個簡單的圖示就可以了然。
其服務程序的基本流程就是由main()調用ServiceMain()而由ServiceMain()調用Handler()和執行功能函數MyWork()到現在為止,你以經大體了解了服務程序的流程,按上面的流程一步一步來實現這個後門程序。
1.程序的入口main()函數
服務程序的入口與普通程序一樣也是從main()開始,但不同的是服務程序的main極為簡單,因為它只負責創建分派表並啟動控制分派機,其C++代碼如下:
- void main()
- {
- SERVICE_TABLE_ENTRY ServiceTable[2];
- ServiceTable[0].lpServiceName = "Name";//線程名字
- ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;//線程入口地址
- ServiceTable[1].lpServiceName = NULL;
- ServiceTable[1].lpServiceProc = NULL;//最後一個必須為NULL
- StartServiceCtrlDispatcher(ServiceTable);// 啟動服務的控制分派機線程
- }
2. 服務的真正入口ServiceMain()
ServiceMain()是Service程序的真正入口點,它主要完成以下功能,首先注冊一個Handler去處理控制程序或控制面板,Service的控制要求,比如 啟動,停止,暫停重起等,其次就是實現我們的功能操作,其實現C++代碼如下:
- VOID WINAPI ServiceMain( DWORD dwArgc, LPTSTR *lpszArgv )
- {
- DWORD status = 0;
- DWORD specificError = 0xfffffff;
- ServiceStatus.dwServiceType = SERVICE_WIN32;
- ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
- ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
- ServiceStatus.dwWin32ExitCode = 0;
- ServiceStatus.dwServiceSpecificExitCode = 0;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- //調用RegisterServiceCtrlHandler()注冊一個ServiceHandler函數用來處理程序對Service的控制要求
- hStatus = RegisterServiceCtrlHandler("ServiceName",(LPHANDLER_FUNCTION)ServiceHandler);
- if (hStatus==0)
- return;
- // Handle error condition
- status = GetLastError();
- if (status!=NO_ERROR)
- {
- ServiceStatus.dwCurrentState = SERVICE_STOPPED;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- ServiceStatus.dwWin32ExitCode = status;
- ServiceStatus.dwServiceSpecificExitCode = specificError;
- SetServiceStatus(hStatus, &ServiceStatus);
- return;
- }
- // Initialization complete - report running status
- ServiceStatus.dwCurrentState = SERVICE_RUNNING;
- ServiceStatus.dwCheckPoint = 0;
- ServiceStatus.dwWaitHint = 0;
- SetServiceStatus(hStatus, &ServiceStatus);
- //啟動自己的工作線程
- HANDLE hThread=CreateThread(NULL,0,mainfun,NULL,0,NULL);
- if(hThread==NULL)
- return;
- }