找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 3379|回复: 1

Mdl读写驱动层和应用层通信的问题

[复制链接]

1

主题

15

回帖

0

精华

初来乍到

积分
17
发表于 2020-2-20 00:49:48 | 显示全部楼层 |阅读模式
本帖最后由 Tizi 于 2020-2-20 13:14 编辑

这个驱动层的代码
  1. NTSTATUS status = STATUS_SUCCESS;
  2.         PIO_STACK_LOCATION irps = IoGetCurrentIrpStackLocation(pIrp);//获取堆栈
  3.         ULONG inlength  = irps->Parameters.DeviceIoControl.InputBufferLength;//得到输入缓冲区大小
  4.         ULONG outlength = irps->Parameters.DeviceIoControl.OutputBufferLength;//得到输出缓冲区大小
  5.         ULONG CODE = irps->Parameters.DeviceIoControl.IoControlCode;
  6.         ULONG info = 0;
  7.         switch (CODE)
  8.         {
  9.         case READCODE:
  10.         {
  11.                 PUCHAR         pmapped = NULL;
  12.                 pIrp->IoStatus.Status = STATUS_SUCCESS;
  13.                 NTSTATUS      status = STATUS_SUCCESS;
  14.                 PEPROCESS     targeprocess = NULL;
  15.                 KAPC_STATE     apcstack = { 0 };
  16.                 PMDL            tempmdl;
  17.                 PVOID           mappedaddr;
  18.                 PVOID           targeaddr;
  19.                 PREADANDWRITE tempbuffer = (PREADANDWRITE)pIrp->AssociatedIrp.SystemBuffer;
  20.                 DbgPrint("取到当前ID:%d  地址:%x   大小:%d \n", tempbuffer->pid, tempbuffer->targeaddr, tempbuffer->size);
  21.                 // 获得进程对象
  22.                 status = PsLookupProcessByProcessId((HANDLE)tempbuffer->pid, &targeprocess);
  23.                 if (!NT_SUCCESS(status))
  24.                 {
  25.                         status = STATUS_PROCESS_CLONED;
  26.                         info = 0;
  27.                         DbgPrint("error <%x> \n", status);
  28.                         return status;
  29.                 }
  30.                 //让内核对象引用数-1
  31.                 ObDereferenceObject(targeprocess);
  32.                 KeStackAttachProcess(targeprocess, &apcstack);//附加进程
  33.                 targeaddr = (PVOID)tempbuffer->targeaddr;
  34.                 tempmdl = IoAllocateMdl(targeaddr, tempbuffer->size, FALSE, FALSE, NULL);
  35.                 if (!tempmdl)
  36.                 {
  37.                         status = STATUS_MEMORY_NOT_ALLOCATED;
  38.                         info = 0;
  39.                         KeUnstackDetachProcess(&apcstack);
  40.                         break;
  41.                 }
  42.                 __try
  43.                 {
  44.                         MmProbeAndLockPages(tempmdl, KernelMode, IoReadAccess);//尝试锁定分页

  45.                 }
  46.                 __except (1)
  47.                 {
  48.                         status = STATUS_MEMORY_NOT_ALLOCATED;
  49.                         info = 0;
  50.                         KeUnstackDetachProcess(&apcstack);
  51.                         break;
  52.                 }
  53.                 //到这里开始Map
  54.                 mappedaddr = MmMapLockedPages(tempmdl, KernelMode);
  55.                 if (!mappedaddr)
  56.                 {
  57.                         IoFreeMdl(tempmdl);
  58.                         status = STATUS_MEMORY_NOT_ALLOCATED;
  59.                         info = 0;
  60.                         KeUnstackDetachProcess(&apcstack);
  61.                         break;
  62.                 }
  63.                 RtlCopyMemory(pIrp->AssociatedIrp.SystemBuffer, mappedaddr, tempbuffer->size);//这里传回去应用层
  64.                 IoFreeMdl(tempmdl);
  65.                 MmUnmapLockedPages(mappedaddr, tempmdl);
  66.                 KeUnstackDetachProcess(&apcstack);
  67.                 status = STATUS_SUCCESS;
  68.                 info = tempbuffer->size;
  69.                 pIrp->IoStatus.Status = STATUS_SUCCESS;
  70.                 IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  71.                 break;
  72.         }
  73.         default:
  74.                 DbgPrint("error \n");
  75.                 break;
  76.         }
复制代码


下面是应用层的代码   
  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3.             HANDLE hDevice =
  4.                 CreateFile(L"\\\\.\\MyReadTest",
  5.                 GENERIC_READ | GENERIC_WRITE,
  6.                 0,      //无共享模式
  7.                 NULL,   //没有安全措施
  8.                 OPEN_EXISTING,
  9.                 FILE_ATTRIBUTE_NORMAL,
  10.                 NULL);    //没有模板
  11.         if (hDevice == INVALID_HANDLE_VALUE)
  12.         {
  13.                 printf("无法获取设备:%s 的句柄,错误码:%d\n", "MyWDMDevice", GetLastError());
  14.                 getchar();
  15.                 return 1;
  16.         }
  17.         BYTE outbuffer[40];
  18.         LONG pid = 0;
  19.         LONG address = 0;
  20.         LONG size = 0;
  21.         ULONG  dwout;
  22.         BOOL   bRet;

  23.        
  24.     //memset(&data, 0x00, sizeof(READANDWRITE));
  25.         //memset(&outbuffer, 0x00, 40);
  26.         printf("请输入进程PID \n");
  27.         scanf("%d", &pid);
  28.         printf("请输入要操作的地址 \n");
  29.         scanf("%x", &address);
  30.         printf("请输入要操作字节大小 \n");
  31.         scanf("%d", &size);
  32.         for (int i = 0; i < 4; i++)
  33.         {
  34.                 data.pid = pid;
  35.                 data.targeaddr = address;
  36.                 data.size = size;
  37.                 bRet = DeviceIoControl(hDevice, READCODE, &data, sizeof(READANDWRITE), outbuffer, 40, &dwout, NULL);
  38.                 if (!bRet)
  39.                 {
  40.                         printf("读失败\n");
  41.                 }
  42.                 else
  43.                 {
  44.                         for (int b = 0; b < data.size; b++)
  45.                         {
  46.                                 printf("--%x--", *(outbuffer+b));

  47.                         }
  48.                 }
  49.         }
  50.     CloseHandle(hDevice);
  51.         scanf("%d", &a);
  52.         return 0;
  53. }
复制代码


驱动层把mappedaddr传到应用层 我应用层 读出来的 不是内存地址的数据是怎么个回事。。求大佬支招
PS:我驱动层 直接转BYTE类型 读出来 是可以读出来正确的内存地址数据

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2020-3-6 18:10:58 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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