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,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...
随机推荐
- c++ stl list使用总结(转)
转自:http://blog.csdn.net/nupt123456789/article/details/8120397 #include <iostream> #include < ...
- k8s command & args
命令和参数说明: command.args两项实现覆盖Dockerfile中ENTRYPOINT的功能,具体的command命令代替ENTRYPOINT的命令行,args代表集体的参数. 如果comm ...
- 从官方文档中探索MySQL分页的几种方式及分页优化
概览 相比于Oracle,SQL Server 等数据库,MySQL分页的方式简单得多了,官方自带了分页语法 limit 语句: select * from test_t LIMIT {[offset ...
- 在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle数据库
前言 虽然一直在说"去IOE化",但是在国企和政府,Oracle的历史包袱实在太重了,甚至很多业务逻辑都是写在Oracle的各种存储过程里面实现的-- 我们的系统主要的技术栈是Dj ...
- .NET使用DinkToPdf将HTML转成PDF
0.介绍 C# .NET Core wrapper for wkhtmltopdf library that uses Webkit engine to convert HTML pages to P ...
- 黑客整人代码,vbS整人代码大全(强制自动关机、打开无数计算器、无限循环等)
vbe与vbs整人代码大全,包括强制自动关机.打开无数计算器.无限循环等vbs整人代码,感兴趣的朋友参考下.vbe与vbs整人代码例子:set s=createobject("wscript ...
- Linux 防火墙相关操作
目录 1.查看防火墙状态 2.部署防火墙 3.常用操作 4.其他操作 1.查看防火墙状态 systemctl status firewalld 绿字部分 Active:active(running) ...
- vs中python包安装教程
vs安装python很简单,只需要在vs安装包中选择python就可以了,这里使用的python3.7: 如果有了解,都知道安装python包的指令:"pip install xxx&quo ...
- poj 1410 (没做出来,记得闲着没事看看这道题)
听说这道题是个大大的坑题 结果wa了十多发,,,,还是没找到原因 #include<cstdio> #include<cmath> #include<algorithm& ...
- tomacat服务器上web资源访问流程、web应用打成war包发布、Context的reloadable属性、tomacat体系架构
一.web资源访问流程 二.web应用打成war包发布到服务器 好处:打成war包发布到服务器,那么服务器会自动把它拆解成文件夹 jar命令是java自带的一个命令,如果之前配置过Java编译环境就可 ...