• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            How to Create a Windows NT/ Windows 2000 Service(如何創建一個Windows NT/ Windows 2000 服務)

            How to Create a Windows NT/ Windows 2000 Service
            By
            C.V Anish

            How to create a Windows NT/ Windows 2000 Service using VC++.?

            Introduction

            A Windows service is an EXE specially designed to communicate with the SCM (Service Control Manager) of Windows NT/2000. The Service Control Manager (SCM) maintains a database of installed services and driver services, and provides a unified and secure means of controlling them. SCM is started at system boot and it is a remote procedure call (RPC) server. As a developer to try a simple service, we can divide the program into four parts.

            1. Main program of Win32 / Console Application.
            2. A so called ServiceMain(), main program of Service. Entry point of a service.
            3. A Service Control Handler, a function to communicate with SCM.
            4. A Service Installer/ Uninstaller, to register an EXE as a Service.

            Firstly, let us take a look at the Main program of the Console application (it can also be a WinMain()).

            #include? " Winsvc.h " ? // Header?file?for?Services.
            main()
            {
            ??SERVICE_TABLE_ENTRY?Table[]
            = { { " Service1 " ,ServiceMain} , {NULL,NULL} } ;
            ??StartServiceCtrlDispatcher(Table);
            }

            The only thing done by the main() is to fill a SERVICE_TABLE_ENTRY array. The position [0][0] contains the name of the Service (any string you like). Position [0][1] contains the name of the Service Main function, I specified in the list earlier. It actually is a function pointer to the Service main function. The name can be any thing. Now we start the first step to a service by calling StartServiceCtrlDispatcher() with the SERVICE_TABLE_ENTRY array. Note that the function signature should be of the form. The [1][0] and [1][1] positions are NULL, just to say the end of the array (not a must). We can add more entries to the list if we have more than one service running from the same EXE.

            The declaration of a typical ServiceMain():

            ? void ?WINAPI?ServiceMain(DWORD?argc,?LPTSTR? * argv) </ PRE >

            Now, let us analyze our ServiceMain function.

            The main steps of this function are:

            1. Fill the SERVICE_STATUS structure with appropriate values to communicate with the SCM.
            2. Register the Service Control Handler function said earlier in the list.
            3. Call the actual processing functions.

            For proceeding, we need two global variables here:

            • SERVICE_STATUS m_ServiceStatus;
            • SERVICE_STATUS_HANDLE m_ServiceStatusHandle;

            The ServiceMain() can accept command line arguments just as any C++ main() function. The first parameter contains the number of arguments being passed to the service. There will always be at least one argument. The second parameter is a pointer to an array of string pointers. The first item in the array always points to the service name. The SERVICE_STATUS data structure is used to fill the current state of the Service and notify it to the SCM. We use an API function SetServiceStatus() for the purpose. The data members of SERVICE_STATUS to look for are:

            < PRE > dwServiceType? = ?SERVICE_WIN32;?
            dwCurrentState?
            = ?SERVICE_START_PENDING;? // Means?Trying?To?Start(Initially)</PRE>

            dwControlsAccepted = SERVICE_ACCEPT_STOP; accepts Stop/Start only in Service control program, usually in the Control Panel (NT) / Administrative tools (2000). We can also set our service to accept PAUSE and CONTINUE functionality.

            In the beginning of the ServiceMain(), we should set the dwCurrentState of SERVICE_STATUS to SERVICE_START_PENDING. This signals the SCM that the service is starting. If any error occurs in the way, we should notify the SCM by passing SERVICE_STOPPED. By default, the SCM will look for an activity from the service and if it fails to show any progress within 2 minutes, SCM kills that service.

            The API function RegisterServiceCtrlHandler() is used to set the Service Control Handler Function of the Service with the SCM. The function takes two parameters as earlier, one service name (string) and the pointer to the Service Control Handler Function. That function should be with the signature.

            Once we get till here, we now set dwCurrentState as SERVICE_RUNNING to notify that the service has started to function. The next step is to call the actual processing steps.

            Now, let us analyze our Service Control Handler function:

            The Service Control Handler function is used by the SCM to communicate to the Service program about a user action on the service, like a start, stop, pause or continue. It basically contains a switch statement to deal with each case. Here, we will call appropriate steps to clean up and terminate the process. This function receives an opcode which can have values like SERVICE_CONTROL_PAUSE, SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_STOP, SERVICE_CONTROL_INTERROGATE etc. We have to write appropriate steps on each.

            Now Service Installer/ Uninstaller

            For installing a service, we need to make some entries in the system registry. Windows has some APIs to do these steps, instead of using the registry functions. They are CreateService() and DeleteService(). For both these functions, we need to open the SCM database with appropriate rights. I prefer SC_MANAGER_ALL_ACCESS. For installing a service, first open the SCM by OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS). Then invoke the CreateService() with appropriate binary file path of our service. Here also, we have to give the name of our service. We need this name if we want to delete a particular service. In deleting a service, we need to open the specific service first by its name and then invoke the DeleteService() on it. That’s all what we need. Take a look at the code given with it for more details.

            Thank You

            Anish C.V.

            The Code Goes Here:

            ??#include? " stdafx.h "
            #include?
            " Windows.h "
            #include?
            " Winsvc.h "
            #include?
            " time.h "

            SERVICE_STATUS?m_ServiceStatus;
            SERVICE_STATUS_HANDLE?m_ServiceStatusHandle;
            BOOL?bRunning
            = true ;
            void ?WINAPI?ServiceMain(DWORD?argc,?LPTSTR? * argv);
            void ?WINAPI?ServiceCtrlHandler(DWORD?Opcode);
            BOOL?InstallService();
            BOOL?DeleteService();
            int ?main( int ?argc,? char * ?argv[])
            {
            ??
            if (argc > 1 )
            ??
            {
            ????
            if (strcmp(argv[ 1 ], " -i " ) == 0 )
            ????
            {
            ??????
            if (InstallService())
            ????????printf(
            " \n\nService?Installed?Sucessfully\n " );
            ??????
            else
            ????????printf(
            " \n\nError?Installing?Service\n " );
            ????}

            ????
            if (strcmp(argv[ 1 ], " -d " ) == 0 )
            ????
            {
            ??????
            if (DeleteService())
            ????????printf(
            " \n\nService?UnInstalled?Sucessfully\n " );
            ??????
            else
            ????????printf(
            " \n\nError?UnInstalling?Service\n " );
            ????}

            ????
            else
            ????
            {
            ??????printf(
            " \n\nUnknown?Switch?Usage\n\nFor?Install?
            ???????????use?Srv1? - i\n\nFor?UnInstall?use?Srv1? - d\n " );
            ????}

            ??}

            ??
            else
            ??
            {
            ????SERVICE_TABLE_ENTRY?DispatchTable[]
            =
            ????????????????
            { { " Service1 " ,ServiceMain} , {NULL,NULL} } ;
            ????StartServiceCtrlDispatcher(DispatchTable);
            ??}

            ??
            return ? 0 ;
            }


            void ?WINAPI?ServiceMain(DWORD?argc,?LPTSTR? * argv)
            {
            ??DWORD?status;
            ??DWORD?specificError;
            ??m_ServiceStatus.dwServiceType?
            = ?SERVICE_WIN32;
            ??m_ServiceStatus.dwCurrentState?
            = ?SERVICE_START_PENDING;
            ??m_ServiceStatus.dwControlsAccepted?
            = ?SERVICE_ACCEPT_STOP;
            ??m_ServiceStatus.dwWin32ExitCode?
            = ? 0 ;
            ??m_ServiceStatus.dwServiceSpecificExitCode?
            = ? 0 ;
            ??m_ServiceStatus.dwCheckPoint?
            = ? 0 ;
            ??m_ServiceStatus.dwWaitHint?
            = ? 0 ;

            ??m_ServiceStatusHandle?
            = ?RegisterServiceCtrlHandler( " Service1 " ,?
            ????????????????????????????????????????????ServiceCtrlHandler);?
            ??
            if ?(m_ServiceStatusHandle? == ?(SERVICE_STATUS_HANDLE) 0 )
            ??
            {
            ????
            return ;
            ??}

            ??m_ServiceStatus.dwCurrentState?
            = ?SERVICE_RUNNING;
            ??m_ServiceStatus.dwCheckPoint?
            = ? 0 ;
            ??m_ServiceStatus.dwWaitHint?
            = ? 0 ;
            ??
            if ?( ! SetServiceStatus?(m_ServiceStatusHandle,? & m_ServiceStatus))
            ??
            {
            ??}


            ??bRunning
            = true ;
            ??
            while (bRunning)
            ??
            {
            ????Sleep(
            3000 );
            ????
            // Place?Your?Code?for?processing?here.
            ??}

            ??
            return ;
            }


            void ?WINAPI?ServiceCtrlHandler(DWORD?Opcode)
            {
            ??
            switch (Opcode)
            ??
            {
            ????
            case ?SERVICE_CONTROL_PAUSE:?
            ??????m_ServiceStatus.dwCurrentState?
            = ?SERVICE_PAUSED;
            ??????
            break ;
            ????
            case ?SERVICE_CONTROL_CONTINUE:
            ??????m_ServiceStatus.dwCurrentState?
            = ?SERVICE_RUNNING;
            ??????
            break ;
            ????
            case ?SERVICE_CONTROL_STOP:
            ??????m_ServiceStatus.dwWin32ExitCode?
            = ? 0 ;
            ??????m_ServiceStatus.dwCurrentState?
            = ?SERVICE_STOPPED;
            ??????m_ServiceStatus.dwCheckPoint?
            = ? 0 ;
            ??????m_ServiceStatus.dwWaitHint?
            = ? 0 ;

            ??????SetServiceStatus?(m_ServiceStatusHandle,
            & m_ServiceStatus);
            ??????bRunning
            = false ;
            ??????
            break ;
            ????
            case ?SERVICE_CONTROL_INTERROGATE:
            ??????
            break ;?
            ??}

            ??
            return ;
            }


            BOOL?InstallService()
            {
            ??
            char ?strDir[ 1024 ];
            ??HANDLE?schSCManager,schService;
            ??GetCurrentDirectory(
            1024 ,strDir);
            ??strcat(strDir,
            " \\Srv1.exe " );?
            ??schSCManager?
            = ?OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

            ??
            if ?(schSCManager? == ?NULL)?
            ????
            return ? false ;
            ??LPCTSTR?lpszBinaryPathName
            = strDir;

            ??schService?
            = ?CreateService(schSCManager, " Service1 " ,?
            ????????
            " The?Display?Name?Needed " ,? // ?service?name?to?display
            ?????SERVICE_ALL_ACCESS,? // ?desired?access?
            ?????SERVICE_WIN32_OWN_PROCESS,? // ?service?type?
            ?????SERVICE_DEMAND_START,? // ?start?type?
            ?????SERVICE_ERROR_NORMAL,? // ?error?control?type?
            ?????lpszBinaryPathName,? // ?service's?binary?
            ?????NULL,? // ?no?load?ordering?group?
            ?????NULL,? // ?no?tag?identifier?
            ?????NULL,? // ?no?dependencies
            ?????NULL,? // ?LocalSystem?account
            ?????NULL);? // ?no?password

            ??
            if ?(schService? == ?NULL)
            ????
            return ? false ;?

            ??CloseServiceHandle(schService);
            ??
            return ? true ;
            }


            BOOL?DeleteService()
            {
            ??HANDLE?schSCManager;
            ??SC_HANDLE?hService;
            ??schSCManager?
            = ?OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

            ??
            if ?(schSCManager? == ?NULL)
            ????
            return ? false ;
            ??hService
            = OpenService(schSCManager, " Service1 " ,SERVICE_ALL_ACCESS);
            ??
            if ?(hService? == ?NULL)
            ????
            return ? false ;
            ??
            if (DeleteService(hService) == 0 )
            ????
            return ? false ;
            ??
            if (CloseServiceHandle(hService) == 0 )
            ????
            return ? false ;

            return ? true ;
            }

            About C.V Anish


            A Developer from India. Concentrating on the Microsoft Technologies. VC++ and VB.

            Click here to view C.V Anish's

            posted on 2006-04-14 21:38 楊粼波 閱讀(526) 評論(1)  編輯 收藏 引用 所屬分類: 文章收藏

            評論

            # re: How to Create a Windows NT/ Windows 2000 Service(如何創建一個Windows NT/ Windows 2000 服務) 2006-04-14 21:39 天下奇毒

            原文請見:http://www.codeproject.com/system/windows_nt_service.asp

            我會把它翻譯出來的,呵呵....  回復  更多評論   

            亚洲午夜久久久久久噜噜噜| 久久99精品久久久久久噜噜 | 久久久精品人妻无码专区不卡 | 久久婷婷五月综合国产尤物app| 久久国产高清字幕中文| 99久久婷婷免费国产综合精品| 久久亚洲精品国产精品婷婷| 亚洲精品97久久中文字幕无码| 91精品国产91久久久久久| 欧美伊香蕉久久综合类网站| 国产美女久久久| 久久夜色tv网站| 精品人妻伦一二三区久久| 精品无码久久久久久久动漫| 欧美色综合久久久久久| 精品久久久一二三区| 色88久久久久高潮综合影院| 久久无码人妻一区二区三区午夜| 精品久久久久久无码专区| 久久噜噜电影你懂的| 久久综合久久伊人| 一本色道久久99一综合| 99久久99久久久精品齐齐| 国产精品青草久久久久婷婷| 久久久久人妻精品一区三寸蜜桃| 久久强奷乱码老熟女网站| 人妻精品久久久久中文字幕一冢本 | 浪潮AV色综合久久天堂| 国产成人精品白浆久久69| 久久精品夜色噜噜亚洲A∨| 久久夜色精品国产亚洲| 久久99国产精品久久| yy6080久久| 99久久成人18免费网站| 99久久无色码中文字幕人妻| 久久99国产亚洲高清观看首页| 亚洲精品无码专区久久同性男| 97久久久精品综合88久久| 亚洲欧洲久久久精品| 亚洲国产精品久久66| 久久久久亚洲AV无码专区体验|