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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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 楊粼波 閱讀(546) 評論(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>
            免费一级欧美片在线播放| 久久久999精品视频| 亚洲精品日韩一| 亚洲精品影视在线观看| 亚洲精品视频中文字幕| 日韩视频免费观看高清完整版| 在线观看欧美黄色| 亚洲精选中文字幕| 中文在线资源观看视频网站免费不卡| 中文亚洲字幕| 久久亚洲私人国产精品va媚药| 久久先锋资源| 亚洲福利av| 欧美 日韩 国产一区二区在线视频 | 在线免费观看视频一区| 亚洲精品国产视频| 亚洲综合色网站| 欧美承认网站| 亚洲午夜激情免费视频| 久久精品国产一区二区电影 | 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 欧美日一区二区三区在线观看国产免| 免费亚洲视频| 一区二区av| 欧美成人黑人xx视频免费观看| 国产精品久久久久久五月尺| 在线日韩视频| 亚洲免费福利视频| 一本色道久久88亚洲综合88| 久久久久在线| 亚洲欧美日韩精品久久亚洲区 | 亚洲乱亚洲高清| 久久全国免费视频| 狠狠色狠狠色综合| 欧美在线免费观看亚洲| 中日韩美女免费视频网站在线观看| 久久国产视频网| 国产女主播一区二区| 日韩午夜黄色| 99riav久久精品riav| 男女激情视频一区| 91久久综合亚洲鲁鲁五月天| 你懂的视频欧美| 欧美亚洲日本一区| 亚洲尤物视频在线| 国产偷久久久精品专区| 久久国产日本精品| 久久国产精品99国产精| 黄色成人在线网站| 欧美激情1区2区| 欧美婷婷久久| 99视频一区| 91久久精品一区| 欧美日韩综合在线| 性做久久久久久| 久久天天躁夜夜躁狠狠躁2022| 伊人天天综合| 国产在线视频不卡二| 久久综合亚州| 国产精品国产精品国产专区不蜜| 午夜精品美女自拍福到在线| 久久国产一二区| 夜夜嗨av一区二区三区网站四季av| 99国内精品久久| 国产精品丝袜91| 亚洲人成网站影音先锋播放| 国产精品久久久久久福利一牛影视| 久久一区二区三区四区| 欧美日韩国产一区二区| 久久精品国产精品| 国产精品s色| 欧美黄色小视频| 好看不卡的中文字幕| 日韩一级成人av| 亚洲国产一区二区三区在线播| 亚洲伦伦在线| 亚洲激情国产| 久久久噜噜噜| 亚洲欧美综合精品久久成人| 欧美一区二区私人影院日本| 一本色道**综合亚洲精品蜜桃冫 | 亚洲人妖在线| 亚洲国产精品国自产拍av秋霞| 午夜免费久久久久| 亚洲欧美日本国产专区一区| 欧美日韩国产高清| 91久久视频| 日韩亚洲一区二区| 欧美黄色免费| 亚洲免费观看视频| 艳女tv在线观看国产一区| 亚欧成人在线| 国产伦精品一区二区| 午夜国产精品视频| 久久久91精品国产| 亚洲高清在线播放| 欧美精品在线一区二区| 亚洲最快最全在线视频| 亚洲性感激情| 国外成人在线视频网站| 久久亚洲影音av资源网| 一本久久精品一区二区| 欧美一区三区三区高中清蜜桃| 国产亚洲欧美一区二区三区| 久久久久久免费| 欧美国产视频在线| 亚洲高清在线观看一区| 国产精品国产精品| 蜜桃久久精品乱码一区二区| 艳妇臀荡乳欲伦亚洲一区| 免费黄网站欧美| 欧美专区在线播放| 亚洲午夜精品视频| 91久久久久久| 国精品一区二区| 国产精品国产成人国产三级| 久久精品国内一区二区三区| 亚洲精品综合精品自拍| 裸体女人亚洲精品一区| 亚洲欧美资源在线| 中文av字幕一区| 亚洲精品国产视频| 99国内精品久久久久久久软件| 在线精品国产成人综合| 国产真实久久| 国产主播精品| 在线欧美日韩国产| 在线日韩一区二区| 亚洲人午夜精品免费| 亚洲精品国产精品国产自| 亚洲日本一区二区三区| 亚洲精品视频在线观看网站 | 亚洲欧美美女| 欧美一区二区三区免费观看| 欧美一区二区三区喷汁尤物| 午夜精品福利在线观看| 久久国产精品久久国产精品| 久久成人精品无人区| 久久一区亚洲| 欧美日韩成人在线观看| 国产精品麻豆成人av电影艾秋| 国产精品久久久久久久久果冻传媒| 欧美三级午夜理伦三级中视频| 国产精品久久网| 在线成人激情视频| 一区电影在线观看| 欧美在线关看| 亚洲高清在线精品| 亚洲伊人网站| 欧美二区在线观看| 国产手机视频一区二区| 亚洲麻豆av| 美女诱惑一区| 亚洲中午字幕| 欧美极品欧美精品欧美视频| 国产麻豆91精品| 亚洲日韩中文字幕在线播放| 国产精品99久久久久久有的能看 | 久久久免费精品| 国产精品一级二级三级| 狠狠v欧美v日韩v亚洲ⅴ| 99视频精品在线| 久久精品欧美| 欧美成人午夜| 免费h精品视频在线播放| 美国十次了思思久久精品导航| 午夜精品久久久99热福利| 欧美一区二区三区婷婷月色| 欧美激情五月| 久久激情一区| 一区二区欧美激情| 免费久久99精品国产自| 麻豆精品精华液| 久久精品五月婷婷| 国产午夜精品理论片a级探花| 亚洲日本免费| 亚洲国产综合91精品麻豆| 一本色道久久综合一区| 国产精品国产a| 亚洲人永久免费| 国产欧美精品xxxx另类| 在线亚洲一区二区| 欧美激情精品久久久久久久变态| 性欧美超级视频| 亚洲精品久久久久久久久| 久久国产高清| 久久天天躁夜夜躁狠狠躁2022 | 亚洲美女啪啪| 欧美一区二区视频在线观看| 欧美日韩国产小视频| 欧美午夜精品久久久久久久| 国产精品免费一区二区三区在线观看 | 亚洲第一免费播放区| 一本色道久久精品| 欧美激情一区二区三区高清视频| 亚洲毛片在线观看| 欧美精品www在线观看| 亚洲国产精品久久久久| 欧美高清视频在线播放| 国产精品高潮呻吟久久|