在User下修改优先级比较麻烦,该驱动可以直接用线程ID,和优先级级数两个参数直接修改线程的优先级:

Client代码:

  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include "..\PriorityBooster\PriorityBoosterCommon.h"
  4.  
  5. int Error(const char* message) {
  6. printf("%s (error=%d)\n", message, GetLastError());
  7. return 1;
  8. }
  9.  
  10. int main(int argc, const char* argv[]) {
  11. if (argc < 3) {
  12. printf("Usage: Booster <threadid> <priority>\n");
  13. return 0;
  14. }
  15.  
  16. HANDLE hDevice = CreateFile(L"\\\\.\\PriorityBooster", GENERIC_WRITE, FILE_SHARE_WRITE,
  17. nullptr, OPEN_EXISTING, 0, nullptr);
  18. if (hDevice == INVALID_HANDLE_VALUE)
  19. return Error("Failed to open device");
  20.  
  21. ThreadData data;
  22. data.ThreadId = atoi(argv[1]);
  23. data.Priority = atoi(argv[2]);
  24.  
  25. DWORD returned;
  26. BOOL success = DeviceIoControl(hDevice, IOCTL_PRIORITY_BOOSTER_SET_PRIORITY, &data, sizeof(data), nullptr, 0, &returned, nullptr);
  27. if (success)
  28. printf("Priority change succeeded!\n");
  29. else
  30. Error("Priority change failed!");
  31.  
  32. CloseHandle(hDevice);
  33. }

kernel代码:

  1. //PriorityBooster.cpp
  2. #include <ntifs.h>
  3. #include <ntddk.h>
  4. #include "PriorityBoosterCommon.h"
  5.  
  6. // prototypes
  7.  
  8. void PriorityBoosterUnload(_In_ PDRIVER_OBJECT DriverObject);
  9. NTSTATUS PriorityBoosterCreateClose(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
  10. NTSTATUS PriorityBoosterDeviceControl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
  11.  
  12. // DriverEntry
  13.  
  14. extern "C" NTSTATUS
  15. DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
  16. UNREFERENCED_PARAMETER(RegistryPath);
  17.  
  18. KdPrint(("PriorityBooster DriverEntry started\n"));
  19.  
  20. DriverObject->DriverUnload = PriorityBoosterUnload;
  21.  
  22. DriverObject->MajorFunction[IRP_MJ_CREATE] = PriorityBoosterCreateClose;
  23. DriverObject->MajorFunction[IRP_MJ_CLOSE] = PriorityBoosterCreateClose;
  24. DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PriorityBoosterDeviceControl;
  25.  
  26. UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\PriorityBooster");
  27. //RtlInitUnicodeString(&devName, L"\\Device\\ThreadBoost");
  28. PDEVICE_OBJECT DeviceObject;
  29. NTSTATUS status = IoCreateDevice(DriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject);
  30. if (!NT_SUCCESS(status)) {
  31. KdPrint(("Failed to create device (0x%08X)\n", status));
  32. return status;
  33. }
  34.  
  35. UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\PriorityBooster");
  36. status = IoCreateSymbolicLink(&symLink, &devName);
  37. if (!NT_SUCCESS(status)) {
  38. KdPrint(("Failed to create symbolic link (0x%08X)\n", status));
  39. IoDeleteDevice(DeviceObject);
  40. return status;
  41. }
  42.  
  43. KdPrint(("PriorityBooster DriverEntry completed successfully\n"));
  44.  
  45. return STATUS_SUCCESS;
  46. }
  47.  
  48. void PriorityBoosterUnload(_In_ PDRIVER_OBJECT DriverObject) {
  49. UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\PriorityBooster");
  50. // delete symbolic link
  51. IoDeleteSymbolicLink(&symLink);
  52.  
  53. // delete device object
  54. IoDeleteDevice(DriverObject->DeviceObject);
  55.  
  56. KdPrint(("PriorityBooster unloaded\n"));
  57. }
  58.  
  59. _Use_decl_annotations_
  60. NTSTATUS PriorityBoosterCreateClose(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
  61. UNREFERENCED_PARAMETER(DeviceObject);
  62.  
  63. Irp->IoStatus.Status = STATUS_SUCCESS;
  64. Irp->IoStatus.Information = 0;
  65. IoCompleteRequest(Irp, IO_NO_INCREMENT);
  66. return STATUS_SUCCESS;
  67. }
  68.  
  69. _Use_decl_annotations_
  70. NTSTATUS PriorityBoosterDeviceControl(PDEVICE_OBJECT, PIRP Irp) {
  71. // get our IO_STACK_LOCATION
  72. auto stack = IoGetCurrentIrpStackLocation(Irp);
  73. auto status = STATUS_SUCCESS;
  74.  
  75. switch (stack->Parameters.DeviceIoControl.IoControlCode) {
  76. case IOCTL_PRIORITY_BOOSTER_SET_PRIORITY:
  77. {
  78. // do the work
  79. if (stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(ThreadData)) {
  80. status = STATUS_BUFFER_TOO_SMALL;
  81. break;
  82. }
  83.  
  84. auto data = (ThreadData*)stack->Parameters.DeviceIoControl.Type3InputBuffer;
  85. if (data == nullptr) {
  86. status = STATUS_INVALID_PARAMETER;
  87. break;
  88. }
  89.  
  90. if (data->Priority < 1 || data->Priority > 31) {
  91. status = STATUS_INVALID_PARAMETER;
  92. break;
  93. }
  94.  
  95. PETHREAD Thread;
  96. status = PsLookupThreadByThreadId(ULongToHandle(data->ThreadId), &Thread);
  97. if (!NT_SUCCESS(status))
  98. break;
  99.  
  100. KeSetPriorityThread((PKTHREAD)Thread, data->Priority);
  101. ObDereferenceObject(Thread);
  102. KdPrint(("Thread Priority change for %d to %d succeeded!\n",
  103. data->ThreadId, data->Priority));
  104. break;
  105. }
  106.  
  107. default:
  108. status = STATUS_INVALID_DEVICE_REQUEST;
  109. break;
  110. }
  111.  
  112. Irp->IoStatus.Status = status;
  113. Irp->IoStatus.Information = 0;
  114. IoCompleteRequest(Irp, IO_NO_INCREMENT);
  115. return status;
  116. }
  1. //PriorityBoosterCommon.h
  2. #pragma once
  3.  
  4. struct ThreadData {
  5. ULONG ThreadId;
  6. int Priority;
  7. };
  8.  
  9. #define PRIORITY_BOOSTER_DEVICE 0x8000
  10.  
  11. #define IOCTL_PRIORITY_BOOSTER_SET_PRIORITY CTL_CODE(PRIORITY_BOOSTER_DEVICE, \
  12. 0x800, METHOD_NEITHER, FILE_ANY_ACCESS)

采用VS2019建立如图类似工程就可以了:

Windows内核驱动--实现修改线程优先级demo的更多相关文章

  1. Windows内核驱动中操作文件

    本页主题:如何在windows内核驱动中对文件操作,实现对文件的拷贝.粘贴.删除.查询信息等,这是很常用也是很简单的方法. 部分内容参考:http://www.cppblog.com/aurain/a ...

  2. [5]windows内核情景分析---进程线程

    本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName,                 ...

  3. Windows内核驱动开发:HelloWorld

    测试信息 Dev Machine: Windows Version: 2004 (19041.264) WDK Version: 10.0.19041.1 SDK Version: 10.0.1904 ...

  4. Windows内核驱动开发入门学习资料

    声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...

  5. 《天书夜读:从汇编语言到windows内核编程》十 线程与事件

    1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...

  6. windows内核驱动内存管理之Lookaside使用

    Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少 ...

  7. 向Windows内核驱动传递用户层定义的事件Event,并响应内核层的通知

    完整的程序在下载:http://download.csdn.net/detail/dijkstar/7913249 用户层创建的事件Event是一个Handle句柄,和内核中的创建的内核模式下的KEV ...

  8. 《Windows内核编程》---系统线程和同步事件

    系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...

  9. Windows内核开发-4-内核编程基础

    Windows内核开发-4-内核编程基础 这里会构建一个简单但是完整的驱动程序和一个客户端,部署内核执行一些平时user下无法执行的操作. 将通过以下内容进行讲解: 1 介绍 2 驱动初始化 3 Cr ...

随机推荐

  1. deeplearning模型库

    deeplearning模型库 1. 图像分类 数据集:ImageNet1000类 1.1  量化 分类模型Lite时延(ms) 设备 模型类型 压缩策略 armv7 Thread 1 armv7 T ...

  2. 适用于CUDA GPU的Numba 随机数生成

    适用于CUDA GPU的Numba 随机数生成 随机数生成 Numba提供了可以在GPU上执行的随机数生成算法.由于NVIDIA如何实现cuRAND的技术问题,Numba的GPU随机数生成器并非基于c ...

  3. ARM Cortex-M嵌入式C基础编程(下)

    ARM Cortex-M嵌入式C基础编程(下) ARM Cortex-M Embedded C Fundamentals/Tutorial -Aviral Mittal Load Region Vs ...

  4. 接触追踪解决方案建立在UWB而不是蓝牙上

    接触追踪解决方案建立在UWB而不是蓝牙上 Contact tracing solution builds on UWB rather than Bluetooth 几个月前,当社会距离明显成为对抗CO ...

  5. Solon Auth 认证框架使用演示(更简单的认证框架)

    最近看了好几个认证框架,什么 Appache Shiro 啦.Sa-Token 啦.Spring Security啦...尤其是Spring Security,做为对标 Spring Boot &am ...

  6. 【C++】类

    一个简单例子: 1 //c++ 类 2 #include<iostream> 3 using namespace std; 4 class Point 5 { 6 private: 7 i ...

  7. Oracle对大表进行delete注意事项

    如果对大表进行大量的delete和update,那么可以注意一下如下说明: (1) 查看执行计划,如果说删除的记录很多,走索引的成本会比全表扫描更大,因为更新数据时还需要做一些约束校验和创建index ...

  8. MEMORY_TARGET不够时解决办法

    一.报错原因:设置的memory_max_target超过了系统中设置的share memory(/dev/shm)而已. 二.解决办法:增加tmpfs的大小 三.调整tmpfs的大小(两种方法) 1 ...

  9. Java8-四个函数式接口(Consumer,Supplier,Predicate,Function)

    Java8---函数式接口 Consumer---消费者(accept方法,Lambda与方法引用返回都是Consumer) Supplier---供给型(get方法,返回数据,与Optional可以 ...

  10. android悬浮窗口

    悬浮窗原理 做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要有一个服务运行在后台, 通过getSystemService(Context.WINDOW_SERVICE)拿到WindowManager, ...