ntdriver.cpp

来自「近来看《windows驱动开发技术详解》, 照着书上做了一个加载和卸载驱动的小工」· C++ 代码 · 共 163 行

CPP
163
字号

/********************************************************************

Copyright 2006-2008 ZHANG Luduo. All Rights Reserved.

Permission to use, copy, modify, distribute and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and
that both that copyright notice and this permission notice appear
in supporting documentation.

********************************************************************/

/*
代码描述 : 

	功能:NT式驱动的动态加载与卸载.
	大部分源码参考了WinIo库, 同时也参考
	了<Windows驱动开发技术详解>一书中71页, 同时

代码作者:

	姓名  - 张鲁夺, ZHANG Luduo
	MSN   - zhangluduo@msn.com
	Email - zhangluduo@163.com
	QQ群  - 34064264, 56918155, 56918241
	网站  - http://www.oopfans.com

	为所有爱我的人和我爱的人努力!
*/

#include "stdafx.h"
#include "NTDriver.h"
#include <Winsvc.h>

bool InstallDriver(TCHAR* szDriverFileName, TCHAR* szServicesName)
{
	SC_HANDLE hSCManager = NULL;
	SC_HANDLE hService = NULL;

	// Remove any previous instance of the driver
	RemoveDriver(szServicesName);

	hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

	if (hSCManager)
	{
		hService = CreateService(hSCManager,
			szServicesName,
			szServicesName,
			SERVICE_ALL_ACCESS,
			SERVICE_KERNEL_DRIVER,
			SERVICE_DEMAND_START,
			SERVICE_ERROR_NORMAL,
			szDriverFileName,
			NULL,
			NULL,
			NULL,
			NULL,
			NULL);

		CloseServiceHandle(hSCManager);

		if (NULL == hService)
			return false;
	}
	else
		return false;

	CloseServiceHandle(hService);

	return true;
}

bool RemoveDriver(TCHAR* szServicesName)
{
	SC_HANDLE hSCManager = NULL;
	SC_HANDLE hService = NULL;
	bool bResult = false;
	
	StopDriver(szServicesName);
	
	hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	
	if (hSCManager)
	{
		hService = OpenService(hSCManager, szServicesName, SERVICE_ALL_ACCESS);
		
		CloseServiceHandle(hSCManager);
		
		if (hService)
		{
			bResult = DeleteService(hService) == 0 ? false : true;
			
			CloseServiceHandle(hService);
		}
		else
			return false;
	}
	else
		return false;
	
	return bResult;
}

bool StartDriver(TCHAR* szServicesName)
{
	SC_HANDLE hSCManager = NULL;
	SC_HANDLE hService = NULL;
	bool bResult = false;

	hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

	if (hSCManager)
	{
		hService = OpenService(hSCManager, szServicesName, SERVICE_ALL_ACCESS);
		CloseServiceHandle(hSCManager);

		if (hService)
		{
			bResult = StartService(hService, 0, NULL) || 
				GetLastError() == ERROR_SERVICE_ALREADY_RUNNING;
			CloseServiceHandle(hService);
		}
		else
			return false;
	}
	else
		return false;

	return bResult;
}

bool StopDriver(TCHAR* szServicesName)
{
	SC_HANDLE hSCManager = NULL;
	SC_HANDLE hService = NULL;
	bool bResult = false;
	SERVICE_STATUS ServiceStatus = { 0 };

	hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	
	if (hSCManager)
	{
		hService = OpenService(hSCManager, szServicesName, SERVICE_ALL_ACCESS);
		
		CloseServiceHandle(hSCManager);
		
		if (hService)
		{
			bResult = ControlService(hService, SERVICE_CONTROL_STOP, 
				&ServiceStatus) == 0 ? false : true;
			
			CloseServiceHandle(hService);
		}
		else
			return false;
	}
	else
		return false;
	
	return bResult;
}

⌨️ 快捷键说明

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