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

📄 instdrv.c

📁 Windows DDK编写的虚拟磁盘驱动程序源代码
💻 C
字号:
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

BOOL InstallDriver(__in SC_HANDLE SchSCManager, __in LPCTSTR DriverName, __in LPCTSTR ServiceExe)
{
	SC_HANDLE schService;
	DWORD err;

	schService = CreateService(SchSCManager,DriverName, DriverName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
					SERVICE_ERROR_NORMAL, ServiceExe, NULL, NULL, NULL, NULL, NULL);

	if(NULL == schService)
	{
		err = GetLastError();
		if(ERROR_SERVICE_EXISTS == err)
			return TRUE;
		return FALSE;
	}
	else
	{
		CloseServiceHandle(schService);
		return TRUE;
	}
}

BOOL RemoveDriver(__in SC_HANDLE SchSCManager, __in LPCTSTR DriverName)
{
	SC_HANDLE schService;
	BOOL ret;

	schService = OpenService(SchSCManager, DriverName, SERVICE_ALL_ACCESS);

	if(NULL == schService)
		return FALSE;

	ret = DeleteService(schService);
	CloseServiceHandle(schService);

	return ret;
}

BOOL StartDriver(__in SC_HANDLE SchSCManager, __in LPCTSTR DriverName)
{
	SC_HANDLE schService;
	BOOL ret;

	schService = OpenService(SchSCManager, DriverName, SERVICE_ALL_ACCESS);
	if(NULL == schService)
		return FALSE;

	ret = StartService(schService, 0, NULL) || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING;
	CloseServiceHandle(schService);

	return ret;
}

BOOL StopDriver(__in SC_HANDLE SchSCManager, __in LPCTSTR DriverName)
{
	SC_HANDLE schService;
	BOOL ret;
	SERVICE_STATUS serviceStatus;

	schService = OpenService(SchSCManager, DriverName, SERVICE_ALL_ACCESS);
	if(NULL == schService)
		return FALSE;

	ret = ControlService(schService, SERVICE_CONTROL_STOP, &serviceStatus);
	CloseServiceHandle(schService);

	return ret;
}

BOOL OpenDevice(__in LPCTSTR DriverName, __in HANDLE * lphDevice)
{
	TCHAR completeDeviceName[64];
	HANDLE hDevice;

	/* NT5, XP及以上 */
	if((GetVersion() & 0xff) >= 5)
		wsprintf(completeDeviceName, _T("\\\\.\\Global\\%s"), DriverName);
	else
		wsprintf(completeDeviceName, _T("\\\\.\\%s"), DriverName);

	hDevice = CreateFile(completeDeviceName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if(INVALID_HANDLE_VALUE == hDevice)
		return FALSE;

	if(lphDevice)
		*lphDevice = hDevice;
	else
		CloseHandle(hDevice);

	return TRUE;
}

BOOL LoadDeviceDriver(const TCHAR * Name, const TCHAR * Path, HANDLE * lphDevice, PDWORD Error)
{
	SC_HANDLE schSCManager;
	BOOL ret;

	schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

	RemoveDriver(schSCManager, Name);
	InstallDriver(schSCManager, Name, Path);
	StartDriver(schSCManager, Name);

	ret = OpenDevice(Name, lphDevice);
	*Error = GetLastError();
 	CloseServiceHandle(schSCManager);

	return ret;
}

BOOL UnLoadDriver(const TCHAR * Name)
{
	SC_HANDLE schSCManager;

	schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

	StopDriver(schSCManager, Name);
	RemoveDriver(schSCManager, Name);
	CloseServiceHandle(schSCManager);

	return TRUE;
}

⌨️ 快捷键说明

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