EXE与SYS通信(其他模式)

来源:互联网 发布:淘宝任务平台 app 编辑:程序博客网 时间:2024/05/21 07:03

EXE部分

head.h

[cpp] view plain copy
  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.   
  8. #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x800,  METHOD_NEITHER,FILE_ANY_ACCESS)  
  9. #define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x801,  METHOD_NEITHER,FILE_ANY_ACCESS)  


 

main.cpp

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


 

 

 

SYS部分

head.h

[cpp] view plain copy
  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.   
  8. #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x800,  METHOD_NEITHER,FILE_ANY_ACCESS)  
  9. #define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x801,  METHOD_NEITHER,FILE_ANY_ACCESS)  


 

cpp部分

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