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. Excel导出中HttpServletResponse消息头参数设置

    response.setCharacterEncoding("UTF-8"); //编码格式为UTF-8 response.setContentType("applica ...

  2. SSRF漏洞挖掘利用技巧

    参考文章 SSRF漏洞(原理&绕过姿势) SSRF绕过方法总结 SSRF绕过IP限制方法总结 Tag: #SSRF Ref: 概述 总结 利用一个可以发起网络请求的服务当作跳板来攻击内部其他服 ...

  3. 笔趣看小说Python3爬虫抓取

    笔趣看小说Python3爬虫抓取 获取HTML信息 解析HTML信息 整合代码 获取HTML信息 # -*- coding:UTF-8 -*- import requests if __name__ ...

  4. HttpClient之基本使用

    1.HttpClient简介 http协议可以说是现在Internet上面最重要,使用最多的协议之一了,越来越多的java应用需要使用http协议来访问网络资源,特别是现在rest api的流行,Ht ...

  5. gcc选项 笔记

    gcc –E hello.c –o hello.i   使用gcc的选项"-E" 让gcc在预处理结束后停止编译过程. gcc –S hello.i –o hello.s   &q ...

  6. 自定义tree

    function YpTreeMenu(ypTreeMenu,treeObj) { this.ypTreeMenu=ypTreeMenu; this.treeObj=treeObj; this.tre ...

  7. 2019 ccpc秦皇岛

    1006 (dfs) #include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const dou ...

  8. 2019牛客暑期多校训练营(第八场)A.All-one Matrices(dp)

    题意:又是最大01矩阵的模型了 这次要找的是极大0/1矩阵的个数 思路:我们像处理最大01矩阵那样处理一下边界 由于我们上左右已经无法再继续扩展 我们只需要用前缀和记录一下是否可以向下扩展(即判断当前 ...

  9. vector的几种初始化及赋值方式

    转自https://www.cnblogs.com/quyc/p/12857054.html (1)不带参数的构造函数初始化 //初始化一个size为0的vector vector<int> ...

  10. Codeforces Round #657 (Div. 2) C. Choosing flowers(贪心)

    题目链接:https://codeforces.com/contest/1379/problem/C 题意 有 $m$ 种花,每种花数量无限,第一次购买一种花收益为 $a_i$,之后每一次购买收益为 ...