用户部分代码:

int main()
{
HANDLE hDevice = CreateFile(L"\\\\.\\MyTest", GENERIC_READ | GENERIC_WRITE, , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice==INVALID_HANDLE_VALUE)
{
printf("Failed to obtain device handle...");
getchar();
return ;
} UCHAR buffer[];
ULONG size;
LPDWORD ll;
BOOL result = ReadFile(hDevice, buffer, , &size, NULL);
if (result)
{
printf("READ %d BYTES...", size);
for (size_t i = ; i < (size_t)size; i++)
{
printf("%02x\n", buffer[i]);
}
}
CloseHandle(hDevice);
getchar();
return ;
}

驱动部分代码:

#include <ntddk.h>

#define DEVICE_NAME L"\\Device\\MyTestDevice"
#define SYMBOL_LINK_NAME L"\\??\\MyTest" PDEVICE_OBJECT pDevice;
UNICODE_STRING DeviceName;
UNICODE_STRING SymbolLinkName; NTSTATUS DeviceCreate(PDEVICE_OBJECT pDeviceObject,PIRP pIrp);
NTSTATUS DeviceClose(PDEVICE_OBJECT pDeviceObject, PIRP pIrp);
NTSTATUS DeviceRead(PDEVICE_OBJECT pDeviceObject, PIRP pIrp); NTSTATUS unload(PDRIVER_OBJECT driver)
{
DbgPrint("driver :%ws unload", driver->DriverName);
DbgPrint("driver unload success...");
IoDeleteSymbolicLink(&SymbolLinkName);
IoDeleteDevice(pDevice);
return STATUS_SUCCESS;
} NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
driver->DriverUnload = unload;
driver->MajorFunction[IRP_MJ_CREATE] = DeviceCreate;//创建
driver->MajorFunction[IRP_MJ_READ] = DeviceRead;//通信
driver->MajorFunction[IRP_MJ_CLOSE] = DeviceClose;//关闭 RtlInitUnicodeString(&DeviceName, DEVICE_NAME);
RtlInitUnicodeString(&SymbolLinkName, SYMBOL_LINK_NAME); ntstatus = IoCreateDevice(driver, , &DeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDevice);
if (!NT_SUCCESS(ntstatus))
{
DbgPrint("IoCreateDevice Failed");
return ntstatus;
} ntstatus = IoCreateSymbolicLink(&SymbolLinkName, &DeviceName);
if (!NT_SUCCESS(ntstatus))
{
DbgPrint("IoCreateSymbolicLink Failed");
IoDeleteDevice(pDevice);
return ntstatus;
} pDevice->Flags |= DO_BUFFERED_IO;
DbgPrint("%ws", reg_path->Buffer);
DbgPrint("driver load success...");
return STATUS_SUCCESS;
} NTSTATUS DeviceCreate(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
//业务代码区 //设置返回状态
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = ;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DbgPrint("create device success...%d",pDeviceObject->ActiveThreadCount);//这里蛋疼得狠,vs2019里,pDeviceObject不用一下,编译就报错,所有派遣函数一样
return STATUS_SUCCESS;
} NTSTATUS DeviceClose(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
//业务代码区 //设置返回状态
pIrp->IoStatus.Status = STATUS_SUCCESS;//getLastError()得到的值
pIrp->IoStatus.Information = ; //返回给3环多少数据,没有填0
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DbgPrint("create device success...%d", pDeviceObject->ActiveThreadCount);
return STATUS_SUCCESS;
} NTSTATUS DeviceRead(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
PIO_STACK_LOCATION iostack;
iostack = IoGetCurrentIrpStackLocation(pIrp);
ULONG length = iostack->Parameters.Read.Length;
PVOID pBuffer = pIrp->AssociatedIrp.SystemBuffer; pIrp->IoStatus.Status = STATUS_SUCCESS;//getLastError()得到的值
pIrp->IoStatus.Information = length; //返回给3环多少数据,没有填0
RtlFillMemory(pBuffer,length,0xAA);
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DbgPrint("read device success...%d", pDeviceObject->ActiveThreadCount);
return STATUS_SUCCESS;
}

Windows驱动开发-r3和r0通信的更多相关文章

  1. Windows驱动开发(中间层)

    Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...

  2. [Windows驱动开发](一)序言

    笔者学习驱动编程是从两本书入门的.它们分别是<寒江独钓——内核安全编程>和<Windows驱动开发技术详解>.两本书分别从不同的角度介绍了驱动程序的制作方法. 在我理解,驱动程 ...

  3. windows驱动开发推荐书籍

    [作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...

  4. Windows 驱动开发 - 5

    上篇<Windows 驱动开发 - 4>我们已经完毕了硬件准备. 可是我们还没有详细的数据操作,比如接收读写操作. 在WDF中进行此类操作前须要进行设备的IO控制,已保持数据的完整性. 我 ...

  5. windows 驱动开发入门——驱动中的数据结构

    最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...

  6. Windows驱动——读书笔记《Windows驱动开发技术详解》

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  7. Windows 驱动开发 - 7

    在<Windows 驱动开发 - 5>我们所说的读写操作在本篇实现. 在WDF中实现此功能主要为:EvtIoRead和EvtIoWrite. 首先,在EvtDeviceAdd设置以上两个回 ...

  8. Windows 驱动开发 - 8

    最后的一点开发工作:跟踪驱动. 一.驱动跟踪 1. 包括TMH头文件 #include "step5.tmh" 2. 初始化跟踪 在DriverEntry中初始化. WPP_INI ...

  9. Windows驱动开发-IRP的完成例程

    <Windows驱动开发技术详解 >331页, 在将IRP发送给底层驱动或其他驱动之前,可以对IRP设置一个完成例程,一旦底层驱动将IRP完成后,IRP完成例程立刻被处罚,通过设置完成例程 ...

随机推荐

  1. jsp include参数传送接收与应用

    先看一个简单的应用,在a.jsp中写如下代码 <html> <head></head> <body> <div> <jsp:inclu ...

  2. Java自学-集合框架 HashMap和Hashtable的区别

    HashMap和Hashtable之间的区别 步骤 1 : HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式 区别1: Hash ...

  3. ROS-debug1 : 运行roscore时报错:Unable to contact my own server at...

    一.问题描述 在终端运行roscore时,出现错误:Unable to contact my own server at...,如下图: 二.解决方法 以上问题是由于ROS环境变量ROS_MASTER ...

  4. PAT A1135 Is It A Red Black Tree

    判断一棵树是否是红黑树,按题给条件建树,dfs判断即可~ #include<bits/stdc++.h> using namespace std; ; struct node { int ...

  5. 【PAT甲级】1026 Table Tennis (30 分)(结构体排序,trick较多)

    题意: 输入一个正整数N(<=10000),表示客户(对)的大小,接着输入N行数据,每行包括一对顾客到场的时间,想要玩的时间,以及是否是VIP客户.接下来输入两个正整数K,M(K<=100 ...

  6. Educational Codeforces Round 72 (Rated for Div. 2)C(暴力)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;char s[200007];int a[20 ...

  7. Linux centosVMware Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间

    一.Nginx访问日志 vim /usr/local/nginx/conf/nginx.conf //搜索log_format  日至格式 改为davery格式 $remote_addr  客户端IP ...

  8. Mac brew安装的php修改了php.ini之后如何重启php?

    环境:nginx+mysql+php7.2:Mac利用homebrew安装的php7.2 问题:修改了PHP的配置文件,php.ini:服务器是nginx,如何重启PHP? 开启: brew serv ...

  9. mysql odbc 配置详解

    1.安装mysql 以及mysql odbc 要注意自己的版本 版本都要统一(32位 或者64位) 2.出现的error 1989 126错误代码 Error 1918. Error installi ...

  10. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:制作一个超小按钮

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...