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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            欧美中文字幕在线视频| 亚洲欧美中文日韩v在线观看| 欧美一级久久久| 久热爱精品视频线路一| 亚洲愉拍自拍另类高清精品| 国产一区二区三区的电影| 国产精品国产三级国产专播精品人 | 亚洲男人av电影| 亚洲视屏在线播放| 亚洲成色www8888| 一区久久精品| 欧美激情日韩| 日韩亚洲视频| 欧美一级在线亚洲天堂| 国产精品久久久久免费a∨| 在线亚洲自拍| 久久精品国产清自在天天线| 亚洲一区二区三区免费视频| 在线精品一区| 欧美日韩另类在线| 欧美激情综合五月色丁香| 欧美激情一二三区| 欧美精品1区| 中文在线不卡| 久久aⅴ乱码一区二区三区| 久久免费精品视频| 亚洲欧美色一区| 欧美激情视频一区二区三区在线播放 | 在线性视频日韩欧美| 欧美日韩国产综合新一区| 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲影院高清在线| 欧美亚洲色图校园春色| 久久精品日产第一区二区| 午夜激情一区| 欧美激情中文字幕乱码免费| 在线视频欧美日韩| 久久一区二区三区四区五区| 国产精品日韩在线播放| 一本色道久久综合亚洲二区三区| 亚洲国产视频一区| 在线免费观看成人网| 国内成人精品一区| 国产日韩欧美a| 99re8这里有精品热视频免费| 久久久精品一区| 在线亚洲美日韩| 亚洲欧美卡通另类91av| 亚洲午夜国产一区99re久久 | 99成人免费视频| 一区二区三区日韩欧美| 久久久久亚洲综合| 免费在线看成人av| 国产亚洲在线| 欧美在线高清视频| 亚洲午夜精品| 欧美日韩精品是欧美日韩精品| 国内精品一区二区三区| 久久精品最新地址| 久久精品国产69国产精品亚洲 | 麻豆久久精品| 在线观看91久久久久久| 国模精品娜娜一二三区| 国产精品在线看| 亚洲一区欧美| 久久亚洲国产成人| 欧美成人精品一区| 狂野欧美激情性xxxx| 欧美日韩国产123区| 欧美日韩国产经典色站一区二区三区| 欧美成人中文字幕| 另类酷文…触手系列精品集v1小说| 久久久久久久波多野高潮日日| 欧美在线视频免费播放| 国产无遮挡一区二区三区毛片日本| 欧美在线免费视频| 久久xxxx| 欧美日韩在线精品| 亚洲一区精品电影| 亚洲亚洲精品三区日韩精品在线视频 | 91久久黄色| 亚洲午夜视频在线观看| 久久久久看片| 欧美日韩和欧美的一区二区| 国产欧美韩国高清| 久久久免费精品视频| 美女精品在线| 亚洲一区二区免费在线| 欧美顶级艳妇交换群宴| 欧美精品大片| 精品999日本| 亚洲欧美日韩综合国产aⅴ| 亚洲欧美视频在线观看| 在线观看成人小视频| 亚洲精品欧洲| 狠狠色丁香久久综合频道| 亚洲男人av电影| 欧美一区二区三区在线观看| 亚洲国内自拍| 香蕉免费一区二区三区在线观看| 欧美精品七区| 久久精品一本久久99精品| 久久婷婷麻豆| 性刺激综合网| 亚洲一区二区三区四区五区黄| 久久综合久久久| 日韩一级精品视频在线观看| 欧美高清在线| 久久久一区二区三区| 一本色道久久综合亚洲精品小说| 欧美中文字幕| 精品动漫一区二区| 久久国产夜色精品鲁鲁99| 一区二区三区久久网| 欧美黄色aaaa| 亚洲国产另类精品专区| 亚洲一区二区精品在线| 亚洲美女啪啪| 日韩一区二区电影网| 欧美精品福利视频| 亚洲精品一区二区在线观看| 亚洲免费在线观看| 国产亚洲精品美女| 一区二区三区成人精品| 国产精品免费观看视频| 最新中文字幕一区二区三区| 在线视频国产日韩| 牛夜精品久久久久久久99黑人| 一区二区三区波多野结衣在线观看| 国产精品一区二区三区久久 | 午夜精品久久久久| 欧美三级电影一区| 亚洲午夜精品一区二区| 久久男人资源视频| 亚洲精品中文字幕在线| 久久久久久九九九九| 亚洲理论电影网| 99视频在线观看一区三区| 国产精品日韩在线一区| 一本到高清视频免费精品| 一区二区三区毛片| 欧美视频观看一区| 久久久精品欧美丰满| 国产嫩草影院久久久久| 久久婷婷久久| 狠狠综合久久av一区二区小说 | 久久精品国产亚洲a| 久久久久国产一区二区三区四区| 欧美午夜激情视频| 国自产拍偷拍福利精品免费一| 亚洲三级电影全部在线观看高清| 亚洲高清电影| 免费视频久久| 欧美日本高清| 欧美在线国产| 国产日韩欧美综合精品| 欧美一级一区| 欧美成人精品1314www| 亚洲精选国产| 欧美自拍偷拍午夜视频| 美女主播视频一区| 99视频有精品| 国产视频久久| 亚洲一区久久| 久久一区二区三区av| 亚洲日本va午夜在线电影| 国产精品久久久久9999高清| 久久gogo国模裸体人体| 亚洲国产婷婷香蕉久久久久久99 | 一区二区三区免费网站| 久久精品人人做人人爽| 亚洲丁香婷深爱综合| 欧美午夜免费影院| 亚洲第一级黄色片| 亚洲视频网站在线观看| 猛干欧美女孩| 久久久精品免费视频| 国产精品激情| 亚洲久久成人| 99re在线精品| 国产一区av在线| 性视频1819p久久| 亚洲风情在线资源站| 久久精品一级爱片| 一区二区三区四区国产| 在线不卡中文字幕播放| 久久爱91午夜羞羞| 欧美一区二区视频免费观看| 伊人蜜桃色噜噜激情综合| 欧美福利小视频| 欧美一区二区私人影院日本| 亚洲激情视频在线| 亚洲精品四区| 国精产品99永久一区一区| 欧美日韩在线视频观看| 免费高清在线一区| 久久九九99视频| 女仆av观看一区| 亚洲东热激情| 国产一区二区0|