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 简单的驱动和通信的更多相关文章

  1. 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载

    在Windows 2000 与Windows XP 系统采用是WINDDK来开发WINDOWS驱动程序,我手头也有WINDDK,可是从Windows Vista开始之后,一般采用Microsoft W ...

  2. 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...

  3. Windows内核安全与驱动开发

    这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...

  4. 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。

    和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...

  5. 《windows内核安全与驱动开发》ctrl2cap中的ObReferenceObjectByName疑问

    国内有关于windows内核驱动这块的书籍实在是甚少,不过好在<windows内核安全与驱动开发>这本书还算不错(内容方面),但是不得不说这本书在许多地方存在着一些细节上的问题.比如我今天 ...

  6. 《Windows内核安全与驱动开发》 5.1&5.2 内核与应用方面的编程

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>  5.1&5.2 内核与应用方面的编程 一.生成控制设备 如果一个驱 ...

  7. NTDDK 从两个最简单的驱动谈起

    第 1 章 从两个最简单的驱动谈起 Windows 驱动程序的编写,往往需要开发人员对 Windows 内核有深入了解和大量的内 核调试技巧,稍有不慎,就会造成系统的崩溃.因此,初次涉及 Window ...

  8. 如何实现Windows Phone代码与Unity相互通信(事件方式)

    源地址:http://www.cnblogs.com/petto/p/3909063.html 一些废话 昨天写一篇今天写一篇.不是我闲的蛋疼,是今天一天碰到了好几个恼人的问题,浪费一天时间搞定.本文 ...

  9. windows下用c实现Socket通信

    原文:windows下用c实现Socket通信 原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...

随机推荐

  1. MySQL如何安全的给小表加字段

    MySQL学习笔记-如何安全的给小表加字段 如果要给一个大表加字段,你一般都会非常谨慎小心,以免对线上业务造成影响,但实际上给一个小表加字段不慎操作也会导致线上业务出问题,这篇文章主要学习一下MySQ ...

  2. 一个实体对象不能由多个 IEntityChangeTracker 实例引用

    因为需求需要EF 实现批量的删除后插入,所以出现了这个报错, 这个报错的原因是,EF查询是有带跟踪的,跟踪后其他上下文想操作这个实体就会报错. 所以,查询使用 ef AsNoTracking 查后无追 ...

  3. tarjan 复习笔记 割点与桥

    定义分析 给定一个无向连通图\(G=(V,E)\) 对于\(x\in Y\),如果删去\(x\)及与\(x\)相连的边后,\(G\)分裂为两个或者两个以上的不连通子图,那么称\(x\)为\(G\)的割 ...

  4. ReentrantReadWriteLock读写锁简单原理案例证明

    ReentrantReadWriteLock存在原因? 我们知道List的实现类ArrayList,LinkedList都是非线程安全的,Vector类通过用synchronized修饰方法保证了Li ...

  5. Java——方法

    Java 方法 Systom.out.println():其中,println()是一个方法(Method),而System是系统类(Class),out是标准输出对象(Object).这句话的意思是 ...

  6. SpringMVC请求参数的获取方式

    一.GET请求参数获取 1. 通过HttpServletRequest获取参数 2. 直接方法参数获取 3. RequestParam注解方式获取请求参数 4. Bean方式获取参数 5. Model ...

  7. scala的隐式转换学习总结(详细)

    一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...

  8. Spring Boot项目application.yml文件数据库配置密码加密

    在Spring boot开发中,需要在application.yml文件里配置数据库的连接信息,或者在启动时传入数据库密码,如果不加密,传明文,数据库就直接暴露了,相当于"裸奔"了 ...

  9. DEDECMS:解决BMP、jpeg图片或MP4视频无法上传和在后台无法显示

    一.BMP图片无法上传解决方法: 1.修改配置文件: 在include-->dialog的文件夹下, select_images_post.php--> 把 $sparr = Array( ...

  10. haproxy 2.2代理后端https服务

    globalmaxconn 100000chroot /usr/local/haproxystats socket /var/lib/haproxy/haproxy.sock mode 600 lev ...