用户层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进行编程,设定计数器阈值和事件,然后性能计数器就会在设定事件发 ...
随机推荐
- css设置文字多余部分显示省略号
如果只显示一行,则可以使用以下方法: overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 如果需要显示多行,在需要设置的元素s ...
- caffe: c++11支持
1)在Makefile中400行左右, CXXFLAGS += -MMD -MP 改成:CXXFLAGS += -MMD -MP -std=c++0x,好像还改了不少地方,有的是 -std=c++1 ...
- Hive元数据找回
如果不小心删除了了hive的元数据文件(/user/hive/warehouse),只要先前core-site.xml文件中设置了fs.trash.interval属性就可以找回.hdfs会为用户创建 ...
- 使用 requests
基本实例 #利用requests库发送get请求 import requests r = requests.get('http://httpbin.org/get') print(r.text) 利用 ...
- 阿里云 oss 图片上传解决方案 vue (web直传)
我们通过aliyun-oss-web这个npm去解决 该文章主要介绍如何获取 imgSignature 和 imgPolicy 这两个参数 首先下载 web直传的案例 : http://files.c ...
- Bartender标签传参与打印
在VS中添加bartender的COM组件引用后(一定要添加,否则会提示找不到BarTender.Application): /// <summary> /// Bartender模板打印 ...
- webbug3.0靶场第二关
由于是新手,当看见一个图片后一脸蒙比,查了一下才知道这原来叫做隐写术 看人家说破解图片隐写术用Stegsolve非常好用,然后查了一下kali软件仓库并没有找到Steegsolve这个软件,只能另想他 ...
- spring+springmvc+hibernate 框架搭建
1.新建web项目,将所需jar包放到 lib 目录下 2.配置web.xml 配置文件 <?xml version="1.0" encoding="UTF-8&q ...
- java设计模式概述
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...
- [转]解决百度ueditor插入动态地图空白 支持iframe方法
说明:新版本ueditor要修改 xss过滤白名单 修改配置文件ueditor.config.js 搜索: whitList 增加下面第二行即可 ,whitList:{ iframe: ['fram ...