windows driver 简单的驱动和通信
sysmain.c
#pragma once
#pragma warning(disable: 4100)
#include <ntifs.h>
#include <ntddk.h>
#define IO_READ_Control CTL_CODE(FILE_DEVICE_UNKNOWN, 0x777, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
typedef struct _Player
{
ULONG id;
ULONG hp;
ULONG mp;
} Player, * PPlayer;
UNICODE_STRING deviceName = RTL_CONSTANT_STRING(L"\\Device\\hsys");
UNICODE_STRING symbolName = RTL_CONSTANT_STRING(L"\\??\\hsys");
PDEVICE_OBJECT pDeviceObject = NULL;
// 卸载驱动时,必须清理资源
NTSTATUS DriverUnload(PDRIVER_OBJECT pDriverObject)
{
IoDeleteSymbolicLink(&symbolName);
IoDeleteDevice(pDeviceObject); // or: IoDeleteDevice(pDriverObject->DeviceObject);
DbgPrintEx(0, 0, "[hsys] stop.\n");
return STATUS_SUCCESS;
}
NTSTATUS DispatchHandle(PDEVICE_OBJECT DeviceObject, PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
SIZE_T byteSize = 0;
// 获取io堆栈位置
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
switch (stack->MajorFunction)
{
case IRP_MJ_CREATE:
case IRP_MJ_CLOSE:
break;
case IRP_MJ_DEVICE_CONTROL:
{
ULONG controlCode = stack->Parameters.DeviceIoControl.IoControlCode;
if (controlCode == IO_READ_Control)
{
// 用户模式发送的player指针过来
PPlayer pPlayer = (PPlayer)pIrp->AssociatedIrp.SystemBuffer;
pPlayer->id = 1;
pPlayer->hp = 100;
pPlayer->mp = 50;
status = STATUS_SUCCESS;
byteSize = sizeof(Player);
}
}
break;
default:
break;
}
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = byteSize; // 读写了多少字节
IoCompleteRequest(pIrp, IO_NO_INCREMENT); // 完成请求
return status;
}
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegister)
{
DbgPrintEx(0, 0, "[hsys] start!!\n");
pDriverObject->DriverUnload = DriverUnload;
NTSTATUS status = STATUS_SUCCESS;
// 创建一个设备
status = IoCreateDevice(pDriverObject, 0, &deviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject);
if (!NT_SUCCESS(status))
{
DbgPrintEx(0, 0, "IoCreateDevice Error.\n");
return status;
}
// 设置了一个设备对象名称和该设备的用户可视名称之间的符号链接
// 向应用程序公开的连接符号,别的程序才能和你的驱动通信
status = IoCreateSymbolicLink(&symbolName, &deviceName);
if (!NT_SUCCESS(status))
{
DbgPrintEx(0, 0, "IoCreateSymbolicLink Error.\n");
IoDeleteDevice(pDeviceObject);
return status;
}
DbgPrintEx(0, 0, "Driver load success.\n"); // 查看驱动设备列表: >driverquery
// irp,当用户模式打开使用此驱动时通信
SIZE_T i;
for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {
pDriverObject->MajorFunction[i] = DispatchHandle;
}
// 也可以单独设置
// pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCall;
// pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseCall;
// pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoControl;
pDeviceObject->Flags |= DO_DIRECT_IO;
pDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return status;
}
用户模式(管理员模式启动) main.cpp
#include <iostream>
#include <Windows.h>
#define IO_READ_Control CTL_CODE(FILE_DEVICE_UNKNOWN, 0x777, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
typedef struct _Player
{
ULONG id;
ULONG hp;
ULONG mp;
} Player, * PPlayer;
using namespace std;
const WCHAR* symbolName = L"\\\\.\\hsys";
int main()
{
HANDLE hDriver;
// 使用驱动就和打开文件一样
hDriver = CreateFileW(symbolName, GENERIC_ALL, 0, 0, OPEN_EXISTING, 0, 0); // IRP_MJ_CREATE
if (hDriver == INVALID_HANDLE_VALUE)
{
printf("打开驱动失败\n");
return 0;
}
Player player;
DWORD Bytes;
// IRP_MJ_DEVICE_CONTROL
if (!DeviceIoControl(hDriver, IO_READ_Control,
&player, sizeof(Player), // 发送
&player, sizeof(Player), // 接收,不接收可以填NULL
&Bytes, 0))
{
printf("发送消息失败\n");
CloseHandle(hDriver); // IRP_MJ_CLOSE
return 0;
}
printf("id(%d), hp(%d), mp(%d)", player.id, player.hp, player.mp); // id(1), hp(100), mp(50)
CloseHandle(hDriver); // IRP_MJ_CLOSE
return 0;
}
windows driver 简单的驱动和通信的更多相关文章
- 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载
在Windows 2000 与Windows XP 系统采用是WINDDK来开发WINDOWS驱动程序,我手头也有WINDDK,可是从Windows Vista开始之后,一般采用Microsoft W ...
- 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...
- Windows内核安全与驱动开发
这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...
- 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。
和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...
- 《windows内核安全与驱动开发》ctrl2cap中的ObReferenceObjectByName疑问
国内有关于windows内核驱动这块的书籍实在是甚少,不过好在<windows内核安全与驱动开发>这本书还算不错(内容方面),但是不得不说这本书在许多地方存在着一些细节上的问题.比如我今天 ...
- 《Windows内核安全与驱动开发》 5.1&5.2 内核与应用方面的编程
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 5.1&5.2 内核与应用方面的编程 一.生成控制设备 如果一个驱 ...
- NTDDK 从两个最简单的驱动谈起
第 1 章 从两个最简单的驱动谈起 Windows 驱动程序的编写,往往需要开发人员对 Windows 内核有深入了解和大量的内 核调试技巧,稍有不慎,就会造成系统的崩溃.因此,初次涉及 Window ...
- 如何实现Windows Phone代码与Unity相互通信(事件方式)
源地址:http://www.cnblogs.com/petto/p/3909063.html 一些废话 昨天写一篇今天写一篇.不是我闲的蛋疼,是今天一天碰到了好几个恼人的问题,浪费一天时间搞定.本文 ...
- windows下用c实现Socket通信
原文:windows下用c实现Socket通信 原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...
随机推荐
- MySQL如何安全的给小表加字段
MySQL学习笔记-如何安全的给小表加字段 如果要给一个大表加字段,你一般都会非常谨慎小心,以免对线上业务造成影响,但实际上给一个小表加字段不慎操作也会导致线上业务出问题,这篇文章主要学习一下MySQ ...
- 一个实体对象不能由多个 IEntityChangeTracker 实例引用
因为需求需要EF 实现批量的删除后插入,所以出现了这个报错, 这个报错的原因是,EF查询是有带跟踪的,跟踪后其他上下文想操作这个实体就会报错. 所以,查询使用 ef AsNoTracking 查后无追 ...
- tarjan 复习笔记 割点与桥
定义分析 给定一个无向连通图\(G=(V,E)\) 对于\(x\in Y\),如果删去\(x\)及与\(x\)相连的边后,\(G\)分裂为两个或者两个以上的不连通子图,那么称\(x\)为\(G\)的割 ...
- ReentrantReadWriteLock读写锁简单原理案例证明
ReentrantReadWriteLock存在原因? 我们知道List的实现类ArrayList,LinkedList都是非线程安全的,Vector类通过用synchronized修饰方法保证了Li ...
- Java——方法
Java 方法 Systom.out.println():其中,println()是一个方法(Method),而System是系统类(Class),out是标准输出对象(Object).这句话的意思是 ...
- SpringMVC请求参数的获取方式
一.GET请求参数获取 1. 通过HttpServletRequest获取参数 2. 直接方法参数获取 3. RequestParam注解方式获取请求参数 4. Bean方式获取参数 5. Model ...
- scala的隐式转换学习总结(详细)
一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...
- Spring Boot项目application.yml文件数据库配置密码加密
在Spring boot开发中,需要在application.yml文件里配置数据库的连接信息,或者在启动时传入数据库密码,如果不加密,传明文,数据库就直接暴露了,相当于"裸奔"了 ...
- DEDECMS:解决BMP、jpeg图片或MP4视频无法上传和在后台无法显示
一.BMP图片无法上传解决方法: 1.修改配置文件: 在include-->dialog的文件夹下, select_images_post.php--> 把 $sparr = Array( ...
- haproxy 2.2代理后端https服务
globalmaxconn 100000chroot /usr/local/haproxystats socket /var/lib/haproxy/haproxy.sock mode 600 lev ...