EXE部分

head.h

[cpp] view plaincopy
  1. #include<winioctl.h> //CTL_CODE
  2. #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x800,  METHOD_BUFFERED,FILE_ANY_ACCESS)
  3. #define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x801,  METHOD_BUFFERED,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

#define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x800,  METHOD_BUFFERED,FILE_ANY_ACCESS)
#define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x801,  METHOD_BUFFERED,FILE_ANY_ACCESS)
#include <ntdef.h>
#include <ntddk.h>
#include "ctl_code.h"    #ifdef __cplusplus
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);
#endif    NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp );
void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject);     NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
{    DbgPrint("Hello from TestDDK125096!\n");    DriverObject->DriverUnload = TestDDK125096Unload;    DriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数    DriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CLOSE相关IRP处理函数    DriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_READ相关IRP处理函数    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL; //IRP_MJ_DEVICE_CONTROL相关IRP处理函数    CreateMyDevice(DriverObject);//创建相应的设备    return STATUS_SUCCESS;
}    void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject)
{    DbgPrint("Goodbye from TestDDK125096!\n");    PDEVICE_OBJECT pDev;//用来取得要删除设备对象    UNICODE_STRING symLinkName; //     pDev=DriverObject->DeviceObject;    IoDeleteDevice(pDev); //删除设备    //取符号链接名字    RtlInitUnicodeString(&symLinkName,L"\\??\\My_DriverLinkName");    //删除符号链接    IoDeleteSymbolicLink(&symLinkName);    KdPrint(("驱动成功被卸载...OK-----------")); //sprintf,printf    //取得要删除设备对象    //删掉所有设备    DbgPrint("卸载成功");    }    NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp )
{   //    ULONG info;    //得到当前栈指针    PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);    ULONG mf=stack->MajorFunction;//区分IRP    switch (mf)    {    case IRP_MJ_DEVICE_CONTROL:    {     KdPrint(("Enter myDriver_DeviceIOControl\n"));    NTSTATUS status = STATUS_SUCCESS;       //得到输入缓冲区大小    ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;    //得到输出缓冲区大小    ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;    //得到IOCTL码    ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;    switch (code)    {     case add_code:    {           int a,b;    KdPrint(("add_code 1111111111111111111\n"));    //缓冲区方式IOCTL    //获取缓冲区数据   a,b         int * InputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;    _asm    {    mov eax,InputBuffer    mov ebx,[eax]    mov a,ebx    mov ebx,[eax+4]    mov b,ebx    }    KdPrint(("a=%d,b=%d \n", a,b));    a=a+b;    //C、驱动层返回数据至用户层    //操作输出缓冲区    int* OutputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;    _asm    {    mov eax,a    mov ebx,OutputBuffer    mov [ebx],eax //bufferet=a+b    }    KdPrint(("a+b=%d \n",a));    //设置实际操作输出缓冲区长度    info = 4;    break;    }    case sub_code:    {    break;    }    }//end code switch    break;    }    case IRP_MJ_CREATE:    {    break;    }    case IRP_MJ_CLOSE:    {    break;    }    case IRP_MJ_READ:    {    break;    }    }    //对相应的IPR进行处理    pIrp->IoStatus.Information=info;//设置操作的字节数为0,这里无实际意义    pIrp->IoStatus.Status=STATUS_SUCCESS;//返回成功    IoCompleteRequest(pIrp,IO_NO_INCREMENT);//指示完成此IRP    KdPrint(("离开派遣函数\n"));//调试信息    return STATUS_SUCCESS; //返回成功
}    NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject)
{    NTSTATUS status;    PDEVICE_OBJECT pDevObj;/*用来返回创建设备*/    //创建设备名称    UNICODE_STRING devName;    UNICODE_STRING symLinkName; //     RtlInitUnicodeString(&devName,L"\\Device\\125DDK_Device");/*对devName初始化字串为 "\\Device\\125DDK_Device"*/    //创建设备    status = IoCreateDevice( pDriverObject,\0,\&devName,\FILE_DEVICE_UNKNOWN,\0, TRUE,\&pDevObj);if (!NT_SUCCESS(status))    {    if (status==STATUS_INSUFFICIENT_RESOURCES)    {    KdPrint(("资源不足 STATUS_INSUFFICIENT_RESOURCES"));    }    if (status==STATUS_OBJECT_NAME_EXISTS )    {    KdPrint(("指定对象名存在"));    }    if (status==STATUS_OBJECT_NAME_COLLISION)    {    KdPrint(("//对象名有冲突"));    }    KdPrint(("设备创建失败...++++++++"));    return status;    }    KdPrint(("设备创建成功...++++++++"));    pDevObj->Flags |= DO_BUFFERED_IO;    //创建符号链接    RtlInitUnicodeString(&symLinkName,L"\\??\\My_DriverLinkName");    status = IoCreateSymbolicLink( &symLinkName,&devName );    if (!NT_SUCCESS(status)) /*status等于0*/    {    IoDeleteDevice( pDevObj );    return status;    }    return STATUS_SUCCESS;
}

EXE与SYS通信(缓冲模式)相关推荐

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

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

  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. php mysql 非扫描,PHP的中使用非缓冲模式查询数据库的方法

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

最新文章

  1. 皮一皮:现在当爹妈的不容易...
  2. No module named 'dlframework.common.utils.local'
  3. 事务消息应用场景、实现原理与项目实战
  4. Listview中使用线程实现无限加载更多项目的功能
  5. java进程和线程_Java™ 教程(进程和线程)
  6. 重写equals()与hashCode()方法
  7. 企业家“大战”初代网红:李彦宏、董明珠、罗永浩同时直播,谁更秀?
  8. python字符串join和+_Python字符串通过'+'和join函数拼接新字符串的性能测试比较
  9. php开发自学经典.pdf_PHP从入门到精通(第4版) 明日科技 中文完整pdf扫描版[42MB]
  10. IT十大风云人物(转水冰洋)
  11. 被讨厌的勇气:共同体感觉
  12. bootstrap btn 按钮颜色
  13. mysql 语句 面试题
  14. linux挂载ntfs格式分区,Linux上挂载NTFS分区(Mount)
  15. HTML怎么跟随页面缩放,如何让网页跟着 浏览器全比例缩小(示例代码)
  16. Flutter-解决Try catch出现异常:type ‘_TypeError‘ is not a subtype of type ‘Exception‘ in type cast
  17. oracle 基础dbms错误,更改对 DBMS 错误的响应
  18. Qt动态翻译不生效!
  19. 微信小程序如何实现上拉刷新(即分页加载数据)?
  20. Python中的base64、base32实例

热门文章

  1. 课程分类管理-添加课程分类
  2. 注解_案例_简单的测试框架
  3. RocketMQ的历史发展
  4. 单点登录Redis存储Session及SessionId问题说明与集群实战-2
  5. 200917阶段一C++双向链表模板
  6. 河南版权登记,给自己的“孩子”一个身份证
  7. CSS中的position定位
  8. 关于Web报表FineReport打印的开发应用案例
  9. bzoj 3343 教主的魔法 分块
  10. [转载][工具]Secure CRT 自动记录日志和时间戳功能配置的方法