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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            亚洲人成毛片在线播放女女| 久久精品国产一区二区三区免费看 | 一区二区三区精品久久久| 欧美女激情福利| 亚洲精品日韩综合观看成人91| 免费观看久久久4p| 欧美精品午夜视频| 亚洲欧美日韩一区在线观看| 午夜精品一区二区三区在线视| 国产伪娘ts一区| 欧美大片免费看| 欧美午夜免费影院| 久久蜜臀精品av| 欧美精品在线观看播放| 亚洲欧美日韩中文播放| 亚洲欧美日韩专区| 伊人精品视频| 99精品视频一区二区三区| 国产欧美精品日韩精品| 欧美激情1区| 国产精品美女久久久久久久| 巨胸喷奶水www久久久免费动漫| 麻豆精品精品国产自在97香蕉| 亚洲网站在线| 老司机aⅴ在线精品导航| 亚洲视频福利| 久久久久这里只有精品| 亚洲一区二区精品视频| 久久国产色av| 亚洲一区二区在线看| 久久久在线视频| 亚洲一区二区三区四区视频| 久久久久成人网| 日韩视频在线免费观看| 欧美一区二区日韩一区二区| 亚洲黄色三级| 宅男精品视频| 亚洲黄色天堂| 欧美一区二区精美| aa日韩免费精品视频一| 久久夜色精品| 久久久久久久国产| 国产精品久久久久久久久久久久久 | 国产亚洲精品aa| 亚洲精品免费一二三区| 激情综合视频| 亚洲宅男天堂在线观看无病毒| 亚洲激情视频| 久久精品国产视频| 久久精品水蜜桃av综合天堂| 欧美日韩裸体免费视频| 亚洲精品日韩欧美| 亚洲裸体在线观看| 欧美二区在线看| 美女日韩在线中文字幕| 国产综合久久久久久| 亚洲欧美清纯在线制服| 欧美专区在线观看| 国产欧美一区二区精品秋霞影院| 99热免费精品| 亚洲小少妇裸体bbw| 欧美视频一区二区三区四区| 日韩视频精品| 亚洲在线成人精品| 国产精品麻豆欧美日韩ww| 99视频超级精品| 亚洲一区二区精品视频| 国产精品成人一区二区艾草| 日韩午夜中文字幕| 亚洲视频欧洲视频| 国产精品久久久久国产a级| 一区二区三区四区五区精品视频 | 国产精品v亚洲精品v日韩精品| 一本大道久久精品懂色aⅴ| 亚洲一区二区三区高清不卡| 国产精品夫妻自拍| 欧美一级大片在线观看| 麻豆精品视频在线观看视频| 亚洲福利视频网| 欧美精品在线免费观看| 中文欧美在线视频| 久久精品在线观看| 亚洲激情影院| 国产精品久久久久久久久婷婷 | 国产精品久久久久久久午夜| 欧美影视一区| 亚洲国产日韩欧美在线99| 亚洲午夜高清视频| 国产一级一区二区| 欧美激情麻豆| 欧美一区二区三区免费观看视频 | 午夜精品一区二区三区在线播放| 久久综合伊人| 亚洲五月婷婷| 影音先锋亚洲一区| 欧美视频在线观看| 久久精品天堂| 一区二区三区偷拍| 欧美不卡视频| 欧美一区二区视频在线观看| 亚洲国产精品尤物yw在线观看 | 欧美天堂亚洲电影院在线观看| 亚洲一区二区成人| 亚洲国产成人精品久久久国产成人一区| 99国产精品久久久久老师| 国产欧美日韩精品一区| 欧美成人亚洲| 欧美一区二区三区免费观看| 亚洲激精日韩激精欧美精品| 久久精品国产第一区二区三区最新章节 | 久久av一区二区三区亚洲| 在线精品一区二区| 国产欧美日韩激情| 欧美性天天影院| 欧美成人国产| 久久国产一区二区| 亚洲影院免费观看| 亚洲精品乱码| 欧美激情精品久久久久久大尺度| 久久av资源网站| 亚洲深爱激情| 日韩一区二区精品视频| 亚洲福利一区| 樱桃视频在线观看一区| 国产乱码精品一区二区三| 欧美日韩一二三四五区| 欧美人成免费网站| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲欧美在线磁力| 亚洲一区二区在| 亚洲视频免费在线| 夜夜嗨av色综合久久久综合网| 亚洲高清网站| 欧美国产一区二区| 欧美福利专区| 欧美国产精品v| 欧美电影免费观看网站| 欧美激情一区二区三区在线视频| 美国十次成人| 欧美成年人视频网站| 蜜桃av综合| 欧美顶级艳妇交换群宴| 欧美高清视频一区二区三区在线观看| 欧美一区在线看| 久久精品欧美| 蜜臀99久久精品久久久久久软件| 巨乳诱惑日韩免费av| 欧美国产欧美亚洲国产日韩mv天天看完整| 老司机一区二区| 欧美激情一区二区三区四区| 亚洲国产成人精品女人久久久 | a4yy欧美一区二区三区| 日韩视频永久免费观看| 99精品欧美一区二区三区| 宅男在线国产精品| 亚洲欧美精品在线| 久久久xxx| 欧美激情1区| 一本色道久久综合亚洲精品按摩| 国产精品99久久久久久www| 亚洲欧美激情四射在线日| 欧美在线影院在线视频| 久久综合久久综合久久综合| 欧美精品久久久久久久免费观看| 欧美视频免费看| 精品91视频| 国产精品99久久99久久久二8| 欧美在线观看视频在线| 欧美阿v一级看视频| 艳妇臀荡乳欲伦亚洲一区| 香蕉视频成人在线观看 | 99视频一区二区| 亚洲欧美日本精品| 免费精品99久久国产综合精品| 欧美天天在线| 在线成人欧美| 亚洲免费中文| 欧美成人精品h版在线观看| 亚洲最新在线| 免费日韩视频| 国产欧美精品日韩区二区麻豆天美 | 欧美性理论片在线观看片免费| 韩国av一区二区三区| 99在线热播精品免费| 久久久久久亚洲综合影院红桃| 亚洲精品日韩久久| 久久亚洲综合| 国产精品夜夜夜| 亚洲精品一区二区在线| 久久精品道一区二区三区| 日韩一级裸体免费视频| 免费观看国产成人| 国产一区再线| 亚洲欧美日韩在线播放| 亚洲电影在线| 久久久久久久精| 国产精品美女视频网站| 99热精品在线| 亚洲第一精品电影| 久久婷婷久久|