📄 rokousb.cpp
字号:
// Changed By Abhinav on request by teraoka san ,24/oct/2006
ssStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN;
}
ssStatus.dwCurrentState = dwCurrentState;
ssStatus.dwWin32ExitCode = dwWin32ExitCode;
ssStatus.dwWaitHint = dwWaitHint;
if ( ( dwCurrentState == SERVICE_RUNNING ) ||
( dwCurrentState == SERVICE_STOPPED ) ){
ssStatus.dwCheckPoint = 0;
}else{
ssStatus.dwCheckPoint = dwCheckPoint++;
}
// Report the status of the service to the service control manager.
//
fResult = SetServiceStatus( sshStatusHandle, &ssStatus);
if(!fResult){
/* Erro */
}
return fResult;
}
#ifdef _DEBUG
// The temporary suspension of service and the restart are deleted from the processing object in this application because it doesn't support it.
/****************************************************************************
* FUNCTION : ResumeService
* ABSTRACT : Restart of service
*****************************************************************************/
static BOOL ResumeService()
{
// Stop flag OFF at one o'clock of service
bPauseService = FALSE;
return TRUE;
}
/****************************************************************************
* FUNCTION : PauseService
* ABSTRACT : Suspension of service
*****************************************************************************/
static BOOL PauseService()
{
// Stop flag ON at one o'clock of service
bPauseService = TRUE;
return TRUE;
}
#endif
/****************************************************************************
* FUNCTION : StopService
* ABSTRACT : Stop of service
*****************************************************************************/
static VOID StopService()
{
// Service beginning flag OFF
bRunningService = FALSE;
// Set the event that is holding ServiceMain
// so that ServiceMain can return
pSrv->SetStopEvent();
}
/****************************************************************************
* FUNCTION : CmdInstallService
* ABSTRACT : Service is registered to the service control manager.
* NOTE : None
* RETURN : None
* CREATE : 2004/09/30
***************************************************************************/
void CmdInstallService()
{
// LOG_DBG(_T("Start"));
SC_HANDLE schService;
SC_HANDLE schSCManager;
TCHAR szPath[512];
if ( GetModuleFileName( NULL, szPath, 512 ) == 0 )//NULL ==path of the executable file of the current process.
{
// LOG_ERR(_T("GetModuleFileName failed"));
_tprintf(TEXT("Unable to install %s - %s\n"), pSrv->GetServiceDisplayName(), GetLastErrorText(szErr, 256));
return;
}
schSCManager = OpenSCManager(
NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if ( !schSCManager )
{
// LOG_ERRC(_T("OpenSCManager failed"),GetLastError());
_tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(szErr,256));
return;
}
schService = CreateService(
schSCManager, // SCManager database
pSrv->GetServiceName(), // name of service
pSrv->GetServiceDisplayName(), // name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
szPath, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
pSrv->GetDependencies(), // dependencies
NULL, // LocalSystem account
NULL); // no password
if( schService )
{
CloseServiceHandle(schService);
_tprintf(TEXT("%s installed.\n"), pSrv->GetServiceDisplayName() );
}else{
// LOG_ERRC(_T("CreateService failed"),GetLastError());
_tprintf(TEXT("CreateService failed - %s\n"), GetLastErrorText(szErr, 256));
}
CloseServiceHandle(schSCManager);
// LOG_DBG(_T("Stop"));
}
/****************************************************************************
* FUNCTION : CmdRemoveService
* ABSTRACT : Service is deleted from the service control manager.
* NOTE : None
* RETURN : None
* CREATE : 2004/09/30
***************************************************************************/
void CmdRemoveService()
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
// LOG_DBG(_T("Start"));
schSCManager = OpenSCManager(
NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if ( schSCManager )
{
schService = OpenService(schSCManager, pSrv->GetServiceName(), SERVICE_ALL_ACCESS);
if (schService)
{
// try to stop the service
if ( ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus ) )
{
_tprintf(TEXT("Stopping %s."), pSrv->GetServiceDisplayName());
Sleep( 1000 );
while ( QueryServiceStatus( schService, &ssStatus ) )
{
if ( ssStatus.dwCurrentState == SERVICE_STOP_PENDING )
{
_tprintf(TEXT("."));
Sleep( 1000 );
}else{
break;
}
}
if ( ssStatus.dwCurrentState == SERVICE_STOPPED ){
//Service stop
_tprintf(TEXT("\n%s stopped.\n"), pSrv->GetServiceDisplayName() );
}else{
//Service is operating.
_tprintf(TEXT("\n%s failed to stop.\n"), pSrv->GetServiceDisplayName() );
}
}
// now remove the service
if ( DeleteService(schService) ){
//Service deletion success
_tprintf(TEXT("%s removed.\n"), pSrv->GetServiceDisplayName() );
}else{
//Service deletion failure
_tprintf(TEXT("DeleteService failed - %s\n"), GetLastErrorText(szErr,256));
}
CloseServiceHandle(schService);
}else{
//Fatal error
_tprintf(TEXT("OpenService failed - %s\n"), GetLastErrorText(szErr,256));
}
CloseServiceHandle(schSCManager);
}else{
//Fatal error
_tprintf(TEXT("OpenSCManager failed - %s\n"), GetLastErrorText(szErr,256));
}
// LOG_DBG(_T("Stop"));
}
/****************************************************************************
* FUNCTION : CmdDebugService
* ABSTRACT : Start of service at debug mode
* NOTE : None
* RETURN : None
* CREATE : 2004/09/30
***************************************************************************/
void CmdDebugService(
int argc, /* (I) Number of parameters */
TCHAR ** argv /* (I) Array of character string including argument */
)
{
DWORD dwArgc;
LPTSTR *lpszArgv;
dwArgc = (DWORD) argc;
lpszArgv = argv;
_tprintf(TEXT("Debugging %s.\n"), pSrv->GetServiceDisplayName());
//Registration of control handler
SetConsoleCtrlHandler( ControlHandler, TRUE );
//Service main start
service_main();
}
/****************************************************************************
* FUNCTION : ControlHandler
* ABSTRACT : Service control handler at debug mode
* NOTE : None
* RETURN : BOOL宆
* CREATE : 2004/09/30
***************************************************************************/
BOOL WINAPI ControlHandler (
DWORD dwCtrlType /* (I) Control code */
)
{
switch ( dwCtrlType )
{
case CTRL_BREAK_EVENT: // use Ctrl+C or Ctrl+Break to simulate
case CTRL_C_EVENT: // SERVICE_CONTROL_STOP in debug mode
_tprintf(TEXT("Stopping %s.\n"), pSrv->GetServiceDisplayName());
//The service stop event is set.
StopService();
return TRUE;
break;
}
return FALSE;
}
/****************************************************************************
* FUNCTION : GetLastErrorText
* ABSTRACT : Making of error message
* NOTE : None
* RETURN : LPTSTR type
* CREATE : 2004/09/30
***************************************************************************/
LPTSTR GetLastErrorText(
LPTSTR lpszBuf, /* (I/O) Pointer of message content*/
DWORD dwSize /* (I) Number of message characters */
)
{
DWORD dwRet;
LPTSTR lpszTemp = NULL;
dwRet = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
NULL,
::GetLastError(),
LANG_NEUTRAL,
(LPTSTR)&lpszTemp,
0,
NULL );
// supplied buffer is not long enough
if ( !dwRet || ( (long)dwSize < (long)dwRet+14 ) ){
lpszBuf[0] = TEXT('\0');
}else{
lpszTemp[lstrlen(lpszTemp)-2] = TEXT('\0'); //remove cr and newline character
_stprintf_s( lpszBuf, dwSize, TEXT("%s (0x%x)"), lpszTemp, ::GetLastError() );
}
if ( lpszTemp ){
LocalFree((HLOCAL) lpszTemp );
}
return lpszBuf;
}
//#endif // _DEBUG
/**************************************************************
* FUNCTION : RegisterForDeviceNotify
* ABSTRACT : Register for Device Change Notification
* NOTE : None
* RETURN : VOID type
* CREATE : 2007/10/22
**************************************************************/
static BOOL RegisterForDeviceNotify(SERVICE_STATUS_HANDLE ssHandle)
{
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
char szMsg[80];
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USB;
HDEVNOTIFY hDevNotify = RegisterDeviceNotification( ssHandle,&NotificationFilter,DEVICE_NOTIFY_SERVICE_HANDLE);
if(!hDevNotify)
{
wsprintf(szMsg, "RegisterDeviceNotification failed: %d\n",
GetLastError());
MessageBox(hWnd, szMsg, "Registration", MB_OK);
return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -