Windows驱动开发-r3和r0通信
用户部分代码:
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通信的更多相关文章
- Windows驱动开发(中间层)
Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...
- [Windows驱动开发](一)序言
笔者学习驱动编程是从两本书入门的.它们分别是<寒江独钓——内核安全编程>和<Windows驱动开发技术详解>.两本书分别从不同的角度介绍了驱动程序的制作方法. 在我理解,驱动程 ...
- windows驱动开发推荐书籍
[作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...
- Windows 驱动开发 - 5
上篇<Windows 驱动开发 - 4>我们已经完毕了硬件准备. 可是我们还没有详细的数据操作,比如接收读写操作. 在WDF中进行此类操作前须要进行设备的IO控制,已保持数据的完整性. 我 ...
- windows 驱动开发入门——驱动中的数据结构
最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...
- Windows驱动——读书笔记《Windows驱动开发技术详解》
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- Windows 驱动开发 - 7
在<Windows 驱动开发 - 5>我们所说的读写操作在本篇实现. 在WDF中实现此功能主要为:EvtIoRead和EvtIoWrite. 首先,在EvtDeviceAdd设置以上两个回 ...
- Windows 驱动开发 - 8
最后的一点开发工作:跟踪驱动. 一.驱动跟踪 1. 包括TMH头文件 #include "step5.tmh" 2. 初始化跟踪 在DriverEntry中初始化. WPP_INI ...
- Windows驱动开发-IRP的完成例程
<Windows驱动开发技术详解 >331页, 在将IRP发送给底层驱动或其他驱动之前,可以对IRP设置一个完成例程,一旦底层驱动将IRP完成后,IRP完成例程立刻被处罚,通过设置完成例程 ...
随机推荐
- [A]List`1[MyObject] cannot be cast to [B]List`1[MyObject]
Description I have created a small class in a single ASP.NET 4.5 web forms page that is instantiated ...
- RestTemplate post请求使用map传参 Controller 接收不到值的解决方案 postForObject方法源码解析.md
结论 post方法中如果使用map传参,需要使用MultiValueMap来传递 RestTemplate 的 postForObject 方法有四个参数 String url => 顾名思义 ...
- MyBatis 入门Demo
新建数据库my_db,新建表student_tb id为主键,不自动递增. 不必插入数据. 下载MyBatis https://github.com/mybatis/mybatis-3/release ...
- Linux - kali Linux重置密码
1. recovery mode -> E 2. ro -> rw 3. plus init=/bin/bash 4. passwd root
- flask blueprints
flask blueprints 1. flask blueprints 蓝图是一种网页模板的组合,可以方便的注册到flask中. 蓝图可以在文件中声明,也可以在包中声明,一般而言推荐在包中 ...
- 笔记-pymysq-exception
笔记-pymysq-exception 1. exception DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常: 基本上是继承了Exception基类,没有添加额外功能. ...
- 导入spark程序的maven依赖包时,无法导入,报错Unable to import maven project: See logs for details
问题:导入spark程序的maven依赖包时,无法导入,且报错:0:23 Unable to import maven project: See logs for details 2019-08-23 ...
- Android之Builder对话框的一些常用方式
原文: http://blog.csdn.net/kkfdsa132/article/details/6322835 Android为我们提供几种对话框,主要有:AlertDialog.Progres ...
- 转:Entity Framework 5.0 Code First全面学习
Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code Firs ...
- Python 基础之面向对象初识与类的封装
一.面向对象类的初识 1.类的定义 #三种方式:#1.class MyClass: pass #2.推荐class MyClass(): pass #3.class MyClass(obj ...