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. 理解Latency和Throughput: 吞吐量和延迟

    Latency,中文译作延迟.Throughput,中文译作吞吐量.它们是衡量软件系统的最常见的两个指标. 延迟一般包括单向延迟(One-way Latency)和往返延迟(Round Trip La ...

  2. 【Azure Developer】使用Microsoft Graph API创建用户时候遇见“401 : Unauthorized”“403 : Forbidden”

    问题描述 编写Java代码调用Mircrosoft Graph API创建用户时,分别遇见了"401 : Unauthorized"和"403 : Forbidden&q ...

  3. loj 10127最大数

    JSOI 2008 最大数 给定一个正整数数列a1​,a2​,a3​,⋯,an​,每一个数都在0∼p–1 之间.可以对这列数进行两种操作: 添加操作:向序列后添加一个数,序列长度变成 n+1: 询问操 ...

  4. 十:SpringBoot-配置AOP切面编程,解决日志记录业务

    SpringBoot-配置AOP切面编程,解决日志记录业务 1.AOP切面编程 1.1 AOP编程特点 1.2 AOP中术语和图解 2.SpringBoot整合AOP 2.1 核心依赖 2.2 编写日 ...

  5. 用友GRP-u8 SQL注入

    POST /Proxy HTTP/1.1 Accept: Accept: */* Content-Type: application/x-www-form-urlencoded User-Agent: ...

  6. apache 创建多端口监听

    httpd.conf 将 #LoadModule vhost_alias_module modules/mod_vhost_alias.so 改为 LoadModule vhost_alias_mod ...

  7. Java排序算法(一)冒泡排序

    一.测试类SortTest  import java.util.Arrays; public class SortTest { private static final int L = 20; pub ...

  8. Educational Codeforces Round 90 (Rated for Div. 2) C. Pluses and Minuses(差分)

    题目链接:https://codeforces.com/contest/1373/problem/C 题意 给出一个只含有 $+$ 或 $-$ 的字符串 $s$,按如下伪代码进行操作: res = 0 ...

  9. HDU6504 Problem E. Split The Tree【dsu on tree】

    Problem E. Split The Tree Problem Description You are given a tree with n vertices, numbered from 1 ...

  10. Java 窗口 小马图像窗口

    写在前面: eclipse接着爽到 全是借鉴的,东改西改,而且记不住原网址了 两个月前写的,忘了思路,嗯,It just works 运行效果: 图像随便选(放到*jar所在目录*\\pictures ...