查看: 511|回复: 3

[原创] 【驱动开发教程】完整源码(原帖:补上源代码)

[复制链接]

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5367
人气
208
分享
36

最佳新人活跃会员

发表于 2022-8-10 18:46:40 | 显示全部楼层 |阅读模式
本帖最后由 YFSafe 于 2023-7-9 11:54 编辑

驱动程序的代码:
[C++] 纯文本查看 复制代码
#include <ntifs.h>
#include <ntddk.h>
#include "SetPriorityCommon.h"

void DriverUnload(PDRIVER_OBJECT DriverObject); 
NTSTATUS SetPriorityCreateClose(PDEVICE_OBJECT DeviceObject,PIRP Irp);
NTSTATUS SetPriorityDeviceControl(PDEVICE_OBJECT DeviceObject,PIRP Irp);

/*
extern "C" NTSTATUS
DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
	UNREFERENCED_PARAMETER(RegistryPath);

	KdPrint(("PriorityBooster DriverEntry started\n"));

	DriverObject->DriverUnload = DriverUnload;


DriverObject->MajorFunction[IRP_MJ_CREATE] = SetPriorityCreateClose;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = SetPriorityCreateClose;
	DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SetPriorityDeviceControl;

	UNICODE_STRING devName = RTL_CONSTANT_STRING(L"\\Device\\SetPriority");

PDEVICE_OBJECT DeviceObject; 
NTSTATUS status = IoCreateDevice( 
       DriverObject, 
       0, 
       &devName, 
       FILE_DEVICE_UNKNOWN, 
       0, 
       FALSE, 
       &DeviceObject); 
if(!NT_SUCCESS(status)) 
{ 
    DbgPrint("CreateDevice Failed!!!"); 
    return status; 
}

UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\?\\SetPriority"); 
status = IoCreateSymbolicLink(&symLink,&devName); 
if(!NT_SUCCESS(status)) 
{ 
    DbgPrint("Create symLink Failed!!!"); 
    IoDeleteDevice(DeviceObject); 
    return status; 
}

	KdPrint(("SetPriority DriverEntry completed successfully\n"));

	return STATUS_SUCCESS;
}


void DriverUnload(PDRIVER_OBJECT DriverObject) 
{ 
    UNICODE_STRING symLink = RTL_CONSTANT_STRING(L"\\?\\SetPriority"); 
    IoDeleteSymbolicLink(&symLink); 
    IoDeleteDevice(DriverObject->DeviceObject); 
}


NTSTATUS SetPriorityCreateClose(PDEVICE_OBJECT DeviceObject,PIRP Irp)
{
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp,IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}


NTSTATUS SetPriorityDeviceControl(PDEVICE_OBJECT,PIRP Irp)
{
        auto stack = IoGetCurrentIrpStackLocation(Irp);
    auto status = STATUS_SUCCESS;
    switch(stack->Parameters.DeviceIoControl.IoControlCode)
    {
                case IOCTL_SET_PRIORITY:
                //TO DO:修改优先级
                        if(stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(ThreadData))
                        {
                        status = STATUS_BUFFER_TOO_SMALL;
                        break;
                        }
                        auto data = (ThreadData*)stack->Parameters.DeviceIoControl.Type3InputBuffer;
                        if(data == NULL)
                        {
                                status = STATUS_INVALID_PARAMETER;
                                break;
                        }
                        if(data->Priority < 1 || data->Priority > 31)
                        {
                                status = STATUS_INVALID_PARAMETER;
                                break;
                        }
                        PETHREAD Thread;
                        status = PsLookupProcessByProcessId(ULongToHandle(data->ThreadId),&Thread);
                        if(!NT_SUCCESS(status))
                                break;
                        KeSetPriorityThread((PKTHREAD)Thread,data->Priority);
                        ObDereferenceObject(Thread);
            break;
        default:
                    status = STATUS_INVALID_DEVICE_REQUEST;
            break;
    }
        Irp->IoStatus.Status = status;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp,IO_NO_INCREMENT);
    return status;
}


SetPriorityCommon.h:
[C++] 纯文本查看 复制代码
#define SET_PRIORITY_DEVICE 0x8000
#define IOCTL_SET_PRIORITY CTL_CODE(SET_PRIORITY_DEVICE,0x800,METHOD_NEITHER,FILE_ANY_ACCESS)
struct ThreadData
{
    ULONG ThreadId;
    int Priority;
};


客户端程序:
[C++] 纯文本查看 复制代码
#include <windows.h>
#include <stdio.h>
#include "..\SetPriority\SetPriorityCommon.h"
using namespace std;
 
int PrintError(const char * msg)
{
    printf("%s (error = %d)\n", msg, GetLastError());
    return 114514;
}
 
int main(int argc,const char* argv[])
{
    if(argc < 3)
    {
        printf("Usage: SetPriority <ThreadId> <Priority>\n");
        return 0;
    }
    HANDLE hDevice = CreateFile(L"\\\\.\\SetPriority",GENERIC_WRITE,FILE_SHARE_WRITE,nullptr,OPEN_EXISTING,0,nullptr);
    if(hDevice == NULL)
        return PrintError("Failed to open device!!!");
    ThreadData data;
    data.ThreadId = atoi(argv[1]);
    data.Priority = atoi(argv[2]);
    DWORD dReturned;
    BOOL status = DeviceIoControl(hDevice,
            IOCTL_SET_PRIORITY,
            &data,sizeof(data),
            nullptr,0,
            &dReturned,nullptr);
    if(status)
         printf("Thread Priority Change Success!!!");
    else
         PrintError("Priority Change Failed!!!");
    CloseHandle(hDevice);        
}

本帖被以下淘专辑推荐:

YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7734
人气
176
分享
52

最佳新人活跃会员

发表于 2022-8-17 13:18:40 | 显示全部楼层
谢谢版主的源代码!顺便恭喜版主,完成了我原来的心愿!
小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5367
人气
208
分享
36

最佳新人活跃会员

 楼主| 发表于 2022-8-17 17:00:49 | 显示全部楼层
蒟蒻 发表于 2022-8-17 13:18
谢谢版主的源代码!顺便恭喜版主,完成了我原来的心愿!

哈哈,共同进步

评分

参与人数 1人气 +2 收起 理由
蒟蒻 + 2 好呀,一起努力

查看全部评分

YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7734
人气
176
分享
52

最佳新人活跃会员

发表于 2022-8-17 17:16:36 | 显示全部楼层
YFSafe 发表于 2022-8-17 17:00
哈哈,共同进步

等我努力学习C++,发布优质内容,去当C++的版主awa

评分

参与人数 1人气 +2 收起 理由
YFSafe + 2 好啊,到时候一起当版主

查看全部评分

小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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