win32
__xa__
.
展开
-
虚表指针在哪里
虚表指针群里有人问。就写了从最简单的类开始, 后面有单继承和多继承虚表指针的不同代码在32环境下:先写结论: 虚表指针在构造函数与析构中赋值(下面反汇编证明), 赋值: *this = 虚表指针(即首个成员) 虚表指针指向的是一个数组,存放虚函数,虚函数按一般声明先后排序. 这个数组一般在 .rdata 或 .data 每个父类都会在构造,析构中设置自己的虚表,下面继承中会写 * 为什么要在构造...原创 2021-09-08 18:27:01 · 941 阅读 · 0 评论 -
进程是否被调试
一些没用的反调试#include <iostream>#include <stdio.h>#include <stdlib.h>#include <Windows.h>#include <process.h>#include <Winternl.h>#include <Tlhelp32.h.>#include <tchar.h>using std::cout;using ...原创 2021-05-12 23:31:45 · 65 阅读 · 0 评论 -
检查父进程是不是explorer
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <Windows.h>#include <process.h>#include <Winternl.h>#include <Tlhelp32.h.>#include <tchar.h>using std::cout;using std::endl;DWO...原创 2021-05-12 23:16:48 · 211 阅读 · 0 评论 -
获取父进程
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <Windows.h>#include <process.h>#include <Winternl.h>#include <Tlhelp32.h.>#include <tchar.h>using std::cout;using std::endl;DW...原创 2021-05-12 23:03:59 · 246 阅读 · 0 评论 -
CreateRemoteThread 远程注入
反编译用跟钩子写在同一个dll了 钩子篇:SetWindowsHookExpch.h#ifndef PCH_H#define PCH_H#define _DLLAPI#define _CRT_SECURE_NO_WARNINGS// 添加要在此处预编译的标头#include "te.h"#include <stdio.h>dll :te.h#pragma once#ifdef _DLLAPI #define DLLAPI exte...原创 2021-05-08 21:00:52 · 175 阅读 · 0 评论 -
VirtualQuery获取dll 完整路径
直接通过代码段函数获取 -> VirtualQuery 获取mbi.AllocationBase 基地址1.函数在exe中获取exe路径,此函数在exe的基地址中2.函数在dll中获取dll路径,此函数在dll的基地址中void fuck_it(){}void getModulePath(){ MEMORY_BASIC_INFORMATION mbi; // 根据fuck_it 函数所在的代码段获取 VirtualQuery(...原创 2021-05-08 03:31:29 · 386 阅读 · 0 评论 -
SetWindowsHookEx 全局钩子
反编译用一个无用的键盘钩子, console 代码中加入msg loop , 被勾应用调用SendMessage 去调用钩子函数. 如果不加msg loop 则一直等待dll:te.h#pragma once#ifdef _DLLAPI #define DLLAPI extern "C" __declspec(dllexport)#else #define DLLAPI extern "C" __declspec(dllimport)#endifDLLAP...原创 2021-05-07 14:16:59 · 315 阅读 · 0 评论 -
完成端口服务器
一个可以直接用的最基本的iocp服务器在每个TcpConn对象中可以自己增加各种回调接口至于心跳检测 可以用带外数据oob在客户端来实现;1.这个服务器没有使用acceptex2.再wsarecv的时候并没有直接存放缓冲区. 而是在 GetQueuedCompletionStatus 返回再去recv数据 这样做的目的是为了减少内存的使用, 让wsarecv仅仅产生通知, 类似epoll, 因此GetQueuedCompletionStatus返回0也是正常的 代码里并...原创 2021-03-24 22:05:12 · 145 阅读 · 0 评论 -
原子的比较 compare_exchange_strong
包含原子操作的链接:InterlockedCompareExchange 模拟callonce内存序 memory_order现在假设有一个套接字状态的原子变量 atomic_int socketState;在一个设计不良的多线程环境中, N个线程都会修改此状态,但只能执行一次;enum EnumSocketState { SocketStateNone = 0 , SocketStateAlive = 1, SocketStateClosed = 2};std::atom.原创 2021-03-03 14:09:54 · 2502 阅读 · 0 评论 -
只运行一次 runonce callonce 获取错误字符串
一个老项目需要获取错误信息,来记录日志. 没法用 callonce , 还得支持并发调用;直接改用 InterlockedCompareExchange 来解决简化版:class ErrorInfo{public: enum EnumRunState{ Running = 0, NotRun = 1} ; static volatile long __atomicRunOnce; public: static void Init() { if原创 2021-03-03 07:09:44 · 220 阅读 · 0 评论 -
获取运行时间GetSystemTimeAsFileTime QueryPerformanceCounter
之前一直用 QueryPerformanceFrequency ,QueryPerformanceCounter发现系统调用时间比较长.改用 GetSystemTimeAsFileTime新的:#include <Windows.h>class TimeStamp{ static FILETIME __startFileTime,__endFileTime; static ULARGE_INTEGER __startTime , __endTime;..原创 2021-03-02 11:51:41 · 1355 阅读 · 0 评论 -
日志 多线程 自动刷新 _fwrite_nolock
只启动了一个线程 用来写日志.性能方面没问题, 支持多线程写入.每3秒自动查看缓冲区是否有数据,有就写入 .或者外部N个线程同时写满一块缓冲区,进行写入.主要是减少少量数据[几个字节]就写入一次的次数.写入方面可以用 WriteFile 或者_fwrite_nolock. 如果用用WriteFile 还可以使用APC来通知,目前没此需求另外,写入出错方面,只是简单的打印,可自行修改的完善一些如果没有别的需求,直接使用Log类即可Log : start() 启动, s...原创 2020-07-28 23:29:30 · 362 阅读 · 0 评论 -
win32 定时器 CreateThreadpoolTimer CreateTimerQueueTimer
linux 下可以使用timerfd_create 一系列函数win32下CreateThreadpoolTimer 或者CreateTimerQueueTimer 都可以用进程默认的线程池来使用回调对于DeleteTimerQueueTimer 以及DeleteTimerQueueEx 最后一个参数需要注意一下如果是 INVALID_HANDLE_VALUE : callback如果正在调用则等待回调完成如果是 NULL : callback 如果正在调用,则G...原创 2020-07-27 23:33:24 · 1354 阅读 · 0 评论 -
安全随机数
随机数出问题了, 分装了一个#include <Wincrypt.h>#include <Realtimeapiset.h>#include <tchar.h>#pragma comment(lib,"Advapi32.lib")class CryptRandom{ CRITICAL_SECTION __lock; HCRYP...原创 2020-03-20 21:50:41 · 979 阅读 · 0 评论 -
epoll Reactor 与 iocp 模型
epoll reactor : 能收了告知我 !iocp : 最多给我收wsabuf.len个字节, 收完告诉我!原创 2019-11-06 23:25:01 · 261 阅读 · 0 评论 -
c++ atomic 替换锁
有些文不对题了;最近搞线程池并发过程中突然想起来用 原子类型 来替换一些mutex, rwlock, cond这些东西;比如一个reactor 的epoll+线程池[ 例如4个 ], 在发送数据时为了保证tcp socket的数据顺序,必须加锁处理 [这种模型不容易控制, 实际工程中别用, 对于 socket 还是有一个线程来处理最简单也避免竞争问题].然后我发现了个好东西;...原创 2019-10-31 01:04:17 · 923 阅读 · 0 评论 -
多个消费者多个生产者
之前的是单生产消费者 使用一个mutex解决生产者消费者问题其中第2个例子使用了事件对象, 用于单线程的情况. 若在linux 上用信号量每次解锁一次即可;如果要修改成多个的情况,就要使用信号量. 先解决多个生产 1个消费的问题:const int BUFF_SIZE = 10; //缓冲区大小const int NTIMES = 50; //总共生产的个数st...原创 2018-10-26 17:47:58 · 3754 阅读 · 0 评论 -
另人厌烦的线程安全单例以及不要使用双检测
群里热烈的讨论了线程安全的单例;一路从volitile扯到汇编,从代码到论文,真是够了;首先volitile 跟多线程没直接的关系,或许有些特定情况下会用到;至于spincout之类的实现,内部使用了volitile,这类就不多说了,有兴趣的可以自己看实现;千万别使用下面代码 ,不要使用双检测,不要使用双检测,不要使用双检测:static Singleton* Sin...原创 2019-06-17 01:26:07 · 185 阅读 · 0 评论 -
线程安全 可重入
昨天有人问可重入和线程安全, 实际是混在一起淘浆糊了;这2个是完全不同的概念;可重入函数只有在signal下会发生, 比如一个函数在执行时被中断, 在中断处理函数中又一次被调用,这2次(每次)调用都能产生正确的结果,那就个可重入函数;看一个不可重入的例子:void sig_handler(int sig){ ... gethostbyname("www...原创 2019-07-08 03:42:35 · 951 阅读 · 0 评论 -
EPOLL IOCP OVERLAPPED NONBLOCK的一些说明
最简单的多线程 , 多进程最简单的多进程/多线程服务器代码都是用 一个线程 / 一个进程 来接受/发送数据 , 资源消耗太大,不合算; 相当于一对一 [ 一个老师管理一个学生的样子 ];因此有了 select / poll / epoll / iocp 模型 .select / poll 把多个socket交给一个数组来管理 ,epoll 把每个个socket 所关联的事件统一...原创 2019-07-07 04:07:30 · 330 阅读 · 0 评论 -
一个例子说明volatile
之前一个例子 :另人厌烦的线程安全单例以及不要使用双检测说到了volatile ,volatile本身跟线程没关系, 他只做了一件事:每次读取此变量时,都到内存中去读, 让编译器别优化.gcc -O 进行优化后, 自动变量(int a) 一般情况下都可能被存放在寄存器中;下面代码用回滚操作来说明 volatile 的作用:#include "util.h"#include ...原创 2019-07-07 14:27:00 · 197 阅读 · 0 评论 -
基于多线程的EventSelect
单线程的:异步io通知 WSAEventSelect单线程上最多只能接受64个event;改版多线程的 , 大概思路:1. 主线程就接受一个监听套接字, accept返回的socket 仍到全局队列中2. 一个分配socket的线程 用于控制 socket 分配到哪个 监听事件的线程中去 [ dispath thread] ;3. 创建一个线程池 默认4个线程, 每个线程分别...原创 2019-08-13 17:50:35 · 213 阅读 · 0 评论 -
多线程记录二进制流文件
一个生产者多消费者的应用 , 代码里目前就先简单用了单生成单消费,每一局麻将都需要记录:每一次的发牌,抓牌,出牌 ,吃碰杠胡听;把所有的牌 序列化成二进制存入文件每一局麻将生成一个key , 可随意自己组合下面代码思路仅供参考, 还未测试过; 可修改成多线程日志主线程唯一需要在开始的时候调用一次 start , 记录用push;2种模式可选, 一种不关闭文件han...原创 2019-09-07 16:28:57 · 187 阅读 · 0 评论 -
关于AcceptEx
最基础的IOCP例子, 没有使用扩展函数AcceptEx: IOCP模型* 关于iocp的核心就一点:GetQueuedCompletionStatus 将携带返回2个重要的参数, 一个lpCompletionKey, 一个lpOverlapped.lpCompletionKey : 是 CreateIoCompletionPort((HANDLE)clientSocket , ...原创 2019-09-20 00:21:19 · 1021 阅读 · 0 评论 -
心跳检测,用oob实现
用select和msg_oob实现 心跳;对于oob数据 ,默认情况下 [ 不开OOBINLINE]:他不在接受缓冲区, 而在另1个缓冲区中,这个缓冲区只有一个字节,因此不论客户端以MSB_OOB发送N个字节的数据, 只有最后一个字节是OOB数据, 同理,因为只有一个字节的缓冲区,如果连续2次发送msg_oob , 那么后一次将覆盖前一次, 最后OOB是tcp头中的一个URG指...原创 2019-06-28 17:54:14 · 1175 阅读 · 0 评论 -
多线程中对同一socket调用send/sendto
群里问多线程环境中对一个socket进行send 可以不可以;答:这个问题不是多线程问题 , 是TCP / UDP 的问题;如果是tcp ,这是个错误的设计,如果你无视数据顺序,那可以 ;如果是udp可以;TCP:在win32上,我没有找到send是否线程安全, 但找到了WSASend并不是线程安全的.因此假设send也不是线程安全的,仅仅假设;在posi...原创 2019-06-14 02:41:28 · 4895 阅读 · 1 评论 -
纯重叠io服务器模型
基础:套接字重叠io客户端: telnet 或者自己随意写一个;纯重叠实现的服务器模型,基本上就是使用OVERLAPPED和APC函数完成.APC函数即需要使用alterable状态的函数 , 例 SleepEx.另外重叠io与非阻塞是2个概念.下面的代码中使用到了非阻塞io, 仅仅作用在了accept上. 让其不阻塞;原因是如果阻塞accpet 就没法调用到Slee...原创 2019-01-15 17:32:18 · 465 阅读 · 1 评论 -
多缓冲区读写文件
使用 OVERLAPPED 来读写大文件还错,如果是小文件性能不是特别好 , 这个仅仅是自己电脑的测试.用多缓冲区来读写会比较快 一个例子:const int __BUFFSIZE = 8192; //存放大小const int __LEN = 10; //10个缓冲区struct{ struct{ ...原创 2018-10-30 21:34:34 · 491 阅读 · 0 评论 -
WaitableTimer APC
void test_waitabletimer(){ //创建一个 HANDLE hTimer = CreateWaitableTimer(0, FALSE, NULL); SYSTEMTIME st = {0}; GetLocalTime(&st); _tprintf(TEXT("系统时间:%d - %d - %d %d:%d : %d\n"), st.wYear, st....原创 2018-10-30 15:29:05 · 213 阅读 · 0 评论 -
完成端口读取文件
完成端口首先得了解什么是重叠io OVERLAPPED I/O 异步APC下面的例子只告诉你怎么写这个程序, 不是告诉你理论,即如果在服务器上为什么不使用一个线程一个客户的模型CreateIoCompletionPort 创建一个完成端口. 这个函数有一般需要调用2次 第一次:HANDLE iocp = CreateIoCompletionPort(INVALID_HANDL...原创 2018-10-31 18:13:22 · 1142 阅读 · 0 评论 -
关键段 死锁 读写锁 事件 互斥量 信号量
关键段结构typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUGDebugInfo; LONG LockCount; LONG RecursionCount; HANDLE OwningThread; // 这个最关键,理解了这个变量就理解了关键段 HAND...原创 2018-10-25 22:38:15 · 505 阅读 · 0 评论 -
APC 简介
默认情况下,创建线程时不会创建这个APC队列调用了QueueUserAPC函数或其他可向APC队列添加函数之后,才会创建APC这个队列;每个线程都有自己的APC队列 , 当线程处在alertable状态时才去执行这些APC函数.alertable : 当线程调用例如: WaitForSingleObjectEx , SleepEx 等带ex 的函数, 并把bAlterable参...原创 2018-10-30 02:13:14 · 1006 阅读 · 0 评论 -
OVERLAPPED I/O 异步APC
APC简介:APC附: 套接字中的WSAOVERLAPPED 和 OVERLAPPED 是一个东西. OVERLAPPED 中的InternalHigh 用于显示当前读取了多少字节. Internal 用于显示错误信息, 0 即无错误;GetOverlappedResult 返回的字节以及错误都是根据 OVERLAPPED 结构中的字段来提取的.这也是为什么GetOverl...原创 2018-10-30 16:57:29 · 1275 阅读 · 0 评论 -
进程/线程优先级,亲缘性
亲缘性的意思是 进程只在某个cpu上运行 ,比如BOOL WINAPI SetProcessAffinityMask( _In_ HANDLE hProcess, _In_ DWORD_PTR dwProcessAffinityMask);dwProcessAffinityMask 如果是 0 , 代表当前进程只在cpu0 上工作;如果是 0x03 , 转为...原创 2018-10-23 22:43:46 · 782 阅读 · 0 评论 -
使用一个mutex解决生产者消费者问题
好吧.一个mutex 只能解决 一个生产者, 一个消费者的情况;生产消费 具体是这样的, 2个线程同时启动, 生产线程比如在数组中放入一个值, 然后通知消费线程,消费线程干完事后再通知生产者.消费者的核心是 俺永远只能跟在生产者屁股后面使用一个mutex 实现 (当然 只用一个mutex , 只能让线程去抢占了) , 下一个例子是用2个事件对象,const int BUFF...原创 2018-10-26 02:37:40 · 1470 阅读 · 0 评论 -
计算线程时间, 频率,周期,CPU频率
获取线程时间 . GetThreadTimes , 这个函数并不准//转换函数__int64 convert64(FILETIME ft){// return (((__int64)ft.dwHighDateTime)<<32) | ft.dwLowDateTime; ULARGE_INTEGER ui; ui.LowPart = ft.dw...原创 2018-10-23 18:49:38 · 2614 阅读 · 0 评论 -
提升进程权限 ShellexecuteEx
进程权限只能在启动时才能提升. 目前没有发现进程已经运行了还能修改的方式 SHELLEXECUTEINFO info = {sizeof(SHELLEXECUTEINFO)}; info.lpVerb = TEXT("runas"); //就是这里, runas 以管理员方式启动 info.lpFile = TEXT("cmd.exe"); ...原创 2018-10-23 13:19:56 · 601 阅读 · 0 评论 -
暂停进程
暂停/恢复 某个进程的所有线程 :void suspendProcess(DWORD pid, BOOL bSuspend){ HANDLE snap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, pid ); if(snap == INVALID_HANDLE_VALUE){ return; }...原创 2018-10-22 16:31:58 · 879 阅读 · 0 评论 -
枚举进程 模块 堆栈
void walkProcess(){ HANDLE hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if(hSnap == INVALID_HANDLE_VALUE) return; PROCESSENTRY32 p32; p32.dwSize = sizeof(PROCES...原创 2018-10-22 14:58:46 · 340 阅读 · 0 评论 -
dump UnhandledExceptionFilter
#include <DbgHelp.h>#pragma comment(lib, "DbgHelp.lib")LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ex){ SYSTEMTIME st; GetLocalTime(&st); TCHAR buf[MAX_P...原创 2018-11-01 18:17:25 · 220 阅读 · 0 评论