查看: 555|回复: 4

[原创] [驱动开发教程]2.4.客户程序代码

[复制链接]

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5367
人气
208
分享
36

最佳新人活跃会员

发表于 2022-8-9 18:56:14 | 显示全部楼层 |阅读模式
本帖最后由 YFSafe 于 2022-8-9 18:58 编辑

现在我们可以开始写客户程序代码了!

使用Visual Studio新建一个控制台类型的项目,向导会创建单个源代码文件,把这个文件默认的“Hello,world”这种低智代码删干净,增加一些引用:
[C++] 纯文本查看 复制代码
#include <windows.h>
#include <stdio.h>
#include "..\SetPriority\SetPriorityCommon.h"

注意⚠️:我们需要把我们的公共头文件给引入进来.

接下来,让我们修改main函数的原型,让它能接受传入参数.我们需要接受一个线程id和一个要修改的优先级,然后调用驱动程序改变线程的优先级.
[C++] 纯文本查看 复制代码
int main(int argc,const char* argv[])
{
    if(argc < 3)
    {
        printf("Usage: SetPriority <ThreadId> <Priority>\n");
        return 0;
    }



接下来我们需要打开设备的句柄.传递给CreateFile的“文件名”参数必须是带有"\\.\"前缀的符号链接.完整的调用如下:
[C++] 纯文本查看 复制代码
HANDLE hDevice = CreateFile(L"\\\\.\\SetPriority",GENERIC_WRITE,FILE_SHARE_WRITE,nullptr,OPEN_EXISTING,0,nullptr);
if(hDevice == NULL)
    return PrintError("Failed to open device!!!");


PrintError函数简单的打印出一些信息,包括传入的文本与错误代码.
[C++] 纯文本查看 复制代码
int PrintError(const char * msg)
{
    printf("%s (error = %d)\n", msg, GetLastError());
    return 114514;
}



现在我们有了一个对于我们的设备的合法句柄,可以准备对DeviceIoControl的调用了..

首先,我们需要创建一个ThreadData结构并填充其值.
[C++] 纯文本查看 复制代码
ThreadData data;
data.ThreadId = atoi(argv[1]);
data.Priority = atoi(argv[2]);


现在可以正式开始调用DeviceIoControl了!!!
[C++] 纯文本查看 复制代码
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);



到这里,客户程序代码已经完成,剩下的事情就是完成我们的两个分发例程了.

附:本节完整代码
[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

积分
7680
人气
176
分享
52

最佳新人活跃会员

发表于 2022-8-9 19:16:00 | 显示全部楼层
本帖最后由 蒟蒻 于 2022-8-9 19:19 编辑

干嘛return 114514
不过,看你的教程。。。学废了(我自己笨)

小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

0

技术

3

魅力

0

原创

略知一二

Rank: 3Rank: 3

积分
868
人气
25
分享
0
发表于 2022-8-10 14:51:42 | 显示全部楼层
蒟蒻 发表于 2022-8-9 19:16
干嘛return 114514
不过,看你的教程。。。学废了(我自己笨)

哪里看不懂?

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7680
人气
176
分享
52

最佳新人活跃会员

发表于 2022-8-10 16:57:32 | 显示全部楼层

没有。。。WDK我吐啦(已放弃)
小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

0

技术

3

魅力

0

原创

略知一二

Rank: 3Rank: 3

积分
868
人气
25
分享
0
发表于 2022-8-10 17:52:28 | 显示全部楼层
蒟蒻 发表于 2022-8-10 16:57
没有。。。WDK我吐啦(已放弃)

不是给你发了个链接吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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