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

📄 helper.cpp

📁 windows driver model开发的一个例子程序,适合初学者使用
💻 CPP
字号:
// Helper.cpp -- Implementation of CHelper class
// Copyright (C) 1999 by Walter Oney
// All rights reserved

#include "stdafx.h"
#include <winsvc.h>
#include "Helper.h"

#include <winioctl.h>
#include "..\sys\ioctls.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CHelper theHelper;				// the one and only CHelper object

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

CHelper::CHelper()
	{							// CHelper::CHelper
	m_hservice = NULL;
	m_hdriver = INVALID_HANDLE_VALUE;
	}							// CHelper::CHelper

CHelper::~CHelper()
	{							// CHelper::~CHelper
	if (m_hdriver != INVALID_HANDLE_VALUE)
		{						// close handle to driver
		CloseHandle(m_hdriver);
		m_hdriver = INVALID_HANDLE_VALUE;
		}						// close handle to driver

	if (m_hservice)
		{						// halt and delete service
		SERVICE_STATUS status;
		ControlService(m_hservice, SERVICE_CONTROL_STOP, &status);
		DeleteService(m_hservice);
		CloseServiceHandle(m_hservice);
		m_hservice = NULL;
		}						// halt and delete service
	}							// CHelper::~CHelper

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

BOOL CHelper::Initialize(LPCTSTR name)
	{							// CHelper::Initialize
	TCHAR devname[_MAX_PATH];
	_tcscpy(devname, _T("\\\\.\\"));
	_tcscat(devname, name);
	
	SC_HANDLE hsc = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (hsc)
		{						// start service

		// Construct the name of the helper driver

		TCHAR pathname[MAX_PATH];
//		GetWindowsDirectory(pathname, arraysize(pathname));
//		_tcscat(pathname, _T("\\system32\\drivers\\"));
		_tcscpy(pathname, _T("system32\\drivers\\"));
		_tcscat(pathname, name);
		_tcscat(pathname, _T(".sys"));

		m_hservice = CreateService(hsc, name, _T("Helper Driver"),
			SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
			SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE,
			pathname, NULL, NULL, NULL, NULL, NULL);
		if (!m_hservice && GetLastError() == ERROR_SERVICE_EXISTS)
			m_hservice = OpenService(hsc, name, SERVICE_ALL_ACCESS);
		if (m_hservice)
			{						// start service
			if (!StartService(m_hservice, 0, NULL))
				{
				TRACE(_T("StartService failed - %d\n"), GetLastError());
				return FALSE;
				}
			}						// start service
		else
			TRACE(_T("CreateService/OpenService failed - %d\n"), GetLastError());

		CloseServiceHandle(hsc);
		}						// start service

	m_hdriver = CreateFile(devname, GENERIC_READ | GENERIC_WRITE, 0,
		NULL, OPEN_EXISTING, 0, NULL);

	if (m_hdriver == INVALID_HANDLE_VALUE && !hsc)
		{						// try to dynamically load VxD
		_tcscat(devname, _T(".vxd"));
		m_hdriver = CreateFile(devname, 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL);
		}						// try to dynamically load VxD

	if (m_hdriver == INVALID_HANDLE_VALUE)
		{
		TRACE(_T("CreateFile failed - %d\n"), GetLastError());
		return FALSE;
		}

	return TRUE;
	}							// CHelper::Initialize

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

BOOL CHelper::GetEvent(GUID& guid, GUID& event, CString& linkname, DWORD& datasize, LONG& textoffset, PBYTE data)
	{							// CHelper::GetEvent
	GETEVENT_PARAMS params;
	DWORD junk;
	if (!DeviceIoControl(m_hdriver, IOCTL_GETEVENT, NULL, 0, &params, sizeof(params), &junk, NULL))
		return FALSE;

	guid = params.guid;
	event = params.event;
	linkname = params.linkname;
	datasize = params.datasize;
	textoffset = params.textoffset;
	memcpy(data, params.data, params.datasize);
	
	return TRUE;
	}							// CHelper::GetEvent

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

BOOL CHelper::Register(const GUID* guid, HANDLE hevent)
	{							// CHelper::Register
	REGISTER_PARAMS params;
	params.guid = *guid;
	params.hevent = hevent;
	DWORD junk;
	return DeviceIoControl(m_hdriver, IOCTL_REGISTER, &params, sizeof(params), NULL, 0, &junk, NULL);
	}							// CHelper::Register

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

VOID CHelper::Unregister(const GUID* guid)
	{							// CHelper::Unregister
	UNREGISTER_PARAMS params;
	params.guid = *guid;
	DWORD junk;
	DeviceIoControl(m_hdriver, IOCTL_DEREGISTER, &params, sizeof(params), NULL, 0, &junk, NULL);
	}							// CHelper::Unregister

⌨️ 快捷键说明

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