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

📄 domyportio.cpp

📁 Device IO Control MyPortIo.zip
💻 CPP
字号:
#include "stdafx.h"
#include "DoMyPortIo.h"

// 全局的设备句柄
HANDLE hMyPort;

// 安装驱动并启动服务
// lpszDriverPath:  驱动程序路径
// lpszServiceName: 服务名 
BOOL StartDriver(LPCTSTR lpszDriverPath, LPCTSTR lpszServiceName)
{
	SC_HANDLE hSCManager;		// 服务控制管理器句柄
	SC_HANDLE hService;			// 服务句柄
	DWORD dwLastError;
	BOOL bResult = FALSE;		// 返回值

	// 打开服务控制管理器
	hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

	if(hSCManager)
	{
		// 创建服务
		hService = CreateService(hSCManager,
					lpszServiceName,
					lpszServiceName,
					SERVICE_ALL_ACCESS,
					SERVICE_KERNEL_DRIVER,
					SERVICE_DEMAND_START,
					SERVICE_ERROR_NORMAL,
					lpszDriverPath,
					NULL,
					NULL,
					NULL,
					NULL,
					NULL);

		if(hService == NULL)
		{
			if(::GetLastError() == ERROR_SERVICE_EXISTS)
			{
				hService = ::OpenService(hSCManager, lpszServiceName, SERVICE_ALL_ACCESS);
			}
		}

		if(hService)
		{
			// 启动服务
		    bResult = StartService(hService, 0, NULL);

			// 关闭服务句柄
			CloseServiceHandle(hService);
		}
  
		// 关闭服务控制管理器句柄
		CloseServiceHandle(hSCManager);
	}

	return bResult;
}

// 停止服务并卸下驱动
// lpszServiceName: 服务名 
BOOL StopDriver(LPCTSTR lpszServiceName)
{
	SC_HANDLE hSCManager;		// 服务控制管理器句柄
	SC_HANDLE hService;			// 服务句柄
	BOOL bResult;				// 返回值
	SERVICE_STATUS ServiceStatus;

	bResult = FALSE;

	// 打开服务控制管理器
	hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

	if(hSCManager)
	{
		// 打开服务
		hService = OpenService(hSCManager, lpszServiceName, SERVICE_ALL_ACCESS);

		if(hService)
		{
			// 停止服务
			bResult = ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus);

			// 删除服务
			bResult = bResult && DeleteService(hService);

			// 关闭服务句柄
			CloseServiceHandle(hService);
		}

		// 关闭服务控制管理器句柄
		CloseServiceHandle(hSCManager);
	}

	return bResult;
}


// 打开设备
// lpszDevicePath: 设备的路径
HANDLE OpenDevice(LPCTSTR lpszDevicePath)
{
	HANDLE hDevice;

	// 打开设备
	hDevice= ::CreateFile(lpszDevicePath,			// 设备路径
			GENERIC_READ | GENERIC_WRITE,			// 读写方式
			FILE_SHARE_READ | FILE_SHARE_WRITE,		// 共享方式
			NULL,									// 默认的安全描述符
			OPEN_EXISTING,							// 创建方式
			0,										// 不需设置文件属性
			NULL);									// 不需参照模板文件

	return hDevice;
}

// 打开端口驱动
BOOL OpenMyPort()
{
	BOOL bResult;

	// 设备名为"MyPort",驱动程序位于Windows的"system32\drivers"目录中
	bResult = StartDriver("system32\\drivers\\MyPort.sys", "MyPort");

	// 设备路径为"\\.\MyPort"
	if(bResult) hMyPort=OpenDevice("\\\\.\\MyPort");

	return (bResult && hMyPort!=INVALID_HANDLE_VALUE);
}

// 关闭端口驱动
BOOL CloseMyPort()
{
    return (CloseHandle(hMyPort) && StopDriver("MyPort"));
}


// 从指定端口读一个字节
// port: 端口
BYTE ReadPortByte(WORD port)
{
	DWORD buf[2];			// 输入输出缓冲区			
	DWORD dwOutBytes;		// IOCTL输出数据长度

	buf[0] = port;			// 第一个DWORD是端口
//	buf[1] = 0;				// 第二个DWORD是数据

	// 用IOCTL_MYPORT_READ_BYTE读端口
	::DeviceIoControl(hMyPort,				// 设备句柄
			IOCTL_MYPORT_READ_BYTE,			// 取设备属性信息
			buf, sizeof(buf),				// 输入数据缓冲区
			buf, sizeof(buf),				// 输出数据缓冲区
			&dwOutBytes,					// 输出数据长度
			(LPOVERLAPPED)NULL);			// 用同步I/O	

	return (BYTE)buf[1];
}

// 将一个字节写到指定端口
// port: 端口
// data: 字节数据
void WritePortByte(WORD port, BYTE data)
{
	DWORD buf[2];			// 输入输出缓冲区			
	DWORD dwOutBytes;		// IOCTL输出数据长度

	buf[0] = port;			// 第一个DWORD是端口
	buf[1] = data;			// 第二个DWORD是数据

	// 用IOCTL_MYPORT_WRITE_BYTE写端口
	::DeviceIoControl(hMyPort,				// 设备句柄
			IOCTL_MYPORT_WRITE_BYTE,		// 取设备属性信息
			buf, sizeof(buf),				// 输入数据缓冲区
			buf, sizeof(buf),				// 输出数据缓冲区
			&dwOutBytes,					// 输出数据长度
			(LPOVERLAPPED)NULL);			// 用同步I/O
}

⌨️ 快捷键说明

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