EXE与SYS通信(缓冲模式)
EXE部分
head.h
- #include<winioctl.h> //CTL_CODE
- #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)
main.cpp
- #include <stdio.h>
- #include <tchar.h>
- #include <windows.h>
- #include "head.h"
- int add (HANDLE hDevice ,int a,int b)
- {
- int port[2]={a,b};
- int bufret=0;
- ULONG dwWrite=0;
- DeviceIoControl(hDevice,add_code,&port,sizeof(port),&bufret,sizeof(bufret),&dwWrite,NULL);
- return bufret;
- }
- int main (void)
- {
- getchar();
- getchar();
- HANDLE hDevice=CreateFile(TEXT("\\\\.\\My_DriverLinkName"),
- GENERIC_READ|GENERIC_WRITE,
- 0,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (hDevice==INVALID_HANDLE_VALUE)
- {
- printf("打开设备失败\n");
- getchar();
- getchar();
- return 0;
- }
- int k=add(hDevice,11,22);
- printf("%d\n",k);
- getchar();
- getchar();
- return 0;
- }
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通信(缓冲模式)相关推荐
- EXE与SYS通信(其他模式)
EXE部分 head.h [cpp] view plaincopy #ifndef CTL_CODE #pragma message("\n \n-----------EXE . Inc ...
- EXE与SYS通信(直接访问模式)
CTL_CODE(DeviceType,Function,Method,Acess); Method是指定数据传递的模式 有这几个值: METHOD_BUFFERED //使用缓冲区方式操作 0 ME ...
- EXE和SYS通信IOCTL方式
EXE部分 [cpp] view plaincopy #ifndef IOCTLS_H #define IOCTLS_H #ifndef CTL_CODE #pragma message(&qu ...
- EXE和SYS通信(ReadFile WriteFile) 其他方式
EXE部分 [cpp] view plaincopy #include <stdio.h> #include <Windows.h> int main (void) { cha ...
- EXE和SYS通信(ReadFile WriteFile DO_DIRECT_IO) 直接方式
EXE部分 [cpp] view plaincopy #include <stdio.h> #include <Windows.h> int main (void) { cha ...
- EXE和SYS通信(ReadFile WriteFile DO_BUFFERED_IO) 缓冲区方式
EXE部分 [cpp] view plaincopy #include <stdio.h> #include <Windows.h> int main (void) { cha ...
- 基于SYSBIOS GIO接口的uart通信DMA模式
基于SYSBIOS GIO接口的uart通信DMA模式(不定长接收) 硬件:TMS320C6748 (创龙开发板) bsp: bios_6_37_03_30 相对裸机版的Uart dma配置,SYSB ...
- 网络电话如何营造成熟的通信商业模式
在现如今越来越多的手机用户大呼根本离不开微信等热门互联网即时通讯工具的今天,电话通信是否真正已经成为让人感到无奈的"昨日黄花"?最为直接和相对简单的两个例子:对于海量外出务工者来说 ...
- php mysql 非扫描,PHP的中使用非缓冲模式查询数据库的方法
最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...
最新文章
- 皮一皮:现在当爹妈的不容易...
- No module named 'dlframework.common.utils.local'
- 事务消息应用场景、实现原理与项目实战
- Listview中使用线程实现无限加载更多项目的功能
- java进程和线程_Java™ 教程(进程和线程)
- 重写equals()与hashCode()方法
- 企业家“大战”初代网红:李彦宏、董明珠、罗永浩同时直播,谁更秀?
- python字符串join和+_Python字符串通过'+'和join函数拼接新字符串的性能测试比较
- php开发自学经典.pdf_PHP从入门到精通(第4版) 明日科技 中文完整pdf扫描版[42MB]
- IT十大风云人物(转水冰洋)
- 被讨厌的勇气:共同体感觉
- bootstrap btn 按钮颜色
- mysql 语句 面试题
- linux挂载ntfs格式分区,Linux上挂载NTFS分区(Mount)
- HTML怎么跟随页面缩放,如何让网页跟着 浏览器全比例缩小(示例代码)
- Flutter-解决Try catch出现异常:type ‘_TypeError‘ is not a subtype of type ‘Exception‘ in type cast
- oracle 基础dbms错误,更改对 DBMS 错误的响应
- Qt动态翻译不生效!
- 微信小程序如何实现上拉刷新(即分页加载数据)?
- Python中的base64、base32实例