本帖最后由 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);
}
|