这篇文章代码有问题可以参靠这篇
这篇文章

#include <windows.h>
#include <stdio.h>void LpoverlappedCompletionRoutine(__in     DWORD dwErrorCode,__in      DWORD dwNumberOfBytesTransfered,__out  LPOVERLAPPED lpOverlapped
)
{printf("已经完成了读操作\n");
}
//同步
VOID Syn()
{HANDLE hFile = CreateFile(TEXT("test.txt"),GENERIC_ALL,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,//存在打开不存在创建打开FILE_ATTRIBUTE_NORMAL ,NULL);if (hFile == INVALID_HANDLE_VALUE){printf("文件打开失败%d\n", GetLastError());}DWORD dwret;WriteFile(hFile, "这是同步操作", strlen("这是同步操作"), &dwret, NULL);CloseHandle(hFile);
}
//异步
VOID Asy()
{HANDLE hFile = CreateFile(TEXT("test.txt"),GENERIC_ALL,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,//存在打开不存在创建打开FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//加上就是一部NULL);if (hFile == INVALID_HANDLE_VALUE){printf("文件打开失败%d\n", GetLastError());}DWORD dwret;OVERLAPPED ol = {NULL};ol.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);WriteFile(hFile, "这是异步操作", strlen("这是异步操作"), &dwret, &ol);WaitForSingleObject(ol.hEvent, INFINITE);char Buffer[1024] = { 0 };ReadFileEx(hFile, Buffer, sizeof(Buffer), &ol, LpoverlappedCompletionRoutine);SleepEx(INFINITE, TRUE);printf("%s\n", Buffer);printf("结束\n");CloseHandle(hFile);
}
int main()
{Syn();Asy();
}


内核层

#include <ntddk.h>   LIST_ENTRY listHead;VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{UNICODE_STRING SymbolicLinkName = RTL_CONSTANT_STRING(L"\\??\\HelloDDK");IoDeleteSymbolicLink(&SymbolicLinkName);//删除连接IoDeleteDevice(pDriverObject->DeviceObject);//释放驱动对象//驱动卸载的时候显示KdPrint(("Goodbye driver\n"));
}NTSTATUS Create(IN PDEVICE_OBJECT deviceObject, IN PIRP Irp)
{Irp->IoStatus.Status = STATUS_SUCCESS;//设置返回状态,告诉操作是成功还是失败Irp->IoStatus.Information = 0;IoCompleteRequest(Irp, IO_NO_INCREMENT);//是不改变return STATUS_SUCCESS;
}NTSTATUS Read(IN PDEVICE_OBJECT deviceObject, IN PIRP Irp)
{KdPrint(("进入Read\n"));if (Irp->PendingReturned){//这段代码不知道怎么进来IoMarkIrpPending(Irp);//保证irp不会释放InsertHeadList(&listHead, &Irp->Tail.Overlay.ListEntry);}else {Irp->IoStatus.Status = STATUS_SUCCESS;//设置返回状态,告诉操作是成功还是失败Irp->IoStatus.Information = 0;IoCompleteRequest(Irp, IO_NO_INCREMENT);KdPrint(("else\n"));}KdPrint(("离开Read\n"));return STATUS_SUCCESS;
}NTSTATUS Cleanup(IN PDEVICE_OBJECT deviceObject, IN PIRP Irp)
{KdPrint(("进入Cleanup\n"));while (!IsListEmpty(&listHead)){PLIST_ENTRY pEntry = RemoveHeadList(&listHead);PIRP pendingIrp=CONTAINING_RECORD(pEntry, IRP, Tail.Overlay.ListEntry);pendingIrp->IoStatus.Status = STATUS_SUCCESS;//设置返回状态,告诉操作是成功还是失败pendingIrp->IoStatus.Information = 0;IoCompleteRequest(pendingIrp, IO_NO_INCREMENT);}Irp->IoStatus.Status = STATUS_SUCCESS;//设置返回状态,告诉操作是成功还是失败Irp->IoStatus.Information = 0;IoCompleteRequest(Irp, IO_NO_INCREMENT);KdPrint(("离开Cleanup\n"));return STATUS_SUCCESS;
}NTSTATUS Close(IN PDEVICE_OBJECT deviceObject, IN PIRP Irp)
{KdPrint(("进入Close\n"));Irp->IoStatus.Status = STATUS_SUCCESS;//设置返回状态,告诉操作是成功还是失败Irp->IoStatus.Information = 0;IoCompleteRequest(Irp, IO_NO_INCREMENT);//是不改变KdPrint(("离开Close\n"));return STATUS_SUCCESS;
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath
)
{KdPrint(("hello driver\n"));UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\HelloDDK");UNICODE_STRING SymbolicLinkName = RTL_CONSTANT_STRING(L"\\??\\HelloDDK");NTSTATUS status;PDEVICE_OBJECT DeviceObject;DriverObject->DriverUnload = Unload;DriverObject->MajorFunction[IRP_MJ_CREATE] = Create;DriverObject->MajorFunction[IRP_MJ_READ] = Read;DriverObject->MajorFunction[IRP_MJ_CLEANUP] = Cleanup;DriverObject->MajorFunction[IRP_MJ_CLOSE] = Close;status = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject);if (!NT_SUCCESS(status)){KdPrint(("创建设备失败%x\n", status));return status;}status = IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);if (!NT_SUCCESS(status)){KdPrint(("符号连接创建失败%x\n", status));IoDeleteDevice(DeviceObject);return status;}DeviceObject->Flags |= DO_BUFFERED_IO; //DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;InitializeListHead(&listHead);return STATUS_SUCCESS;
}

应用层

#include <windows.h>
#include <stdio.h>
#include <winioctl.h>
int main()
{HANDLE hDevice = CreateFile(TEXT("\\\\.\\HelloDDK"),GENERIC_ALL,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//FILE_FLAG_OVERLAPPED 代表异步  FILE_ATTRIBUTE_NORMAL代表同步NULL);if (hDevice == INVALID_HANDLE_VALUE){printf("设备打开失败%d\n", GetLastError());return -1;}DWORD dwRet;//注意异步操作必须加 OVERLAPPED ol = { NULL }标识 否则不是异步操作将会一直等待上一个ReadFile完成才执行下一个ReadFileOVERLAPPED ol = { NULL };for (int i=0;i<2;i++){ReadFile(hDevice, NULL, 0, &dwRet, &ol);}CloseHandle(hDevice);return 0;
}

win10驱动开发19——IRP同步相关推荐

  1. Win10驱动开发之开发环境的搭建(一)

    核心内容: 这次学习最后采用的开发环境如下: Windows : win10 64位 1809版本(Host计算机和测试计算机上相同) Visual Studio Community 2017 : 版 ...

  2. 001:VS2019+WDK10+Win10 驱动开发环境

    参考以下两篇文章: Download the Windows Driver Kit (WDK) - Windows drivers | Microsoft Learn <VS2019+WDK10 ...

  3. win10驱动开发4——加载/卸载驱动

    注意加载卸载驱动必须是win32项目 #include <Windows.h> #include <stdio.h> int main() {//等同于创建驱动======== ...

  4. Win10驱动开发2——双机调试

    双机调试 WinDbug下载地址WDK里面自带该工具 前置环境说明本机有windbug,wmware里面刚安装好win10系统. 设置debug模式 bcdedit bcdedit /dbgsetti ...

  5. WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟机驱动开发调试环境搭建

    为什么80%的码农都做不了架构师?>>>    一.准备工作 1 系统环境:Win10系统 2 开发工具:VS2015 3 驱动开发工具:WDK10 4 Windows SDK:SD ...

  6. vs2019+wdk10开发 xp, win7, win10 驱动

    一.安装WDK10 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk 首先下载wdk10,并安装,安 ...

  7. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

  8. Win10下VS2015(WDK10)驱动开发环境配置

    1.     概述 微软在"WDK7600"以后就不再提供独立的内核驱动开发包了,而是必须首先安装微软集成开发环境VisualStudio,然后再从微软官网下载集成的WDK开发包. ...

  9. windows 驱动开发基础(二)事件通知---关于irp处理,DPC,链表等

    代码来源及参考:wdk 7,路径:C:\WinDDK\7600.16385.1\src\general\event 这个例子演示了两种关于当硬件事件发生时,驱动如何通知应用程序的方法.一种是基于eve ...

最新文章

  1. (转)如何从storyBoard中加载其中一个controller
  2. 第01章 初识Mysql
  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
  4. IE浏览器下如何低延迟播放RTSP或RTMP流
  5. JavaScript输入输出
  6. windows下JDK版本之间的切换
  7. 谈谈我在自然语言处理进阶上的一些个人拙见
  8. java导入hbase_如何用java导入hbase.dat文件
  9. 度量 数据突变_使用K-Means和PCA进行基因组序列分析 COVID-19接下来如何突变?
  10. LabVIEW编程LabVIEW开发Thorlabs电机例程与相关资料
  11. ValueError: operands could not be broadcast together with remapped shapes 解决方法
  12. 我本一心向明月,奈何明月照沟渠。真是知我者谓我心忧,不知我者谓我何求啊。
  13. 抛物线交点式公式_抛物线所有公式,抛物线是什么意思
  14. Android Muti-Window
  15. git fatal: detected dubious ownership in repository
  16. 小学生学计算机flash,利用Flash软件进行小学电脑绘画教学
  17. C#使用GetPixel函数获取指定坐标点的rgb值
  18. C#工控上位机开发-->1、C#快速编程入门
  19. linux学习笔记:网络诊断工具-mtr命令
  20. 网络安全(三 漏洞的抓取与挖掘)

热门文章

  1. 计算机基础-将机械硬盘换成固态硬盘
  2. win8.1系统在线安装VS2017出现Internet连接问题的解决办法
  3. 仿微信发朋友圈获取定位
  4. Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接
  5. 刷题之旅第35站,CTF show 萌新题目集合
  6. xp怎么删除计算机管理员用户,windowsXP如何显示Administrator账户/如何删除计算机管理员权限的账户/如何更改账户名...
  7. java实现数字转大写
  8. 转载:机器学习算法工程师秋招总结
  9. java校招笔试题目_Java校招笔试题
  10. ppt关闭受保护视图