EXE部分

[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. int main (void)
  4. {
  5. char linkname[]="\\\\.\\HelloDDK";
  6. HANDLE hDevice = CreateFileA(linkname,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  7. if (hDevice == INVALID_HANDLE_VALUE)
  8. {
  9. printf("Win32 error code: %d\n",GetLastError());
  10. return 1;
  11. }
  12. UCHAR buffer[10]={0};
  13. ULONG ulRead=0;
  14. if (ReadFile(hDevice,buffer,10,&ulRead,NULL))
  15. {
  16. printf("Read %d bytes:",ulRead);
  17. for (int i=0;i<(int)ulRead;i++)
  18. {
  19. printf("%02X ",buffer[i]);
  20. }
  21. printf("\n");
  22. }
  23. getchar();
  24. getchar();
  25. ulRead=0;
  26. if (WriteFile(hDevice,buffer,10,&ulRead,NULL))
  27. {
  28. printf("write %d bytes\n",ulRead);
  29. for (int i=0;i<(int)ulRead;i++)
  30. {
  31. printf("%02X ",buffer[i]);
  32. }
  33. printf("\n");
  34. }
  35. CloseHandle(hDevice);
  36. getchar();
  37. getchar();
  38. return 0;
  39. }

SYS部分

[cpp] view plaincopy
  1. #pragma once
  2. #include <ntddk.h>
  3. #define CountArray(Array)  (    sizeof(Array)   /   sizeof(Array[0])    )
  4. #define MAX_FILE_LENGTH 1024
  5. typedef struct _DEVICE_EXTENSION
  6. {
  7. PDEVICE_OBJECT pDevice;                                     //设备对象
  8. UNICODE_STRING ustrDeviceName;                  //设备名称
  9. UNICODE_STRING ustrSymLinkName;                 //符号名称
  10. PUCHAR      buffer;                                                 //缓冲区指针
  11. ULONG       file_length;                                            //缓冲区长度
  12. }DEVICE_EXTENSION,*PDEVICE_EXTENSION;
  13. #ifdef __cplusplus
  14. extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);
  15. #endif
  16. void HelloUnload(IN PDRIVER_OBJECT DriverObject);                                                       //卸载函数
  17. NTSTATUS CreateDevice(PDRIVER_OBJECT PDevObj);                                                  //创建设备
  18. NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);   //派遣函数
  19. NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrP);                      //读请求派遣函数
  20. NTSTATUS HelloDDKWrite(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrP);                     //写请求派遣函数
[cpp] view plaincopy
  1. #include "hello.h"
  2. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
  3. {
  4. DbgPrint("Hello from!\n");
  5. DriverObject->DriverUnload = HelloUnload;
  6. for (int i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
  7. {
  8. DriverObject->MajorFunction[i]=HelloDDKDispatchRoutine;
  9. }
  10. DriverObject->MajorFunction[IRP_MJ_READ]=HelloDDKRead;           //设置读派遣函数
  11. DriverObject->MajorFunction[IRP_MJ_WRITE]=HelloDDKWrite;     //设置写派遣函数
  12. //#if DBG
  13. //      _asm int 3
  14. //#endif
  15. //创建设备
  16. CreateDevice(DriverObject);
  17. return STATUS_SUCCESS;
  18. }
  19. //读派遣函数
  20. NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrP)
  21. {
  22. //#if DBG
  23. //  _asm int 3
  24. //#endif
  25. PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;
  26. NTSTATUS status=STATUS_SUCCESS;
  27. PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrP);                            //获取当前堆栈
  28. ULONG ulReadLength=stack->Parameters.Read.Length;                                            //获取读的长度
  29. ULONG ulReadOffset=(ULONG)stack->Parameters.Read.ByteOffset.QuadPart;    //获取读的偏移
  30. PVOID user_address=pIrP->UserBuffer;                                                                         //获取用户模式地址
  31. if (user_address==NULL)
  32. {
  33. ASSERT(FALSE);
  34. //完成IRP
  35. pIrP->IoStatus.Status=STATUS_UNSUCCESSFUL;                                   //设置完成状态
  36. pIrP->IoStatus.Information=0;                                                                    //设置读取长度
  37. IoCompleteRequest(pIrP,IO_NO_INCREMENT);                                        //完成IRP
  38. return status;
  39. }
  40. DbgPrint("0X%0X\n",user_address);
  41. __try
  42. {
  43. //判断指针是否可写
  44. ProbeForWrite(user_address,ulReadLength,4);
  45. memset(user_address,0XAA,ulReadLength);
  46. DbgPrint("测试下");
  47. }
  48. __except(EXCEPTION_EXECUTE_HANDLER)
  49. {
  50. DbgPrint("打我PG我不乖\n");
  51. status=STATUS_UNSUCCESSFUL;
  52. }
  53. //完成IRP
  54. pIrP->IoStatus.Status=status;                                                                    //设置完成状态
  55. pIrP->IoStatus.Information=ulReadLength;                                         //设置读取长度
  56. IoCompleteRequest(pIrP,IO_NO_INCREMENT);                                        //完成IRP
  57. return status;
  58. }
  59. //写派遣函数
  60. NTSTATUS HelloDDKWrite(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrP)
  61. {
  62. //#if DBG
  63. //  _asm int 3
  64. //#endif
  65. PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;
  66. NTSTATUS status=STATUS_SUCCESS;
  67. PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrP);
  68. ULONG ulWriteLength=stack->Parameters.Read.Length;                                           //获取写的长度
  69. ULONG ulReadOffset=(ULONG)stack->Parameters.Read.ByteOffset.QuadPart;    //获取写的偏移
  70. PVOID user_address=pIrP->UserBuffer;                                                                         //获取用户模式地址
  71. if (user_address==NULL)
  72. {
  73. ASSERT(FALSE);
  74. //完成IRP
  75. pIrP->IoStatus.Status=STATUS_UNSUCCESSFUL;                                   //设置完成状态
  76. pIrP->IoStatus.Information=0;                                                                    //设置读取长度
  77. IoCompleteRequest(pIrP,IO_NO_INCREMENT);                                        //完成IRP
  78. return status;
  79. }
  80. DbgPrint("0X%0X\n",user_address);
  81. __try
  82. {
  83. //判断指针是否可写
  84. ProbeForWrite(user_address,ulWriteLength,4);
  85. UCHAR buffer[10]={0};
  86. memcpy(buffer,user_address,ulWriteLength);
  87. for (int i=0;i<(int)ulWriteLength;i++)
  88. {
  89. DbgPrint("%02x\n",buffer[i]);
  90. }
  91. memset(user_address,0XAA,ulWriteLength);
  92. DbgPrint("测试下");
  93. }
  94. __except(EXCEPTION_EXECUTE_HANDLER)
  95. {
  96. DbgPrint("打我PG我不乖\n");
  97. status=STATUS_UNSUCCESSFUL;
  98. }
  99. //完成IRP
  100. pIrP->IoStatus.Status=status;                                                                    //设置完成状态
  101. pIrP->IoStatus.Information=ulWriteLength;                                            //设置写取长度
  102. IoCompleteRequest(pIrP,IO_NO_INCREMENT);                                        //完成IRP
  103. return status;
  104. }
  105. //卸载函数
  106. void HelloUnload(IN PDRIVER_OBJECT DriverObject)
  107. {
  108. DbgPrint("Goodbye from!\n");
  109. PDEVICE_OBJECT pNextObj=NULL;
  110. pNextObj=DriverObject->DeviceObject;
  111. while (pNextObj)
  112. {
  113. PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pNextObj->DeviceExtension;
  114. //释放内存
  115. if (pDevExt->buffer)
  116. {
  117. ExFreePool(pDevExt->buffer);
  118. pDevExt->buffer=NULL;
  119. }
  120. //删除符号连接
  121. IoDeleteSymbolicLink(&pDevExt->ustrSymLinkName);
  122. //删除设备
  123. IoDeleteDevice(pDevExt->pDevice);
  124. pNextObj=pNextObj->NextDevice;
  125. }
  126. }
  127. //创建设备
  128. NTSTATUS CreateDevice(PDRIVER_OBJECT pDriver_Object)
  129. {
  130. //定义变量
  131. NTSTATUS status=STATUS_SUCCESS;
  132. PDEVICE_OBJECT pDevObje=NULL;
  133. PDEVICE_EXTENSION pDevExt=NULL;
  134. //初始化字符串
  135. UNICODE_STRING devname;
  136. UNICODE_STRING symLinkName;
  137. RtlInitUnicodeString(&devname,L"\\device\\hello");
  138. RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
  139. //创建设备
  140. if (IoCreateDevice(pDriver_Object,sizeof(PDEVICE_EXTENSION),&devname,FILE_DEVICE_UNKNOWN,NULL,TRUE,&pDevObje)!=STATUS_SUCCESS )
  141. {
  142. DbgPrint("创建设备失败\n");
  143. return status;
  144. }
  145. pDevExt=(PDEVICE_EXTENSION)pDevObje->DeviceExtension;
  146. pDevExt->pDevice=pDevObje;
  147. pDevExt->ustrDeviceName=devname;
  148. pDevExt->ustrSymLinkName=symLinkName;
  149. //申请模拟文件的缓冲区
  150. pDevExt->buffer=(PUCHAR)ExAllocatePool(PagedPool,MAX_FILE_LENGTH);
  151. pDevExt->file_length=0;
  152. if (pDevExt->buffer==NULL)
  153. {
  154. DbgPrint("内存分配失败\n");
  155. }
  156. //创建符号连接
  157. if (IoCreateSymbolicLink(&symLinkName,&devname)!=STATUS_SUCCESS )
  158. {
  159. DbgPrint("创建符号连接失败\n");
  160. IoDeleteDevice(pDevObje);
  161. return status;
  162. }
  163. return STATUS_SUCCESS;
  164. }
  165. //派遣函数
  166. NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrP)
  167. {
  168. //#if DBG
  169. //  _asm int 3
  170. //#endif
  171. PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrP);
  172. //建立一个字符串数组与IRP类型对应起来
  173. static char* irpname[] =
  174. {
  175. "IRP_MJ_CREATE",
  176. "IRP_MJ_CREATE_NAMED_PIPE",
  177. "IRP_MJ_CLOSE",
  178. "IRP_MJ_READ",
  179. "IRP_MJ_WRITE",
  180. "IRP_MJ_QUERY_INFORMATION",
  181. "IRP_MJ_SET_INFORMATION",
  182. "IRP_MJ_QUERY_EA",
  183. "IRP_MJ_SET_EA",
  184. "IRP_MJ_FLUSH_BUFFERS",
  185. "IRP_MJ_QUERY_VOLUME_INFORMATION",
  186. "IRP_MJ_SET_VOLUME_INFORMATION",
  187. "IRP_MJ_DIRECTORY_CONTROL",
  188. "IRP_MJ_FILE_SYSTEM_CONTROL",
  189. "IRP_MJ_DEVICE_CONTROL",
  190. "IRP_MJ_INTERNAL_DEVICE_CONTROL",
  191. "IRP_MJ_SHUTDOWN",
  192. "IRP_MJ_LOCK_CONTROL",
  193. "IRP_MJ_CLEANUP",
  194. "IRP_MJ_CREATE_MAILSLOT",
  195. "IRP_MJ_QUERY_SECURITY",
  196. "IRP_MJ_SET_SECURITY",
  197. "IRP_MJ_POWER",
  198. "IRP_MJ_SYSTEM_CONTROL",
  199. "IRP_MJ_DEVICE_CHANGE",
  200. "IRP_MJ_QUERY_QUOTA",
  201. "IRP_MJ_SET_QUOTA",
  202. "IRP_MJ_PNP",
  203. };
  204. UCHAR type = stack->MajorFunction;
  205. if (type >= CountArray(irpname))
  206. KdPrint(("无效的IRP类型 %X\n", type));
  207. else
  208. KdPrint(("%s\n", irpname[type]));
  209. pIrP->IoStatus.Status=STATUS_SUCCESS;                    //设置完成状态
  210. pIrP->IoStatus.Information=0;                                        //设置操作字节为0
  211. IoCompleteRequest(pIrP,IO_NO_INCREMENT);            //结束IRP派遣函数,第二个参数表示不增加优先级
  212. return STATUS_SUCCESS;
  213. }

EXE和SYS通信(ReadFile WriteFile) 其他方式相关推荐

  1. EXE和SYS通信(ReadFile WriteFile DO_DIRECT_IO) 直接方式

    EXE部分 [cpp] view plaincopy #include <stdio.h> #include <Windows.h> int main (void) { cha ...

  2. EXE和SYS通信(ReadFile WriteFile DO_BUFFERED_IO) 缓冲区方式

    EXE部分 [cpp] view plaincopy #include <stdio.h> #include <Windows.h> int main (void) { cha ...

  3. EXE和SYS通信IOCTL方式

    EXE部分 [cpp] view plaincopy #ifndef  IOCTLS_H #define  IOCTLS_H #ifndef CTL_CODE #pragma  message(&qu ...

  4. EXE与SYS通信(直接访问模式)

    CTL_CODE(DeviceType,Function,Method,Acess); Method是指定数据传递的模式 有这几个值: METHOD_BUFFERED //使用缓冲区方式操作 0 ME ...

  5. EXE与SYS通信(缓冲模式)

    EXE部分 head.h [cpp] view plaincopy #include<winioctl.h> //CTL_CODE #define add_code CTL_CODE(FI ...

  6. EXE与SYS通信(其他模式)

    EXE部分 head.h [cpp] view plaincopy #ifndef   CTL_CODE #pragma message("\n \n-----------EXE . Inc ...

  7. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  8. 遭遇svchoct.exe,vonine.exe,HBKernel32.sys,ssdtti.sys,System.exe,ublhbztl.sys等2

    遭遇svchoct.exe,vonine.exe,HBKernel32.sys,ssdtti.sys,System.exe,ublhbztl.sys等2 endurer 原创 2008-10-23 第 ...

  9. (转)GPS导航芯片中串口通信同步I/O方式的程序设计

    GPS导航芯片中串口通信同步I/O方式的程序设计 时间:2011-01-25 11:38    作者:    来源: Windows CE 是一个开放的.可裁剪的.32位实时嵌入式窗口操作系统,具有可 ...

最新文章

  1. 2018/8/28-29 Some metaheuristics should be simplified
  2. Lvs 负载均衡之nat模式配置
  3. VS.net下编写makefile文件--NMAKE用法
  4. spring源码分析第五天------springAOP核心原理及源码分析
  5. Nginx——配置文件
  6. 依图做语音了!识别精度创中文语音识别新高点
  7. CDA Day1-3 Excel公式常用函数跟课学习
  8. 三边定位的最小二乘法运用
  9. Xcode打包IPA包
  10. 技术人员的等级划分和资质要求
  11. 聚沙成塔--爬虫系列(四)(爬取糗事百科段子)
  12. git和github使用
  13. 【解决方案】网络异常流量突发分析
  14. 计算机毕业设计ssm文档资料管理系统
  15. Axure谷歌浏览器Chrome扩展程序安装方法
  16. Linux的下Ip计算器
  17. 小米9私密相册怎么找_小米手机私密相册怎么用?怎么打开查看?
  18. 自定义View进阶-手绘地图(二)
  19. 小程序云开发学习笔记(二)
  20. 脚手架的这个好搭档 今天要重点来介绍下!

热门文章

  1. RocketMQ各种集群模式介绍
  2. flume案例-网络数据采集-Flume的配置
  3. 基于jwt的用户鉴权:拦截器概述
  4. Zookeeper的概述
  5. 数据库-数据库的备份与恢复
  6. Stream流中的常用方法_map
  7. 【SpringBoot零基础案例08】【IEDA 2021.1】SpringBoot获取核心配置文件application.properties中的自定义配置
  8. Allegro PCB 如何测量距离?比如走线之间的距离
  9. mongo数据库单节点搭建
  10. 《CDN 之我见》原理篇——CDN的由来与调度