/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1997 by Joerg Koenig and the ADG mbH, Mannheim, Germany
// All rights reserved
//
// Distribute freely, except: don't remove my name from the source or
// documentation (don't take credit for my work), mark your changes (don't
// get me blamed for your possible bugs), don't alter or remove this
// notice.
// No warrantee of any kind, express or implied, is included with this
// software; use at your own risk, responsibility for damages (if any) to
// anyone resulting from the use of this software rests entirely with the
// user.
//
// Send bug reports, bug fixes, enhancements, requests, flames, etc., and
// I'll try to keep a version up to date. I can be reached as follows:
// J.Koenig@adg.de (company site)
// Joerg.Koenig@rhein-neckar.de (private site)
/////////////////////////////////////////////////////////////////////////////
//
// MODIFIED BY TODD C. WILSON FOR THE ROAD RUNNER NT LOGIN SERVICE.
// HOWEVER, THESE MODIFICATIONS ARE BROADER IN SCOPE AND USAGE AND CAN BE USED
// IN OTHER PROJECTS WITH NO CHANGES.
// MODIFIED LINES FLAGGED/BRACKETED BY "//!! TCW MOD"
//
/////////////////////////////////////////////////////////////////////////////
// last revised: $Date: 11.05.98 21:09 $, $Revision: 3 $
/////////////////////////////////////////////////////////////////////////////
// Acknoledgements:
// o Thanks to Victor Vogelpoel (VictorV@Telic.nl) for his bug-fixes
// and enhancements.
// o Thanks to Todd C. Wilson (todd@mediatec.com) for the
// "service" on Win95
//
// Changes:
// 01/21/99
// o Bug fixed in "DeregisterApplicationLog()"
// thanks to Grahame Willis (grahamew@questsoftware.com.au):
//
// 04/30/98
// o Added two more switches to handle command line arguments:
// -e will force a running service to stop (corresponding
// method in this class: virtual BOOL EndService();) and
// -s will force the service to start (method:
// virtual BOOL StartupService())
//
// 02/05/98
// o Added the methods "RegisterApplicationLog()" and
// "DeregisterApplicationLog()" (both virtual). The first one will be
// called from "InstallService()" and creates some registry-entries
// for a better event-log. The second one removes these entries when
// the service will uninstall (see "RemoveService()")
// o The service now obtains the security identifier of the current user
// and uses this SID for event-logging.
// o The memory allocated by "CommandLineToArgvW()" will now release
// (UNICODE version only)
// o The service now uses a simple message catalogue for a nicer
// event logging
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <crtdbg.h>
#include <io.h> //!! TCW MOD
#include <fcntl.h> //!! TCW MOD
#include "NTService.h"
#include "NTServiceEventLogMsg.h"
#ifndef RSP_SIMPLE_SERVICE
#define RSP_SIMPLE_SERVICE 1
#endif
#ifndef RSP_UNREGISTER_SERVICE
#define RSP_UNREGISTER_SERVICE 0
#endif
BOOL CNTService :: m_bInstance = FALSE;
static CNTService * gpTheService = 0; // the one and only instance
CNTService * AfxGetService() { return gpTheService; }
static LPCTSTR gszAppRegKey = TEXT("SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\");
static LPCTSTR gszWin95ServKey=TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\RunServices"); //!! TCW MOD
/////////////////////////////////////////////////////////////////////////////
// class CNTService -- construction/destruction
CNTService :: CNTService( LPCTSTR lpServiceName, LPCTSTR lpDisplayName )
: m_lpServiceName(lpServiceName)
, m_lpDisplayName(lpDisplayName ? lpDisplayName : lpServiceName)
, m_dwCheckPoint(0)
, m_dwErr(0)
, m_bDebug(FALSE)
, m_sshStatusHandle(0)
, m_dwControlsAccepted(SERVICE_ACCEPT_STOP)
, m_pUserSID(0)
, m_fConsoleReady(FALSE)
// parameters to the "CreateService()" function:
, m_dwDesiredAccess(SERVICE_ALL_ACCESS)
, m_dwServiceType(SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS)
, m_dwStartType(SERVICE_AUTO_START)
, m_dwErrorControl(SERVICE_ERROR_NORMAL)
, m_pszLoadOrderGroup(0)
, m_dwTagID(0)
, m_pszDependencies(0)
, m_pszStartName(0)
, m_pszPassword(0)
, m_pszConfigFile(0)
, m_pszDescription(0)
{
_ASSERTE( ! m_bInstance );
OSVERSIONINFO vi;
vi.dwOSVersionInfoSize=sizeof(vi); // init this.
GetVersionEx(&vi); //lint !e534
m_bWinNT = (vi.dwPlatformId == VER_PLATFORM_WIN32_NT);
m_bInstance = TRUE;
gpTheService = this;
// SERVICE_STATUS members that rarely change
m_ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
m_ssStatus.dwServiceSpecificExitCode = 0;
if( m_bWinNT ) {
/////////////////////////////////////////////////////////////////////////
// Providing a SID (security identifier) was contributed by Victor
// Vogelpoel (VictorV@Telic.nl).
// The code from Victor was slightly modified.
// Get security information of current user
BYTE security_identifier_buffer[ 4096 ];
DWORD dwSizeSecurityIdBuffer = sizeof( security_identifier_buffer );
PSID user_security_identifier = NULL;
TCHAR sUserName[ 256 ];
DWORD dwSizeUserName = 255;
TCHAR sDomainName[ 256 ];
DWORD dwSizeDomainName = 255;
SID_NAME_USE sidTypeSecurityId;
::ZeroMemory( sUserName, sizeof( sUserName ) );
::ZeroMemory( sDomainName, sizeof( sDomainName ) );
::ZeroMemory( security_identifier_buffer, dwSizeSecurityIdBuffer );
::GetUserName( sUserName, &dwSizeUserName );
if( ::LookupAccountName(
0,
sUserName,
&security_identifier_buffer,
&dwSizeSecurityIdBuffer,
sDomainName,
&dwSizeDomainName,
&sidTypeSecurityId
)) {
if( ::IsValidSid( PSID(security_identifier_buffer) ) ) {
DWORD dwSidLen = ::GetLengthSid(PSID(security_identifier_buffer));
m_pUserSID = PSID(new BYTE [dwSidLen]);
::CopySid(dwSidLen, m_pUserSID, security_identifier_buffer);
_ASSERTE(::EqualSid(m_pUserSID, security_identifier_buffer));
}
}
}
/////////////////////////////////////////////////////////////////////////
}
CNTService :: ~CNTService() {
_ASSERTE( m_bInstance );
delete [] LPBYTE(m_pUserSID);
m_bInstance = FALSE;
gpTheService = 0;
}
/////////////////////////////////////////////////////////////////////////////
// class CNTService -- overridables
#define NEXT_ARG ((((*Argv)[2])==TEXT('\0'))?(--Argc,*++Argv):(*Argv)+2)
BOOL CNTService :: RegisterService( int argc, char ** argv ) {
BOOL (CNTService::* fnc)() = &CNTService::StartDispatcher;
DWORD Argc;
LPTSTR * Argv;
#ifdef UNICODE
Argv = CommandLineToArgvW(GetCommandLineW(), &Argc );
#else
Argc = (DWORD) argc;
Argv = argv;
#endif
while( ++Argv, --Argc ) {
if( Argv[0][0] == TEXT('-') ) {
switch( Argv[0][1] ) {
case TEXT('i'): // install the service
fnc = &CNTService::InstallService;
break;
case TEXT('l'): // login-account (only useful with -i)
m_pszStartName = NEXT_ARG;
break;
case TEXT('p'): // password (only useful with -i)
m_pszPassword = NEXT_ARG;
break;
case TEXT('c'): // configure file (only useful with -i)
m_pszConfigFile = NEXT_ARG;
break;
case TEXT('u'): // uninstall the service
fnc = &CNTService::RemoveService;
break;
case TEXT('s'): // start the service
fnc = &CNTService::StartupService;
break;
case TEXT('e'): // end the service
fnc = &CNTService::EndService;
break;
case TEXT('d'): // debug the service
case TEXT('f'): //!! TCW MOD faceless non-service (Win95) mode
#ifdef UNICODE
::GlobalFree(HGLOBAL)Argv);
#endif
m_bDebug = TRUE;
// pass original parameters to DebugService()
return DebugService(argc, argv,(Argv[0][1]==TEXT('f'))); //!! TCW MOD faceless non-ser
没有合适的资源?快使用搜索试试~ 我知道了~
一个用于创建服务的类
共32个文件
cpp:5个
h:4个
dsp:3个
需积分: 0 8 下载量 184 浏览量
2008-12-29
15:46:32
上传
评论
收藏 40KB RAR 举报
温馨提示
一个用于创建服务的类, 只需在派生类中实现Run和Stop函数即可。
资源详情
资源评论
资源推荐
收起资源包目录
ntservice.rar (32个子文件)
ntservice_sample_project
stdafx.cpp 19B
ServiceSample.001 7KB
NTServiceEventLogMsg.rc 37B
ServiceSample.vcproj.COOLSAND-TECH.lix.user 2KB
stdafx.h 43B
ServiceSample.dsw 748B
NTService.h 13KB
MFCService.vcproj 7KB
vssver2.scc 832B
ServiceApp.cpp 2KB
ServiceApp.h 1KB
MFCService.plg 1017B
MFCService.dsp 5KB
MFCService.vcproj.COOLSAND-TECH.lix.user 1KB
MSG00000.bin 100B
ServiceSample.opt 59KB
ServiceSample.dsp 7KB
ServiceSample.mak 8KB
Win95Service.dsp 3KB
NTServiceEventLogMsg.h 2KB
main.cpp 3KB
MFCNTService.cpp 45B
ServiceSample.002 7KB
mssccprj.scc 721B
NTServiceEventLogMsg.mc 1KB
ServiceSample.suo 15KB
Win95Service.dsw 549B
ServiceSample.sln 2KB
NTService.cpp 33KB
ServiceSample.vcproj 9KB
ServiceSample.vcproj.vspscc 256B
MFCService.001 5KB
共 32 条
- 1
dulinbo
- 粉丝: 16
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0