Windows内核驱动--实现修改线程优先级demo
在User下修改优先级比较麻烦,该驱动可以直接用线程ID,和优先级级数两个参数直接修改线程的优先级:
Client代码:
- #include <Windows.h>
- #include <stdio.h>
- #include "..\PriorityBooster\PriorityBoosterCommon.h"
- int Error(const char* message) {
- printf("%s (error=%d)\n", message, GetLastError());
- return 1;
- }
- int main(int argc, const char* argv[]) {
- if (argc < 3) {
- printf("Usage: Booster <threadid> <priority>\n");
- return 0;
- }
- HANDLE hDevice = CreateFile(L"\\\\.\\PriorityBooster", GENERIC_WRITE, FILE_SHARE_WRITE,
- nullptr, OPEN_EXISTING, 0, nullptr);
- if (hDevice == INVALID_HANDLE_VALUE)
- return Error("Failed to open device");
- ThreadData data;
- data.ThreadId = atoi(argv[1]);
- data.Priority = atoi(argv[2]);
- DWORD returned;
- BOOL success = DeviceIoControl(hDevice, IOCTL_PRIORITY_BOOSTER_SET_PRIORITY, &data, sizeof(data), nullptr, 0, &returned, nullptr);
- if (success)
- printf("Priority change succeeded!\n");
- else
- Error("Priority change failed!");
- CloseHandle(hDevice);
- }
kernel代码:
- //PriorityBooster.cpp
- #include <ntifs.h>
- #include <ntddk.h>
- #include "PriorityBoosterCommon.h"
- // prototypes
- void PriorityBoosterUnload(_In_ PDRIVER_OBJECT DriverObject);
- NTSTATUS PriorityBoosterCreateClose(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
- NTSTATUS PriorityBoosterDeviceControl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp);
- // DriverEntry
- extern "C" NTSTATUS
- DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
- UNREFERENCED_PARAMETER(RegistryPath);
- KdPrint(("PriorityBooster DriverEntry started\n"));
- DriverObject->DriverUnload = PriorityBoosterUnload;
- DriverObject->MajorFunction[IRP_MJ_CREATE] = PriorityBoosterCreateClose;
- DriverObject->MajorFunction[IRP_MJ_CLOSE] = PriorityBoosterCreateClose;
- DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PriorityBoosterDeviceControl;
- UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\PriorityBooster");
- //RtlInitUnicodeString(&devName, L"\\Device\\ThreadBoost");
- PDEVICE_OBJECT DeviceObject;
- NTSTATUS status = IoCreateDevice(DriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject);
- if (!NT_SUCCESS(status)) {
- KdPrint(("Failed to create device (0x%08X)\n", status));
- return status;
- }
- UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\PriorityBooster");
- status = IoCreateSymbolicLink(&symLink, &devName);
- if (!NT_SUCCESS(status)) {
- KdPrint(("Failed to create symbolic link (0x%08X)\n", status));
- IoDeleteDevice(DeviceObject);
- return status;
- }
- KdPrint(("PriorityBooster DriverEntry completed successfully\n"));
- return STATUS_SUCCESS;
- }
- void PriorityBoosterUnload(_In_ PDRIVER_OBJECT DriverObject) {
- UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\??\\PriorityBooster");
- // delete symbolic link
- IoDeleteSymbolicLink(&symLink);
- // delete device object
- IoDeleteDevice(DriverObject->DeviceObject);
- KdPrint(("PriorityBooster unloaded\n"));
- }
- _Use_decl_annotations_
- NTSTATUS PriorityBoosterCreateClose(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
- UNREFERENCED_PARAMETER(DeviceObject);
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
- }
- _Use_decl_annotations_
- NTSTATUS PriorityBoosterDeviceControl(PDEVICE_OBJECT, PIRP Irp) {
- // get our IO_STACK_LOCATION
- auto stack = IoGetCurrentIrpStackLocation(Irp);
- auto status = STATUS_SUCCESS;
- switch (stack->Parameters.DeviceIoControl.IoControlCode) {
- case IOCTL_PRIORITY_BOOSTER_SET_PRIORITY:
- {
- // do the work
- if (stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(ThreadData)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- auto data = (ThreadData*)stack->Parameters.DeviceIoControl.Type3InputBuffer;
- if (data == nullptr) {
- status = STATUS_INVALID_PARAMETER;
- break;
- }
- if (data->Priority < 1 || data->Priority > 31) {
- status = STATUS_INVALID_PARAMETER;
- break;
- }
- PETHREAD Thread;
- status = PsLookupThreadByThreadId(ULongToHandle(data->ThreadId), &Thread);
- if (!NT_SUCCESS(status))
- break;
- KeSetPriorityThread((PKTHREAD)Thread, data->Priority);
- ObDereferenceObject(Thread);
- KdPrint(("Thread Priority change for %d to %d succeeded!\n",
- data->ThreadId, data->Priority));
- break;
- }
- default:
- status = STATUS_INVALID_DEVICE_REQUEST;
- break;
- }
- Irp->IoStatus.Status = status;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return status;
- }
- //PriorityBoosterCommon.h
- #pragma once
- struct ThreadData {
- ULONG ThreadId;
- int Priority;
- };
- #define PRIORITY_BOOSTER_DEVICE 0x8000
- #define IOCTL_PRIORITY_BOOSTER_SET_PRIORITY CTL_CODE(PRIORITY_BOOSTER_DEVICE, \
- 0x800, METHOD_NEITHER, FILE_ANY_ACCESS)
采用VS2019建立如图类似工程就可以了:
Windows内核驱动--实现修改线程优先级demo的更多相关文章
- Windows内核驱动中操作文件
本页主题:如何在windows内核驱动中对文件操作,实现对文件的拷贝.粘贴.删除.查询信息等,这是很常用也是很简单的方法. 部分内容参考:http://www.cppblog.com/aurain/a ...
- [5]windows内核情景分析---进程线程
本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName, ...
- Windows内核驱动开发:HelloWorld
测试信息 Dev Machine: Windows Version: 2004 (19041.264) WDK Version: 10.0.19041.1 SDK Version: 10.0.1904 ...
- Windows内核驱动开发入门学习资料
声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...
- 《天书夜读:从汇编语言到windows内核编程》十 线程与事件
1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...
- windows内核驱动内存管理之Lookaside使用
Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少 ...
- 向Windows内核驱动传递用户层定义的事件Event,并响应内核层的通知
完整的程序在下载:http://download.csdn.net/detail/dijkstar/7913249 用户层创建的事件Event是一个Handle句柄,和内核中的创建的内核模式下的KEV ...
- 《Windows内核编程》---系统线程和同步事件
系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...
- Windows内核开发-4-内核编程基础
Windows内核开发-4-内核编程基础 这里会构建一个简单但是完整的驱动程序和一个客户端,部署内核执行一些平时user下无法执行的操作. 将通过以下内容进行讲解: 1 介绍 2 驱动初始化 3 Cr ...
随机推荐
- deeplearning模型库
deeplearning模型库 1. 图像分类 数据集:ImageNet1000类 1.1 量化 分类模型Lite时延(ms) 设备 模型类型 压缩策略 armv7 Thread 1 armv7 T ...
- 适用于CUDA GPU的Numba 随机数生成
适用于CUDA GPU的Numba 随机数生成 随机数生成 Numba提供了可以在GPU上执行的随机数生成算法.由于NVIDIA如何实现cuRAND的技术问题,Numba的GPU随机数生成器并非基于c ...
- ARM Cortex-M嵌入式C基础编程(下)
ARM Cortex-M嵌入式C基础编程(下) ARM Cortex-M Embedded C Fundamentals/Tutorial -Aviral Mittal Load Region Vs ...
- 接触追踪解决方案建立在UWB而不是蓝牙上
接触追踪解决方案建立在UWB而不是蓝牙上 Contact tracing solution builds on UWB rather than Bluetooth 几个月前,当社会距离明显成为对抗CO ...
- Solon Auth 认证框架使用演示(更简单的认证框架)
最近看了好几个认证框架,什么 Appache Shiro 啦.Sa-Token 啦.Spring Security啦...尤其是Spring Security,做为对标 Spring Boot &am ...
- 【C++】类
一个简单例子: 1 //c++ 类 2 #include<iostream> 3 using namespace std; 4 class Point 5 { 6 private: 7 i ...
- Oracle对大表进行delete注意事项
如果对大表进行大量的delete和update,那么可以注意一下如下说明: (1) 查看执行计划,如果说删除的记录很多,走索引的成本会比全表扫描更大,因为更新数据时还需要做一些约束校验和创建index ...
- MEMORY_TARGET不够时解决办法
一.报错原因:设置的memory_max_target超过了系统中设置的share memory(/dev/shm)而已. 二.解决办法:增加tmpfs的大小 三.调整tmpfs的大小(两种方法) 1 ...
- Java8-四个函数式接口(Consumer,Supplier,Predicate,Function)
Java8---函数式接口 Consumer---消费者(accept方法,Lambda与方法引用返回都是Consumer) Supplier---供给型(get方法,返回数据,与Optional可以 ...
- android悬浮窗口
悬浮窗原理 做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要有一个服务运行在后台, 通过getSystemService(Context.WINDOW_SERVICE)拿到WindowManager, ...