青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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 楊粼波 閱讀(537) 評論(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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线免费观看成人网| 国产在线一区二区三区四区| 欧美在线观看一区二区| 国产伦精品一区二区三区视频黑人| 夜夜嗨av一区二区三区免费区| 亚洲三级电影在线观看| 国产精品久久久久aaaa樱花| 欧美成人精品高清在线播放| 亚洲婷婷在线| 精品福利免费观看| 欧美婷婷在线| 男女精品网站| 久久精品91| 久久er精品视频| 亚洲午夜一区二区三区| 亚洲成色777777在线观看影院| 欧美日韩一区二区三区在线 | 欧美日韩中文字幕在线视频| 欧美伊人久久久久久久久影院| 亚洲国产另类精品专区 | 日韩午夜中文字幕| 国产精品视频xxxx| 欧美丝袜第一区| 欧美 日韩 国产一区二区在线视频| 午夜精品免费在线| 欧美在线视频二区| 欧美三级精品| 欧美日韩亚洲激情| 欧美理论在线播放| 欧美剧在线免费观看网站| 免费视频最近日韩| 免费看黄裸体一级大秀欧美| 久久网站热最新地址| 久久久国产91| 欧美一区国产二区| 久久激情视频免费观看| 久久精品国产亚洲精品| 久久超碰97人人做人人爱| 欧美在线中文字幕| 久久aⅴ国产欧美74aaa| 先锋影音网一区二区| 篠田优中文在线播放第一区| 欧美久久九九| 午夜精品婷婷| 久久精品国产视频| 另类av一区二区| 欧美a级大片| 欧美黄色免费网站| 午夜老司机精品| 欧美在线亚洲| 欧美成人精品一区二区| 欧美日本网站| 国产精品久久91| 国产美女扒开尿口久久久| 黑人中文字幕一区二区三区| 1000部国产精品成人观看| 国产一区日韩一区| 亚洲精品乱码久久久久久日本蜜臀| 99在线热播精品免费| 亚洲欧美国产精品桃花| 欧美一区二区性| 欧美sm极限捆绑bd| 亚洲欧洲日本在线| 亚洲一区二区三区免费观看| 亚洲婷婷综合色高清在线| 欧美亚洲一区二区在线| 噜噜噜91成人网| 欧美高清在线一区二区| 国产精品一区三区| 国产乱码精品一区二区三| 亚洲福利视频专区| 亚洲先锋成人| 久久亚洲春色中文字幕久久久| 欧美风情在线观看| 在线综合亚洲| 欧美成人国产va精品日本一级| 国产精品久久久久久久久久免费| 精品动漫3d一区二区三区免费| 亚洲美女av网站| 伊甸园精品99久久久久久| 亚洲一区中文字幕在线观看| 欧美大片第1页| 欧美亚洲免费在线| 欧美日韩视频在线| 国内一区二区在线视频观看| 亚洲一区二区欧美日韩| 欧美成人性生活| 性欧美精品高清| 国产精品久久久久久久久久ktv| 在线成人中文字幕| 欧美在线观看网站| 日韩一区二区精品视频| 欧美国产日本| 亚洲黄色成人| 久久综合伊人77777尤物| 欧美影院成年免费版| 亚洲影院一区| 亚洲国产精品热久久| 亚洲天堂av在线免费| 亚洲综合成人婷婷小说| 欧美一区亚洲二区| 亚洲国产一区在线| 在线亚洲免费视频| 亚洲电影天堂av| 亚洲一区黄色| 亚洲精品婷婷| 欧美亚洲一级| 亚洲与欧洲av电影| 久久久综合免费视频| 亚洲男同1069视频| 欧美成人性网| 久久久久久久一区二区| 欧美理论视频| 老巨人导航500精品| 欧美午夜片在线免费观看| 美女诱惑黄网站一区| 国产欧美欧美| 一区二区三区国产在线| 亚洲国产精品专区久久 | 午夜精品视频网站| 亚洲网址在线| 母乳一区在线观看| 免费成人av在线看| 国产一区二区三区免费不卡| 亚洲精品一区二区三区99| 伊人婷婷久久| 久久久99久久精品女同性| 性欧美大战久久久久久久免费观看 | 久久精品国产2020观看福利| 欧美日韩日韩| 亚洲日本黄色| 亚洲日本免费电影| 久久在线观看视频| 欧美r片在线| 亚洲激情成人网| 免费久久99精品国产| 免费在线亚洲欧美| 怡红院精品视频在线观看极品| 亚洲欧美另类在线| 久久不射2019中文字幕| 国产精品网站在线| 亚洲一区观看| 久久久99精品免费观看不卡| 国产欧美一级| 欧美一区视频| 男男成人高潮片免费网站| 在线观看欧美成人| 久久琪琪电影院| 亚洲动漫精品| 一本色道久久88综合亚洲精品ⅰ| 欧美国产精品劲爆| 亚洲国产二区| 亚洲婷婷综合久久一本伊一区| 国产精品成人午夜| 亚洲欧美日韩另类| 久久综合久久久久88| 91久久精品一区二区别| 欧美日韩激情小视频| 一区二区日韩伦理片| 一本久道久久综合婷婷鲸鱼| 欧美日韩视频一区二区三区| 久久亚洲不卡| 久久久久久**毛片大全| 激情综合色综合久久| 巨乳诱惑日韩免费av| 亚洲黄色成人久久久| 一本色道久久综合精品竹菊| 国产精品久久波多野结衣| 在线综合视频| 老司机精品福利视频| 亚洲成人影音| 欧美日韩极品在线观看一区| 亚洲视频一区在线| 亚洲免费在线观看视频| 黑人中文字幕一区二区三区| 欧美国产视频在线| 亚洲视频在线观看视频| 久久精品国产精品亚洲精品| 红桃av永久久久| 欧美日韩123| 亚洲网站在线观看| 欧美一区二区三区精品| 亚洲电影av在线| 欧美日韩国产限制| 亚洲欧美国内爽妇网| 蜜桃av一区二区| 亚洲欧洲日产国产网站| 欧美四级剧情无删版影片| 久久aⅴ国产紧身牛仔裤| 亚洲激情视频| 午夜精品影院在线观看| 在线精品视频免费观看| 国产精品xxxxx| 欧美在线日韩| 一本色道精品久久一区二区三区| 久久精品国产2020观看福利| 亚洲大片av| 国产真实乱子伦精品视频| 国产精品v欧美精品v日韩精品| 久久久噜噜噜|