⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 service.cpp

📁 Programming the Microsoft Windows driver model.2nd 随书光盘。内有很多作者送的实用工具和随书源码。WDM编程
💻 CPP
字号:
// SERVICE.CPP -- Implementation of CService class

// Copyright (C) 1999 by Walter Oney

// All rights reserved



#include "stdafx.h"

#include "service.h"



#ifndef NTSERVICE

	#error This file should only be used in the NT service build!

#endif



#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif



/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



CService::CService(DWORD type, DWORD ControlsAccepted)

	{							// CService::CService

	m_hService = NULL;

	memset(&m_status, 0, sizeof(m_status));

	m_hevDone = NULL;



	m_status.dwServiceType = type;

	m_status.dwControlsAccepted = ControlsAccepted;

	}							// CService::CService



CService::~CService()

	{							// CService::~CService

	if (m_hevDone)

		CloseHandle(m_hevDone);

	}							// CService::~CService



void __stdcall CService::HandlerThunk(CService* service, DWORD ctlcode)

	{							// CService::HandlerThunk

	service->Handler(ctlcode);

	}							// CService::HandlerThunk



void __stdcall CService::ServiceMainThunk(CService* service, DWORD argc, TCHAR* argv[])

	{							// CService::ServiceMainThunk

	service->ServiceMain(argc, argv);

	}							// CService::ServiceMainThunk



/////////////////////////////////////////////////////////////////////////////



void CService::Handler(DWORD ctlcode)

	{							// CService::Handler

	if (ctlcode == SERVICE_CONTROL_STOP)

		{						// stopping service

		SetEvent(m_hevDone);

		m_status.dwCurrentState = SERVICE_STOPPED;

		}						// stopping service



	UpdateStatus();

	}							// CService::Handler



/////////////////////////////////////////////////////////////////////////////



DWORD CService::HandleDeviceChange(DWORD evtype, _DEV_BROADCAST_HEADER* dbhdr)

	{							// CService::HandleDeviceChange

	return NO_ERROR;

	}							// CService::HandleDeviceChange



/////////////////////////////////////////////////////////////////////////////



DWORD CService::HandlePowerEvent(DWORD evtype, DWORD flags)

	{							// CService::HandlePowerEvent

	return NO_ERROR;

	}							// CService::HandlePowerEvent



/////////////////////////////////////////////////////////////////////////////



DWORD __stdcall CService::HandlerExThunk(CService* service, DWORD ctlcode, DWORD evtype, PVOID evdata)

	{							// CService::HandlerExThunk

	switch (ctlcode)

		{						// handle extended notification



	case SERVICE_CONTROL_DEVICEEVENT:

	case SERVICE_CONTROL_HARDWAREPROFILECHANGE:

		return service->HandleDeviceChange(evtype, (_DEV_BROADCAST_HEADER*) evdata);



	case SERVICE_CONTROL_POWEREVENT:

		return service->HandlePowerEvent(evtype, (DWORD) evdata);



	default:

		service->Handler(ctlcode);

		return NO_ERROR;

		}						// handle extended notification

	}							// CService::HandlerExThunk



/////////////////////////////////////////////////////////////////////////////



void CService::Run()

	{							// CService::Run

	WaitForSingleObject(m_hevDone, INFINITE);

	}							// CService::Run



/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////



void CService::ServiceMain(DWORD argc, TCHAR* argv[])

	{							// CService::ServiceMain

	if (!m_hService)

		{

		TRACE(_T("Error %d in RegisterServiceCtrlHandler\n"), GetLastError());

		return;

		}

	

	if (!(m_hevDone = CreateEvent(NULL, FALSE, FALSE, NULL)))

		{

		TRACE(_T("Error %d creating event\n"), GetLastError());

		return;

		}



	m_status.dwCheckPoint = 1;

	m_status.dwWaitHint = 10000;	// 10 seconds

	UpdateStatus(SERVICE_START_PENDING);



	DWORD code = InitService(argc, argv);

	if (code != 0)

		{						// error initializing

		TRACE(_T("Failing service startup with code %d\n"), code);

		UpdateStatus(SERVICE_STOPPED, code);

		return;

		}						// error initializing



	UpdateStatus(SERVICE_RUNNING);



	Run();



	ShutdownService();

	UpdateStatus(SERVICE_STOPPED);

	}							// CService::ServiceMain



///////////////////////////////////////////////////////////////////////////////



void CService::UpdateStatus()

	{							// CService::UpdateStatus

	SetServiceStatus(m_hService, &m_status);

	}							// CService::UpdateStatus



void CService::UpdateStatus(DWORD state, DWORD code /* = 0 */)

	{							// CService::UpdateStatus

	m_status.dwCurrentState = state;

	m_status.dwServiceSpecificExitCode = code;

	m_status.dwWin32ExitCode = code ? ERROR_SERVICE_SPECIFIC_ERROR : 0;



	SetServiceStatus(m_hService, &m_status);

	}							// CService::UpdateStatus

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -