实战EXE和SYS通信

 A、用户层传入数据-EXE部分代码

 B、驱动层接收数据并处理-SYS部分代码

 C、驱动层返回数据至用户层

 D、用户层获得处理结果

A、用户层传入数据EXE部分代码

//#include <winioctl.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)

 

int port[2],bufret;

DWORD dwWrite;

int add(HANDLE hDevice,int a,int b)

    {

       

        port[0]=a;

        port[1]=b;

        DeviceIoControl(hDevice, add_code , &port, 8, &bufret, 4, &dwWrite, NULL);

        return bufret;

}

 

///主要代码如下

{  //CreateFile hDevice

    HANDLE hDevice =

        CreateFile("\\\\.\\My_DriverLinkName", //\\??\My_DriverLinkName

        GENERIC_READ | GENERIC_WRITE,

        0,      // share mode none

        NULL,   // no security

        OPEN_EXISTING,

        FILE_ATTRIBUTE_NORMAL,

        NULL );     // no template

   

    printf("start\n");

    if (hDevice == INVALID_HANDLE_VALUE)

    {

        printf("获取驱动句柄失败: %s with Win32 error code: %d\n","MyDriver", GetLastError() );

        getchar();

        return -1;

    }

   //add_code

    int a=55;

    int b=33;

    int r= add(hDevice,a,b);

    printf("%d+%d=%d\n",a,b,r);

    getchar();

    return 0;

}

1、修改符号链接

RtlInitUnicodeString(&symLinkName,L"\\??\\My_DriverLinkName");

2、

B、驱动层接收数据并处理SYS部分代码

 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;

                                             }

                                    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; //返回成功

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蚂蚁_CrkRes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值