用户层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进行编程,设定计数器阈值和事件,然后性能计数器就会在设定事件发 ...
随机推荐
- Fedora-Workstation-netinst-x86_64-27-1.6系统之无法使用中文解决办法
首先我安装的是Fedora-Workstation-netinst-x86_64-27-1.6操作系统: 但是进入系统之后无论如何都无法使用中文,即使已经安装了[汉语]输入法,最后才发现原因是没有安装 ...
- 给PostgreSQL添加MySQL的unix_timestamp与from_unixtime函数
MySQL的2个常用函数unix_timestamp()与from_unixtime PostgreSQL并不提供,但通过PostgreSQL强大的扩展性可以轻松的解决问题. 话说远在天边,尽在眼前, ...
- Linux命令基础2-ls命令
本文介绍的是linux中的ls命令,ls的单词是list files的缩写,意思的列出目录文件. 首先我们在admin用户的当前路径,新建一个test的文件夹,为了方便本文操作和介绍,创建了不同文件类 ...
- 游戏 & Github Page
1. snakewizard.github.io 贪吃蛇小游戏 2. mattbasile.github.io 龙珠 DragonballZ-Battle 3. nathandhyou.github. ...
- Unity备份占时留用
Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- JPA、Hibernate框架、通用mapper之间的关系及通用mapper的具体实现
JPA是描述对象-关系表的映射关系,将运行期实体对象持久化到数据库中,提出以面向对象方式操作数据库的思想. Hibernate框架核心思想是ORM-实现自动的关系映射.缺点:由于关联操作提出Hql语法 ...
- MySQL_DML语言
#MySQL--DML语言##SQL组成DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:insert,delete,update DCL:数据库控制语言,关键字:gra ...
- 自己用的Xshell配色方案
[comfort]text=dce2e2cyan(bold)=2ad1b8text(bold)=dce2e2magenta=dd3682green=55bb55green(bold)=55bb55ba ...
- 矩形覆盖(JAVA)
矩形覆盖 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路:最初看到这题,只能通过画图归纳来寻找规律. ...
- c#死锁示例代码
void Main() { object obj1 = new object(); object obj2 = new object(); var t1 = new Thread(delegate(o ...