用户层APC队列使用
一 参考
https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-queueuserapc
<<windows核心编程>> 第5版
二 每个线程都有一个APC队列, 在线程处于可警醒状态时, 线程会执行APC队列中apc函数
经过以上参考文章加上测试发现, APC队列中的函数会在以下3个时机调用
1 线程已经创建, 系统在调用线程函数时会检查APC队列, 如果不为空, 则调用APC队列中的apc函数, 直到队列为空后, 才开始调用线程函数
2 线程通过WaitForSingleObjectEx等函数进入可警醒状态时, 会先检查APC队列, 如果不为空, 则调用APC队列中的apc函数, 直到队列为空后, 才开始等待要等待的对象, 此时如果要等待的对象没有进入激发态且没有超时WaitForSingleObjectEx不会返回
3 线程通过WaitForSingleObjectEx等函数进入可警醒状态时, APC队列为空, 且要等待的对象没有进入激发态, 也没有超时, 则线程进入睡眠等待状态, 此时往该APC队列添加APC函数后, 该线程会被唤醒执行完所有APC队列中的函数, 然后不去看要等待的对象是否进入激发态, 立即从WaitForSingleObjectEx中返回, 返回值是WAIT_IO_COMPLETION
测试代码如下
#include <windows.h>
#include <iostream>
#include <process.h> HANDLE hEvent = NULL;
HANDLE HMainEvent = NULL;
DWORD WINAPI TestProc(LPVOID lpThreadParameter)
{
printf("thread start\n");
SetEvent(HMainEvent);
if (hEvent && hEvent != INVALID_HANDLE_VALUE)
{
printf("waitfor start\n");
DWORD ret = WaitForSingleObjectEx(hEvent, INFINITE, TRUE);
//WAIT_OBJECT_0
printf("waitfor ret= 0x%08x\n", ret);
}
printf("thread end\n");
return ;
}
VOID NTAPI TestAPC(ULONG_PTR Parameter)
{
printf("apc func start index=%u\n",Parameter);
}
int main(int argc, char **argv, char **env)
{
HANDLE hT = NULL;
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
HMainEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (hEvent)
{
hT = (HANDLE)_beginthreadex(NULL, , (_beginthreadex_proc_type)TestProc, NULL, , NULL);
if (hT && hT != INVALID_HANDLE_VALUE)
{
WaitForSingleObject(HMainEvent, INFINITE);
//Sleep(2000);
ULONG_PTR index = ;
for(;index <;++index)
{
QueueUserAPC(TestAPC, hT, index);
}
Sleep();
SetEvent(hEvent);
WaitForSingleObject(hT, INFINITE);
}
}
CloseHandle(hEvent);
CloseHandle(HMainEvent);
CloseHandle(hT);
system("pause");
return ;
}
用户层APC队列使用的更多相关文章
- 安全之路 —— 利用APC队列实现跨进程注入
简介 在之前的文章中笔者曾经为大家介绍过使用CreateRemoteThread函数来实现远程线程注入(链接),毫无疑问最经典的注入方式,但也因为如此,这种方式到今天已经几乎被所有安全软件所防御.所以 ...
- APC 篇——备用 APC 队列
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- 【windows 操作系统】【CPU】用户模式和内核模式(用户层和内核层)
所有的现代操作系统中,CPU是在两种不同的模式下运行的: 注意以下内容来自微软: windows用户模式和内核模式 运行 Windows 的计算机中的处理器有两个不同模式:用户模式 和内核模式 . 用 ...
- Linux从用户层到内核层系列 - GNU系列之glibc介绍
题记:本系列文章的目的是抛开书本从源代码和使用的角度分析Linux内核和相关源代码,byhankswang和你一起玩转linux开发 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswa ...
- windows 驱动开发 MDL 内核层 用户层共享内存
参考资料 https://blog.csdn.net/wdykanq/article/details/7752909 http://blog.51cto.com/laokaddk/404584 内核层 ...
- 向Windows内核驱动传递用户层定义的事件Event,并响应内核层的通知
完整的程序在下载:http://download.csdn.net/detail/dijkstar/7913249 用户层创建的事件Event是一个Handle句柄,和内核中的创建的内核模式下的KEV ...
- Dll注入:Ring3 层 APC注入
APC,即Asynchronous procedure call,异步程序调用APC注入的原理是:在一个进程中,当一个执行到SleepEx()或者WaitForSingleObjectEx()时,系统 ...
- 网络编程基础_3.APC队列
APC队列 #include <stdio.h> #include <windows.h> // 保存 IO 操作的结果 CHAR Buffer1[] = { }; CHAR ...
- perf-perf stat用户层代码分析
perf_event 源码分析 前言 简单来说,perf是一种性能监测工具,它首先对通用处理器提供的performance counter进行编程,设定计数器阈值和事件,然后性能计数器就会在设定事件发 ...
随机推荐
- jQuery-3.事件篇---键盘事件
jQuery键盘事件之keydown()与keyup()事件 鼠标有mousedown,mouseup之类的事件,这是根据人的手势动作分解的2个触发行为.相对应的键盘也有这类事件,将用户行为分解成2个 ...
- SQLite 读取数据时,随机顺序
SELECT * FROM [数据表] ORDER BY random() 通过 random() 这个函数来排序
- 微信小程序登录(包括获取不到unionid的情况)
我们一般都是先获取到微信的 unionid,然后再通过 unionid 去登录自己的网站,就可以关联到用户在自己网站上的 user_id,但是在小程序登录中,有时候可以获取到 unionid,有时候获 ...
- Linux matlab.desktop文件
matlab建立菜单文件老是闪退,须用 matlab -desktop 完整配置 matlab.desktop [Desktop Entry] Name=MATLAB Exec=/usr/local/ ...
- Python学习之路基础篇--09Python基础,初识函数
函数可以分为内置函数 和 自定义函数.这次关注的主要是自定义函数.定义函数之后,就可以在任何需要它的地方调用. 1 返回值的重要性 返回值的3种情况 没有返回值 ---- 返回None 不定 retu ...
- Jmeter并发测试
链接推荐:https://blog.csdn.net/weixin_41291554/article/details/80492276
- pdf.js 使用实例(app直接预览pdf格式的文档)
pdf.js可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件 pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,,一个负责API解析,一个负责 ...
- C#编写CLR函数
本案例在VS2017环境中开发: 1.新建项目,“数据库项目”,添加 UserDefinedFunctions.cs类文件,代码如下: using System; using System.Data; ...
- Unity RigidBodyFPSController 鼠标不显示
做第一人称浏览和顶视图浏览时遇到一个坑,就是当切换到第一人称时,操作UI界面的时候就gg,鼠标光标都看不见了. 如下图:LockCursor LockCursor 做了两个操作,第一个就是锁定光标位置 ...
- flutter Row 垂直或水平放置多个widget
使用行(Row)水平排列widget,使用列(Column)垂直排列widget.在行或列中嵌套行或列实现复杂的布局.如下图所示: 此布局按行排列.该行包含两个子布局,左侧一列和右侧的图片 对于行(R ...