项目 · 工具 · 开发约 2.3k 字· 5 分钟 最近我做了一个 Windows 小工具,叫 CodexUsageBar。
项目地址:
https://github.com/luodaoyi/codex-useage-win
一句话概括:它是一个原生 Win32/C++ 桌面挂件,把当前 Codex 账号的 5 小时和每周用量,直接放在桌面上实时显示。
简单的GDI操作 窗口程序的本质 :GUI GDI GDI: Graphics Device Interface,图形设备接口,这是Windows提供的一组用于绘制图像的API
GUI: Graphical User Interface,图形用户界面,是指用户操作软件的界面方式,以区别于字符方式
说白了 GDI是一套实打实的接口,真实存在 GUI只是一个概念 …
消息机制与模拟消息 消息机制 硬件产生事件 被操作系统捕获,封装成消息 操作系统发送到系统消息队列 再由操作系统由系统消息队列发送到 对应的线程内核对象中的线程消息队列 线程消息队列处理完毕后,将时间送回操作系统 由操作系统调用窗口回调函数 => WindowProc() 线程消息队列 处理
GetMessage() => 取出消息 …
新建一个窗口程序 消息机制
创建窗口的几个步骤
创建窗口类 注册窗口类 创建窗口 显示窗口 构建消息循环 创建过程 demo : https://github.com/luodaoyi/cpp_code/tree/master/MemoryInjectTool/CreateWindows
//1 创建窗口类型模板 WNDCLASS wndclass = { …
更新 2026.7.23win32257 字· 1 分钟 模块隐藏 遍历模块 HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID ) //dwFlags: TH32CS_SNAPMODULE 遍历模块 PEB (Process Environment Block 进程环境块)
存放进程信息,每个进程都有自己的PEB信息 …
文件系统 什么是文件系统 文件系统是操作系统用于管理磁盘上文件的方法和数据结构,简单说就是在磁盘上如何组织文件的方法,是软件层面的东西
windows上有哪几种文件系统 类型 NTFS FAT32 磁盘分区容量 2T 512MB – 2TB (早先只有32GB) 单个文件容量 4GB以上 最大4GB EFS加密 Y N 磁盘配额 Y N 如何操作文件系统 卷 …
更新 2026.7.23win32约 1.2k 字· 3 分钟 远程线程注入 线程是什么 如果说进程是个大房子,那么线程是进程中干活的人
线程是进程的灵魂
使用进程提供的数据 执行进程提供的代码
临时数据存储在计算机的寄存器中
创建线程 //在自己的进程中创建线程 CreateThread() //在别人的进程中创建线程 HANDLE WINAPI CreateRemoteThread ( _In_ HANDLE …
更新 2026.7.23win32813 字· 2 分钟 动态链接库 静态链接库的缺陷 链接时将函数加入到exe导致exe变大 在运行时对于不同进程他们所使用的同一个函数都会独占空间,造成资源浪费 怎么解决 利用之前学习过的内存知识,例如映射类型的内存块 将这些公共代码放在文件中没在进程运行的时候在加载该文件 并且在内存中只需要加载一边,不同进程使用同一份公共代码时,只需要将之前加载过的这个文件映射到自己内存中即可 …
静态链接库 如何创建静态链接库 vs新建项目,选择静态链接库 在项目文件中新建 .cpp 文件与.h 文件 项目编译生成后会产生一个 .lib文件
如何使用静态链接库 将生成的.h与.lib文件复制到项目根目录
直接添加.lib与.h到项目中
在项目代码中添加头文件引用
#include "xxx.h" #pragma …
更新 2026.7.23CPP · win32554 字· 2 分钟 以文件为后背存储区的内存交换文件 各种后备存储器的内存映射文件 以磁盘中文件系统的具体文件为后备存储的页交换文件(文件映射) 以页交换文件("虚拟内存")为后备存储器的页交换文件(共享内存) 页交换文件(虚拟内存) 通过CreateFileMapping api 创建文件映射内核对象,在内存中申请空间(物理内存和虚拟内存)
通过MapViewOfFile 在 …
更新 2026.7.23CPP · win32约 1.0k 字· 3 分钟 页交换文件与内存映射文件 内存的几种状态和类型 私有类型:
使用VitualAlloc申请分配/调拨内存后,申请的内存只能被当前进程使用。其他进程无法访问。这就是所谓的私有内存
映射类型 -> 页交换文件(虚拟内存)
页交换文件补充了我们的物理内存的不足。在内存中长时间不活跃的数据,系统会将内存写入页交换文件。用以节省内存,所以页交换文件也是计算机内存的一部 …
更新 2026.7.23win32512 字· 2 分钟 物理内存和虚拟内存的关系 进程容器中4GB空间的内容分布
在所谓的4GB空间内,系统内核占据了高2GB的空间,普通进程看不见摸不着,而且高2GB的空间是全局共享。全局就那么一份,各个进程间共享
观察进程内存分布,我们发现进程中真正使用的内存远远不到2gb,而且地址不是连续的。说明操作系统并不是一次性吧内存都给予进程
更新 2026.7.23CPP · win32783 字· 2 分钟 事件和线程同步 函数 //创建一个时间对象 HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性 BOOL bManualReset, // reset type 0自动复位(互斥)、1手动复位(通知模式) BOOL bInitialState, // initial …
更新 2026.7.23win32约 1.0k 字· 3 分钟 临界区、线程锁和互斥体 不可重入函数 不可重入函数: 当这个函数返回前,不可以被其他线程调用
原因:
printf : 访问了引用全局变量stdout malloc : 引用了全局内存分配表 free : 引用的全局内存分配表 类似的 假如我在我的线程中使用全局变量会不会出现类似问题?
坑:
当多线程同时去访问所谓不可重入函数的时候,当A线程调用printf …
更新 2026.7.23CPP · win32约 1.1k 字· 3 分钟 线程的创建和控制 进程和线程的关系:进程提供资源,线程使用资源完成工作
创建线程函数 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性 DWORD dwStackSize, // initial stack size //线程栈大小- …
更新 2026.7.23CPP · win32969 字· 2 分钟 句柄表和继承 句柄代表着备操作的对象
句柄的本质(handler) 句柄表可以看做一个非常大的结构体数组
句柄表的结构
索引值: 进程通过索引找到句柄表中对应的选项
内核对象地址: 通过地址直接找到对应的内核对象
访问掩码: 控制了访问权限
标志位: 标志改句柄能否被继承
句柄表是如何工作的:
每个进程的内核对象,都有一个句柄与之对应
操作对应进程,需要获得 …
更新 2026.7.23CPP · win32397 字· 1 分钟 ListView控件 实现简单进程管理 用到的相关api函数 //获取控件句柄 HWND GetDlgItem( HWND hDlg,//获得控件所处的窗口的句柄 int nIDDlgItem //控件id ); //初始化列表的列 (listview插入新的一列 int ListView_InsertColumn( HWNDhwnd, //控件的句柄 …
进程的遍历、获取与销毁 创建快照遍历 //获得进程所使用的堆,模块和线程的信息快照 HANDLE WINAPI CreateToolhelp32Snapshot ( DWORD dwFlags,//标志位 DWORD th32ProcessID //进程ID ) //dwFlags: 指定的快照中,指定需要拍的系统部分 TH32CS_INHERIT 声明快照 …
更新 2026.7.23CPP · win32628 字· 2 分钟 进程的创建 进程的启动过程 打开目标exe的映象文件 创建进程内核对象 映射NTDLL到内存 创建线程内核对象 通知子系统对进程进行管理 启动线程初始化空间和加载其他DLL 跳转到入口处开始执行 CreateProcess api BOOL CreateProcess( LPCTSTR lpApplicationName, // name of …
更新 2026.7.23CPP · win32318 字· 1 分钟 进程和线程 什么是进程? 进程和普通计算机程序的区别 进程 是运行中的程序 进程 活在内存中 有血有肉有灵魂 程序 死在 硬盘上的 有肉没血没灵魂 如果进程是空间的概念,那么这段空间里有什么? 如果进程是空间概念,那么进程是怎么工作的? 进程和线程的关系 进程: 提供了必要的资源和空间
线程: 使用进程中的资源完成工作的工作人员
关系: 进程提供资源,线程使 …