郁金香外挂技术-郁金香灬老师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

飞郁网络培训郁金香终身VIP管理员QQ150330575淘宝担保交易QQ交流群(外挂,驱动)
查看: 366|回复: 0

005-R3应用层与R0驱动层进简单通信

[复制链接]
发表于 2018-11-29 20:32:10 | 显示全部楼层 |阅读模式
//郁金香灬老师
//QQ 150330575
//开发环境:VS2017
//时间:2019-10-2


#include <winioctl.h>
#define IO_IS_OK_TEST   CTL_CODE(FILE_DEVICE_UNKNOWN,         0x803,         METHOD_BUFFERED,FILE_ANY_ACCESS) //控制码测试


//WriteFile ReadFile
BOOL DeviceIoControl(
  HANDLE hDevice,              // 设备驱动的句柄 由CreateFile获取
  DWORD dwIoControlCode,       // 操作控制码
  LPVOID lpInBuffer,           // 输入缓冲区指针 要传入驱动的 参数
  DWORD nInBufferSize,         // 输入缓冲区大小
  LPVOID lpOutBuffer,          // 输出缓冲区指针
  DWORD nOutBufferSize,        // 输出缓冲区大小
  LPDWORD lpBytesReturned,     // 存放返回的字节数的指针
  LPOVERLAPPED lpOverlapped    // 异步结构指针,同步或者异步
);

void CIRPMFCDlg::OnBnClickedButton3()
{
        // TODO: 在此添加控件通知处理程序代码
        DWORD dwBuf=0;
        //定义输入缓冲区
#pragma  pack(push)
#pragma  pack(4)
        typedef struct TINBUF
        {
                DWORD arg1;
                DWORD arg2;
                DWORD arg3;
                DWORD arg4;
                DWORD arg5;
                DWORD arg6;
        }TINBUF;
#pragma pack(pop)

        //获取返回字节数
        DWORD dwRetSize = 0;//获取返回的字节数量
        //输入缓冲区 以结构为例
        TINBUF inBuf = {0x11,0x222,0x3333,0xAA444,0xBB555,0xCC6666};
        //输出缓冲区 以数组为例
        DWORD  OutBuf[5] = { 0 };

        DeviceIoControl(
                DeviceHandle,//CreateFile 打开驱动设备 返回的句柄
                IO_IS_OK_TEST,//CTL_CODE生成的控制码
                &inBuf,//输入参数首地址
                sizeof(inBuf),//输入缓冲大小 字节
                &OutBuf,//输出缓冲区
                sizeof(OutBuf),//输出缓冲区大小 20
                &dwRetSize,
                NULL);
        CString csStr;
        csStr.Format(L"yjx:Exe 返回参数1=%x,参数2=%x,参数3=%x (%x,%x,%x)", OutBuf[0], OutBuf[1], OutBuf[2], OutBuf[3], OutBuf[4], OutBuf[5]);
        OutputDebugStringW(csStr);//输出 调试信息
}



case IRP_MJ_DEVICE_CONTROL: //DeviceIoControl
        {
                KdPrint(("yjx:用户层调用了 DeviceIoControl"));
                //接收参数
#pragma  pack(push)
#pragma  pack(4)
                typedef struct TINBUF
                {
                        DWORD arg1;
                        DWORD arg2;
                        DWORD arg3;
                        DWORD arg4;
                        DWORD arg5;
                        DWORD arg6;
                }TINBUF;
#pragma pack(pop)
                TINBUF*pInBuf=pirp->AssociatedIrp.SystemBuffer;//取得输入参数首地址
                //打印输入参数
                KdPrint(("yjx:SYS 接收到参数1=%x,参数2=%x,参数3=%x,参数4=%x,参数5=%x,参数6=%x",
                        pInBuf->arg1,
                        pInBuf->arg2,
                        pInBuf->arg3,
                        pInBuf->arg4,
                        pInBuf->arg5,
                        pInBuf->arg6));
                //返回数值 给输出缓冲区
                DWORD*pOutBuf = pirp->AssociatedIrp.SystemBuffer;
                //写入返回参数
                pOutBuf[0] = 0xAA111;
                pOutBuf[1] = 0xAA222;
                pOutBuf[2] = 666666;
                pOutBuf[3] = 0x4446666;
                pOutBuf[4] = 0x5666666;
                pOutBuf[5] = 0x6BC6666;
                pirp->IoStatus.Information =sizeof(DWORD)*6;//返回给DeviceIoControl中的 倒数第二个参数lpBytesReturned
                break;
        }

//DriverEntry
driver->Flags |= DO_BUFFERED_IO; //IO访问方式  重要 对应 METHOD_BUFFERED


郁金香外挂教程,学习中...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|郁金香外挂技术-郁金香灬老师 ( 苏ICP备10059359号 )

GMT+8, 2018-12-19 09:32 , Processed in 0.073688 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表