思维:利用指针特点,将R0产生的批量数据通过设置结构体存下,再将指定的结构体内存区域(一定大小的指针)拷贝进IRP的缓冲区即可

  1. #include <windows.h>
  2. #include <winioctl.h>
  3. #define SYMBOLIC_NAME "\\\\.\\sym_name"
  4. //任何宏定义后面都不能有分号!!!
  5. #define CTL_CODE_BASE 0x8000
  6. #define CTL_CMD(i) CTL_CODE(FILE_DEVICE_UNKNOWN,CTL_CODE_BASE+i,METHOD_BUFFERED,FILE_ANY_ACCESS)
  7. #define CTL_TALK CTL_CMD(1)
  8. #define CTL_GET CTL_CMD(2)
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #endif
  12. typedef struct _PROCESS_INFOR_
  13. {
  14. UINT64 pid;
  15. WCHAR processname;
  16. }PROCESS_INFOR, *PPROCESS_INFOR;
  17. //获取进程数量
  18. void getcount()
  19. {
  20. HANDLE hDevice = NULL;
  21. DWORD retlen = 0;
  22. ULONG count = 0;
  23. hDevice = CreateFile(TEXT(SYMBOLIC_NAME), GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  24. DeviceIoControl(hDevice, CTL_TALK, &count, sizeof(ULONG), &count, sizeof(ULONG), &retlen, NULL);
  25. CString demo;
  26. demo.Format(TEXT("%d"), count);
  27. AfxMessageBox(demo);
  28. }
  29. //获取进程id
  30. void getinfor()
  31. {
  32. PPROCESS_INFOR processinfor = (PPROCESS_INFOR)malloc(100 * sizeof(PROCESS_INFOR));
  33. HANDLE hDevice = NULL;
  34. DWORD retlen = 0;
  35. hDevice = CreateFile(TEXT(SYMBOLIC_NAME), GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  36. DeviceIoControl(hDevice, CTL_GET, processinfor, 100 * sizeof(PROCESS_INFOR), processinfor, 100 * sizeof(PROCESS_INFOR), &retlen, NULL);
  37. CString demo;
  38. demo.Format(TEXT("%d"), processinfor[20].pid);
  39. AfxMessageBox(demo); // 除非将焦点设置到控件,否则返回 TRUE
  40. }
  1. #include <ntddk.h>
  2. #define DEVICE_NAME L"\\device\\mydevice"
  3. #define SYMBOLIC_NAME L"\\dosdevices\\sym_name"
  4. #define CTL_CODE_BASE 0x8000
  5. #define CTL_CMD(i) CTL_CODE(FILE_DEVICE_UNKNOWN,CTL_CODE_BASE+i,METHOD_BUFFERED,FILE_ANY_ACCESS)
  6. #define CTL_TALK CTL_CMD(1)
  7. #define CTL_GET CTL_CMD(2)
  8. ULONG count = 0;
  9. typedef struct _PROCESS_INFOR_
  10. {
  11. UINT64 pid;
  12. WCHAR processname;
  13. }PROCESS_INFOR, *PPROCESS_INFOR;
  14. VOID GetInfor(PVOID pBuff)
  15. {
  16. DbgPrint("Suc!");
  17. UINT64 process_pid = 0;
  18. PUCHAR process_name = NULL;
  19. PLIST_ENTRY process_list = NULL;
  20. PEPROCESS process_first = NULL;
  21. PEPROCESS process_address = PsGetCurrentProcess();
  22. ULONG pid_offset = 0x180;
  23. ULONG list_offset = 0x188;
  24. ULONG name_offset = 0x2e0;
  25. ULONG uIndex = 0;
  26. PPROCESS_INFOR processinfromation = (PPROCESS_INFOR)ExAllocatePool(PagedPool, 100 * sizeof(PROCESS_INFOR));
  27. //因为双向链表 首节点的位置是0,所以我们要指向第一个节点之前
  28. process_list = (PLIST_ENTRY)((UINT64)process_address + list_offset);
  29. process_first = (PEPROCESS)((UINT64)(process_list->Blink) - list_offset);
  30. if (!process_address)
  31. {
  32. DbgPrint("[ERROR]: NOT ....\n");
  33. return;
  34. }
  35. while (process_address)
  36. {
  37. process_pid = *(UINT64*)((UINT64)process_address + pid_offset);
  38. process_name = (PUCHAR)((UINT64)process_address + name_offset);
  39. processinfromation[uIndex].pid = (UINT64)process_pid;
  40. DbgPrint(" pid = %ld name = %s \n", process_pid, process_name);
  41. uIndex++;
  42. count++;
  43. process_list = process_list->Flink;
  44. process_address = (PEPROCESS)((UINT64)(process_list)-list_offset);
  45. if (process_first == process_address)
  46. {
  47. DbgPrint("END!......\n");
  48. break;
  49. }
  50. }
  51. RtlCopyMemory(pBuff, processinfromation, 100 * sizeof(PROCESS_INFOR));
  52. DbgPrint("进程id:%d", processinfromation[20].pid);
  53. }
  54. NTSTATUS DispatchControl(PDEVICE_OBJECT pDevice, PIRP pIrp)
  55. {
  56. PVOID pBuff = pIrp->AssociatedIrp.SystemBuffer;
  57. PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
  58. ULONG CtlCode = pStack->Parameters.DeviceIoControl.IoControlCode;
  59. switch (CtlCode)
  60. {
  61. case CTL_TALK:
  62. {
  63. ULONG tmpcount = count;
  64. RtlCopyMemory(pBuff,&tmpcount,sizeof(ULONG));
  65. DbgPrint("%d",tmpcount);
  66. pIrp->IoStatus.Information = sizeof(ULONG);
  67. break;
  68. }
  69. case CTL_GET:
  70. {
  71. GetInfor(pBuff);
  72. pIrp->IoStatus.Information = sizeof(PEPROCESS)* 100;
  73. break;
  74. }
  75. default:
  76. break;
  77. }
  78. pIrp->IoStatus.Status = STATUS_SUCCESS;
  79. IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  80. return STATUS_SUCCESS;
  81. }
  82. NTSTATUS DispatchCreate(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
  83. {
  84. DbgPrint("Create!");
  85. //设置IRP处理已经成功了
  86. pIrp->IoStatus.Status = STATUS_SUCCESS;
  87. //返回多少字节的数据
  88. pIrp->IoStatus.Information = 0;
  89. //结束IRP处理流程
  90. IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  91. //函数调用成功
  92. return STATUS_SUCCESS;
  93. }
  94. VOID UnloadDriver(PDRIVER_OBJECT pDriver)
  95. {
  96. UNICODE_STRING uSyb_Name = RTL_CONSTANT_STRING(SYMBOLIC_NAME);
  97. IoDeleteDevice(pDriver->DeviceObject);
  98. IoDeleteSymbolicLink(&uSyb_Name);
  99. DbgPrint("卸载成功");
  100. }
  101. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegpath)
  102. {
  103. PDEVICE_OBJECT pDevice = NULL;
  104. UNICODE_STRING uDeciceName = RTL_CONSTANT_STRING(DEVICE_NAME);
  105. UNICODE_STRING uSyb_Name = RTL_CONSTANT_STRING(SYMBOLIC_NAME);
  106. NTSTATUS status = STATUS_SUCCESS;
  107. status = IoCreateDevice(pDriver, 0, &uDeciceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevice);
  108. if (!NT_SUCCESS(status))
  109. {
  110. DbgPrint("创建设备失败\n");
  111. }
  112. status = IoCreateSymbolicLink(&uSyb_Name, &uDeciceName);
  113. if (!NT_SUCCESS(status))
  114. {
  115. DbgPrint("创建符号链接失败\n");
  116. }
  117. pDevice->Flags |= DO_BUFFERED_IO;
  118. pDriver->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
  119. pDriver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchControl;
  120. DbgPrint("驱动加载成功");
  121. pDriver->DriverUnload = UnloadDriver;
  122. return STATUS_SUCCESS;
  123. }