驱动层,创建设备对象,实现读写函数:

 #include <ntddk.h>NTSTATUS    Unload(PDRIVER_OBJECT driver)
{DbgPrint("unload driver");return STATUS_SUCCESS;
}NTSTATUS CompleteIrp(PIRP Irp, NTSTATUS status = STATUS_SUCCESS, ULONG_PTR info = 0)
{Irp->IoStatus.Status = status; Irp->IoStatus.Information = info; IoCompleteRequest(Irp, 0); return status;
}NTSTATUS ZeroRead(PDEVICE_OBJECT, PIRP Irp) {auto stack = IoGetCurrentIrpStackLocation(Irp);auto len = stack->Parameters.Read.Length;if (len == 0)return CompleteIrp(Irp, STATUS_INVALID_BUFFER_SIZE);auto buffer = MmGetSystemAddressForMdl(Irp->MdlAddress, NormalPagePriority);if (!buffer){return CompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES);}memset(buffer, 0, len);return CompleteIrp(Irp, STATUS_SUCCESS, len);
}NTSTATUS ZeroWrite(PDEVICE_OBJECT, PIRP Irp) {auto stack = IoGetCurrentIrpStackLocation(Irp); auto len = stack->Parameters.Write.Length;return CompleteIrp(Irp, STATUS_SUCCESS, len);
}NTSTATUS   CreateClose(PDEVICE_OBJECT, PIRP Irp) {return CompleteIrp(Irp);
}
extern "C"
NTSTATUS    DriverEntry(PDRIVER_OBJECT  driver, PUNICODE_STRING RegPath)
{DbgPrint("Driver Entry");driver->DriverUnload = (PDRIVER_UNLOAD)Unload;driver->MajorFunction[IRP_MJ_CREATE] = CreateClose;driver->MajorFunction[IRP_MJ_READ] = ZeroRead;driver->MajorFunction[IRP_MJ_WRITE] = ZeroWrite;driver->MajorFunction[IRP_MJ_CLOSE] = CreateClose;UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\Zero"); UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\Zero"); PDEVICE_OBJECT DeviceObject = nullptr;auto    status = STATUS_SUCCESS;do{status = IoCreateDevice(driver, 0, &devName, FILE_DEVICE_UNKNOWN, 0, false, &DeviceObject);if (!NT_SUCCESS(status)){DbgPrint("CreateDevice Failed");break;}DeviceObject->Flags |= DO_DIRECT_IO;IoCreateSymbolicLink(&symLink, &devName);if (!NT_SUCCESS(status)){DbgPrint("CreateSymLink Failed");IoDeleteDevice(DeviceObject);break;}} while (FALSE);return status;
}

应用层打开设备对象,并使用ReadFile读数据:

#include <windows.h>
#include <iostream>int Error(const char* msg) {printf("%s: error=%d\n", msg, ::GetLastError()); return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{HANDLE hFile = CreateFile(L"\\\\.\\Zero", GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);if (hFile == INVALID_HANDLE_VALUE){printf("OpenDevice Failed");return -1;}BYTE buffer[64];DWORD bytes;// store some non-zero datafor (int i = 0; i < sizeof(buffer); ++i) buffer[i] = i + 1;bool ok = ReadFile(hFile, buffer, 64, &bytes, nullptr);if (!ok){Error("ReadFailed");}long total = 0;for (auto i : buffer){total += i;}if (total != 0){printf("Wrong Read");}else{printf("ReadOK");}CloseHandle(hFile);return 0;
}

驱动和应用层通信列子相关推荐

  1. netlink实现驱动和应用层通信

    1.netlink及相关接口说明         说到驱动和应用层进行数据通信,很多人就会想到使用传统的ioctl,诚然,很多时候应用层调用驱动进行参数配置和参数获取使用的也正是ioctl的方式,但这 ...

  2. 驱动 与应用层DeviceIoContro() 通信

    驱动代码 .h文件 #pragma once #include<wdm.h> // 引入内核文件#ifdef __cplusplus extern "C" {#endi ...

  3. windows 驱动和应用层的三种通信方式 r3到r0 DeviceIoControl 4种ioctl请求

    驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换. 驱动层和应用层通信,主要是靠DeviceIoControl ...

  4. 内核层与应用层通信详解

    做驱动开发的肯定会遇到应用层与内核层的通信的问题,首先说内核层与应用层的通信可以大概分为两个方面,第一是应用层向内核层主动传递消息,第二是内核层主动与应用层通信.下面我们将分开来谈两个方面. 我们先来 ...

  5. pci驱动与硬件通信

    接上一篇博文,当将PCI设备空间的资源映射出来之后.只需要做两件事情,PCI设备的基本框架就建立起来了. 首先注册驱动程序,调用如下函数: int iosDrvInstall() / STATUS i ...

  6. Linux驱动开发|4G通信

    4G通信 使用有线网络或者 WIFI 有很多限制,因为要布线,即使是 WIFI 也得先布线,然后接个路由器.因此在不方便布线的场合,就可以通过 4G 连接到网络.下面介绍如何在 I.MX6U-ALPH ...

  7. Linux驱动无硬件设备,Linux设备驱动与硬件通信

    Linux物理设备驱动,主要有几种类型,如:IO类.内存类.总线类.IO类我们平时接触的最多,其主要特点是,通过IO设备的寄存器操作硬件,具体需要去查看硬件手册. 1. IO端口和IO内存 在硬件层, ...

  8. qnx 设备驱动开发_QNX驱动开发——应用层与resource manger交互 | 学步园

    QNX操作系统是一个类Unix实时操作系统,遵从POSIX规范,驱动程序具有良好的可移植性. 编写任何驱动程序都会遇到同样的一个问题:应用程序与驱动程序之间是如何进行交互的.其实这个问题很简单,QNX ...

  9. 应用层与驱动层通信DeviceIoControl

    驱动层与应用层通信是通过DeviceIoControl, 符号定义 #define DEVICE_NAME L"\\Device\\myDriver" // Driver Name ...

最新文章

  1. 从管道中飞出的不一定是炮弹,也可能是无人机
  2. Quarkus:一个Kubernetes原生Java框架
  3. java 字母图形_Java字母图形
  4. 深圳网络推广是如何提高网站的收录比的?
  5. api可以主动采集用户数据吗_模拟量数字量采集卡之EC-8001篇
  6. 万字图文 | 聊一聊 ReentrantLock 和 AQS 那点事(看完不会你找我)
  7. this--学习笔记
  8. 拳王虚拟项目公社:0成本售卖高考资料的虚拟资源教程,自动化的其他最简单最轻松玩法
  9. php 判断字数,PHP实时统计中文字数和区别
  10. bzoj 2330 糖果
  11. sql crud_SQL Server中的CRUD操作
  12. Trip to Canvas(1)
  13. [渝粤教育] 中国地质大学 数据结构 复习题
  14. 【Laravel】快速查阅手册
  15. 在制作Windows虚拟机模板时的常用技巧
  16. JDK开发环境搭建及环境变量配置(win10)
  17. 文兵生日--2010-12-1
  18. 【车间调度】基于matlab改进的帝国企鹅算法求解车间调度问题【含Matlab源码 2041期】
  19. 杰理之79NRTC 时间【篇】
  20. 干货!手把手教你穿透内网

热门文章

  1. ML之ECS:利用ECS的PAI进行傻瓜式操作机器学习的算法
  2. Matlab:基于Matlab通过GUI实现自动驾驶的车牌智能识别
  3. Python300篇电子书免费送
  4. 字符串在内存中的存储——C语言进阶
  5. spring-boot-maven-plugin插件的作用
  6. supersocket中quickstart文件夹下的MultipleCommandAssembly的配置文件分析
  7. 无线研究 破解分享
  8. codeforces #222 div 1 D Developing Game
  9. hadoop集群配置问题及思考
  10. Fckeditor插入视频或视频文件