EXE部分

head.h

[cpp] view plaincopy
  1. #ifndef   CTL_CODE
  2. #pragma message("\n \n-----------EXE . Include winioctl.h ")
  3. #include<winioctl.h> //CTL_CODE ntddk.h wdm.h
  4. #else
  5. #pragma message("\n \n----------SYS  NO Include winioctl.h ")
  6. #endif
  7. #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x800,  METHOD_NEITHER,FILE_ANY_ACCESS)
  8. #define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x801,  METHOD_NEITHER,FILE_ANY_ACCESS)

main.cpp

[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include <tchar.h>
  3. #include <windows.h>
  4. #include "head.h"
  5. int  add (HANDLE hDevice ,int a,int b)
  6. {
  7. int port[2]={a,b};
  8. int bufret=0;
  9. ULONG dwWrite=0;
  10. DeviceIoControl(hDevice,add_code,&port,sizeof(port),&bufret,sizeof(bufret),&dwWrite,NULL);
  11. return bufret;
  12. }
  13. int main (void)
  14. {
  15. getchar();
  16. getchar();
  17. HANDLE hDevice=CreateFile(TEXT("\\\\.\\My_DriverLinkName"),
  18. GENERIC_READ|GENERIC_WRITE,
  19. 0,
  20. NULL,
  21. OPEN_EXISTING,
  22. FILE_ATTRIBUTE_NORMAL,
  23. NULL);
  24. if (hDevice==INVALID_HANDLE_VALUE)
  25. {
  26. printf("打开设备失败\n");
  27. getchar();
  28. getchar();
  29. return 0;
  30. }
  31. int k=add(hDevice,11,22);
  32. printf("%d\n",k);
  33. getchar();
  34. getchar();
  35. return 0;
  36. }

SYS部分

head.h

[cpp] view plaincopy
  1. #ifndef   CTL_CODE
  2. #pragma message("\n \n-----------EXE . Include winioctl.h ")
  3. #include<winioctl.h> //CTL_CODE ntddk.h wdm.h
  4. #else
  5. #pragma message("\n \n----------SYS  NO Include winioctl.h ")
  6. #endif
  7. #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x800,  METHOD_NEITHER,FILE_ANY_ACCESS)
  8. #define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x801,  METHOD_NEITHER,FILE_ANY_ACCESS)

cpp部分

[cpp] view plaincopy
  1. #include <ntdef.h>
  2. #include <ntddk.h>
  3. #include "head.h"
  4. #ifdef __cplusplus
  5. extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);
  6. #endif
  7. NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp );
  8. void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject);
  9. NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject);
  10. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
  11. {
  12. DbgPrint("Hello from TestDDK125096!\n");
  13. DriverObject->DriverUnload = TestDDK125096Unload;
  14. DriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
  15. DriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
  16. DriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
  17. DriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
  18. DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
  19. CreateMyDevice(DriverObject);//创建相应的设备
  20. return STATUS_SUCCESS;
  21. }
  22. void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject)
  23. {
  24. DbgPrint("Goodbye from TestDDK125096!\n");
  25. PDEVICE_OBJECT pDev;//用来取得要删除设备对象
  26. UNICODE_STRING symLinkName; //
  27. pDev=DriverObject->DeviceObject;
  28. IoDeleteDevice(pDev); //删除设备
  29. //取符号链接名字
  30. RtlInitUnicodeString(&symLinkName,L"\\??\\My_DriverLinkName");
  31. //删除符号链接
  32. IoDeleteSymbolicLink(&symLinkName);
  33. KdPrint(("驱动成功被卸载...OK-----------")); //sprintf,printf
  34. //取得要删除设备对象
  35. //删掉所有设备
  36. DbgPrint("卸载成功");
  37. }
  38. NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp )
  39. {   //
  40. ULONG info;
  41. //得到当前栈指针
  42. PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
  43. ULONG mf=stack->MajorFunction;//区分IRP
  44. switch (mf)
  45. {
  46. case IRP_MJ_DEVICE_CONTROL:
  47. {
  48. KdPrint(("Enter myDriver_DeviceIOControl\n"));
  49. NTSTATUS status = STATUS_SUCCESS;
  50. //得到输入缓冲区大小
  51. ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
  52. //得到输出缓冲区大小
  53. ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
  54. //得到IOCTL码
  55. ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
  56. switch (code)
  57. {
  58. case add_code:
  59. {
  60. int a,b;
  61. KdPrint(("add_code 1111111111111111111\n"));
  62. int * InputBuffer=(int*)stack->Parameters.DeviceIoControl.Type3InputBuffer;
  63. __try
  64. {
  65. ProbeForRead(InputBuffer,cbin,__alignof(int));//sizeof(XX)
  66. _asm
  67. {
  68. mov eax,InputBuffer
  69. mov ebx,[eax]
  70. mov a,ebx
  71. mov ebx,[eax+4]
  72. mov b,ebx
  73. }
  74. KdPrint(("a=%d,b=%d \n", a,b));
  75. a=a+b;
  76. int* OutputBuffer=(int*)pIrp->UserBuffer;
  77. ProbeForWrite(OutputBuffer,cbout,sizeof(int));
  78. KdPrint(("OutputBuffer=%x",OutputBuffer));
  79. _asm
  80. {
  81. mov eax,a
  82. mov ebx,OutputBuffer
  83. mov [ebx],eax //bufferet=a+b
  84. }
  85. KdPrint(("a+b=%d \n",a));
  86. }
  87. __except(EXCEPTION_EXECUTE_HANDLER)
  88. {
  89. KdPrint(("指定地址不可读 或者 写 \n"));
  90. }
  91. //设置实际操作输出缓冲区长度
  92. info = 4;
  93. break;
  94. }
  95. case sub_code:
  96. {
  97. break;
  98. }
  99. }//end code switch
  100. break;
  101. }
  102. case IRP_MJ_CREATE:
  103. {
  104. break;
  105. }
  106. case IRP_MJ_CLOSE:
  107. {
  108. break;
  109. }
  110. case IRP_MJ_READ:
  111. {
  112. break;
  113. }
  114. }
  115. //对相应的IPR进行处理
  116. pIrp->IoStatus.Information=info;//设置操作的字节数为0,这里无实际意义
  117. pIrp->IoStatus.Status=STATUS_SUCCESS;//返回成功
  118. IoCompleteRequest(pIrp,IO_NO_INCREMENT);//指示完成此IRP
  119. KdPrint(("离开派遣函数\n"));//调试信息
  120. return STATUS_SUCCESS; //返回成功
  121. }
  122. NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject)
  123. {
  124. NTSTATUS status;
  125. PDEVICE_OBJECT pDevObj;/*用来返回创建设备*/
  126. //创建设备名称
  127. UNICODE_STRING devName;
  128. UNICODE_STRING symLinkName; //
  129. RtlInitUnicodeString(&devName,L"\\Device\\125DDK_Device");/*对devName初始化字串为 "\\Device\\125DDK_Device"*/
  130. //创建设备
  131. status = IoCreateDevice( pDriverObject,\
  132. 0,\
  133. &devName,\
  134. FILE_DEVICE_UNKNOWN,\
  135. 0, TRUE,\
  136. &pDevObj);
  137. if (!NT_SUCCESS(status))
  138. {
  139. if (status==STATUS_INSUFFICIENT_RESOURCES)
  140. {
  141. KdPrint(("资源不足 STATUS_INSUFFICIENT_RESOURCES"));
  142. }
  143. if (status==STATUS_OBJECT_NAME_EXISTS )
  144. {
  145. KdPrint(("指定对象名存在"));
  146. }
  147. if (status==STATUS_OBJECT_NAME_COLLISION)
  148. {
  149. KdPrint(("//对象名有冲突"));
  150. }
  151. KdPrint(("设备创建失败...++++++++"));
  152. return status;
  153. }
  154. KdPrint(("设备创建成功...++++++++"));
  155. pDevObj->Flags |= DO_BUFFERED_IO;
  156. //创建符号链接
  157. RtlInitUnicodeString(&symLinkName,L"\\??\\My_DriverLinkName");
  158. status = IoCreateSymbolicLink( &symLinkName,&devName );
  159. if (!NT_SUCCESS(status)) /*status等于0*/
  160. {
  161. IoDeleteDevice( pDevObj );
  162. return status;
  163. }
  164. return STATUS_SUCCESS;
  165. }

EXE与SYS通信(其他模式)相关推荐

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

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

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

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

  3. EXE和SYS通信IOCTL方式

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

  4. EXE和SYS通信(ReadFile WriteFile) 其他方式

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

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

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

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

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

  7. 基于SYSBIOS GIO接口的uart通信DMA模式

    基于SYSBIOS GIO接口的uart通信DMA模式(不定长接收) 硬件:TMS320C6748 (创龙开发板) bsp: bios_6_37_03_30 相对裸机版的Uart dma配置,SYSB ...

  8. 网络电话如何营造成熟的通信商业模式

    在现如今越来越多的手机用户大呼根本离不开微信等热门互联网即时通讯工具的今天,电话通信是否真正已经成为让人感到无奈的"昨日黄花"?最为直接和相对简单的两个例子:对于海量外出务工者来说 ...

  9. 遭遇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 第 ...

最新文章

  1. 介绍一个效率爆表的数据采集框架
  2. 【RecyclerView】 十三、RecyclerView 数据更新 ( 移动数据 | 数据改变 )
  3. OpenCV cv::CascadeClassifier人脸检测的实例(附完整代码)
  4. 自己动手写UI库——引入ExtJs(布局)
  5. java native 关键字
  6. acfun html5 转换,AcFun剧场模式插件
  7. Android通过堆栈信息解决ANR问题
  8. 洛谷 P1090 合并果子
  9. (3)Matplotlib_subplot, subplots
  10. html解压zip文件怎么打开方式,zip文件是什么文件,如何打开zip格式的文件?
  11. CMS漏洞检测工具 – CMSmap
  12. python实现21根火柴游戏
  13. 您的自动化测试糟透了
  14. k8s 拉取镜像失败_k8s 无法拉取阿里云仓库镜像
  15. 计算机电缆的表示方式,各种电缆型号的表示方法
  16. 五款开源图像处理软件
  17. nginx 访问状态统计 访问控制 虚拟主机
  18. 破解创维酷开电视安装第三方应用限制以及替换默认桌面应用突破笔记
  19. RestTemplate调用微信小程接口异常:RestClientException: Could not extract response: no suitable HttpMessageConve
  20. 辗转相除法(C语言)

热门文章

  1. Log4j的快速入门
  2. 数据类型转换_注意事项
  3. php arcode svg,在react中使用svg的各种方法总结(附代码)
  4. 【面向过程编程】零钱通项目
  5. java1121123211234321_使用for 语句打印显示下列数字形式:n=4 1 1 2 1 1 2 ,使用for 语句打印显示下列数字形式:n=4...
  6. mac上配置php开发环境,Mac配置PHP开发环境
  7. 解决MySQL删除外键时报错Error Code: 1091. Can‘t DROP ‘XXX‘; check that column/key exists
  8. PHP mail()可能导致的问题
  9. 专业的PDF组件Spire.PDF for .NET V3.9.124发布|支持图标布局
  10. mongodb清洗数据