Windows软件调试初探-进程与线程
Windows软件调试初探-进程与线程进程资源每个进程都有这些资源:
一个虚拟地址空间。
全局唯一Cid,即PID。
一个可执行映像,即该进程可执行文件在内存中的表示。
一个或多个线程。
一个内核空间中的EPROCESS。
一个内核空间中的对象句柄表。
一个用于描述内存目录表起始位置的基地址,即页目录基地址DirBase。当CPU切换到该进程时,将该地址加载到页表基地址寄存器如CR3或TTBR,再由RVA翻译为正确物理地址。
一个用户空间中的PEB。
一个访问令牌。
例如列出系统所有进程:
123456789101112131415161718192021226: kd> !process 0 0 //第一个参数为EPROCESS地址 0表示所有 第二个0为最少信息**** NT ACTIVE PROCESS DUMP ****PROCESS ffff84898203c440 //进程EPROCESS地址 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 //会话、客户进程ID、进程环境快地址、父进 ...
WindowsAPI查缺补漏-动态链接库
WindowsAPI查缺补漏-动态链接库静态链接库静态链接库头文件:
123#pragma onceint funAdd(int a, int b);int funMul(int a, int b);
静态链接源文件:
1234567#include "StaticLinkLibrary.h"int funAdd(int a, int b) { return a + b;};int funMul(int a, int b) { return a * b;};
调用方:
12345678#include <Windows.h>#include "StaticLinkLibrary.h" // StaticLinkLibrary.h头文件#pragma comment(lib, "StaticLinkLibrary.lib") // StaticLinkLibrary.lib对象库int WINAPI WinMain(HINS ...
WindowsAPI查缺补漏-剪贴板
WindowsAPI查缺补漏-剪贴板常用函数OpenClipboard打开剪贴板:
123BOOL OpenClipboard( _In_opt_ HWND hWndNewOwner //与剪贴板相关联得窗口句柄);
在关闭剪贴板前其他应用程序无法打开剪贴板。
EmptyClipboard清空剪贴板中数据,并把OpenClipboard的hWndNewOwner指定的窗口设为剪贴板的新所有者。若hWndNewOwner为NULL则导致后续SetClipboardData失败。
1BOOL EmptyClipboard(VOID);
SetClipboardData把指定格式的数据写入剪贴板:
1234HANDLE SetClipboardData( _In_ UINT uFormat, //要写入剪贴板中数据的格式 _In_opt_ HANDLE hMem //数据的句柄); //成功返回剪贴板数据句柄 失败NULL
其中uFormat常用的有:
枚举值
含义
CF_TEXT
ANSI文本格式
CF_UNICODETEXT
Unicode文本格式 ...
WindowsAPI查缺补漏-进程
WindowsAPI查缺补漏-进程创建进程ShellExecute打开i可执行文件、文档文件、网址等。
12345678HINSTANCE ShellExecute( _In_opt_ HWND hwnd, //父窗口句柄 _In_opt_ LPCTSTR lpOperation, //指定的操作 _In_ LPCTSTR lpFile, //要操作的文件或文件夹 _In_opt_ LPCTSTR lpParameters, //当lpFile为可执行文件时 为命令行参数 _In_opt_ LPCTSTR lpDirectory, //要操作的文件的默认工作目录 _In_ INT nShowCmd //显示标志)
lpOperation可以是:
枚举值
含义
open
由关联的默认程序打开lpFile文件/文件夹
explore
资源管理器打开lpFIle文件夹
edit
用编辑器(记事本)打开lpFile指定的文档,不是文档则调用失败
print
打印lpFile指定的文件,不是文档文件则失败
find
从l ...
WindowsAPI查缺补漏-文件驱动器目录
WindowsAPI查缺补漏-文件驱动器目录碎碎念硬盘容量=柱面数(磁道数)*磁头数(盘面数)*每磁道扇区数*每扇区字节数。
目录SetCurrentDirectory设置当前目录:
123BOOL SetCurrentDirectory( LPCTSTR lpPathName)
GetCurrentDirectory获取当前目录:
1234DWORD GetCurrentDirectory( _In_ DWORD nBufferLength, //缓冲区大小 单位字符 _Out_ LPTSTR lpBuffer //返回当前目录)
GetFullPathName获取一个文件完整路径:
123456DWORD WINAPI GetFullPathName( _In_ LPCTSTR lpFileName, //文件名称 _In_ DWORD nBufferLength, //缓冲区大小 单位字符 _Out_ LPTSTR lpBuffer, //返回完整路径文件名 _Outptr_opt_ LPTSTR* lpFilePart / ...
WindowsAPI查缺补漏-内存管理
WindowsAPI查缺补漏-内存管理碎碎念x64下虚拟地址空间空指针赋值分区,为0x00000000`00000000~0x00000000`0000FFFF,大小约为64KB。用于帮助开发人员捕捉对NULL指针的赋值,例如这样malloc失败时返回NULL,帮助开发人员调错:
12LPINT pInt = (LPINT)malloc(sizeof(INT));*pInt = 5;
用户模式分区,为0x00000000`00010000~0x00007FFF`FFFFFFFF,大小约为128TB。用于每个进程使用,动态链接库也装载到这里,需要内存管理单元MMU将虚地址映射为物理地址。因为这分区用不着这么大,操作系统选择不支持,如Windows Server 2016只支持24TB,Windows 10只支持8TB。
64KB禁入分区,为0x00007FFF`FFFF0000~0x00007FFF`FFFFFFFF,大小约为64KB。Windows系统保留,禁止访问。
内核模式分区,为0x00008000`00000000~0xFFFFFFFF`FFFFFFFF,大小约为167772 ...
WindowsAPI窗口程序设计-常用控件
WindowsAPI窗口程序设计-常用控件按钮类本篇搞一个全是按钮的页面,从上到下分别是普通按钮、图标按钮、位图按钮和自绘按钮,接下来是三个分组框。第一个叫政治面貌,里面有一组单选按钮,分别是中共党员、共青团员、无党派人士。第二个叫个人爱好,里面有3个多选框,分别是看书、唱歌、听音乐。第三个叫荣誉称号,里面有三个三态多选框,即有对勾、有灰色对勾和无对勾,分别是团队核心、技术能手和先进个人。最后有个默认按钮为获取单选复选状态。
常用按钮样式:
枚举值
含义
BS_PUSHBUTTON
普通按钮
BS_NOTIFY
系统发送带有BN_KILLFOCUS和BN_SETFOCUS通知码的WM_COMMAND消息到父窗口
BS_ICON
图标按钮
BS_BITMAP
位图按钮
BS_OWNERDRAW
自绘按钮,按钮需要重绘时父窗口收到WM_DRAWITEM消息
BS_GROUPBOX
分组框
BS_AUTORADIOBUTTON
自动单选窗口
BS_AUTOCHECKBOX
自动复选框
BS_AUTO3STATE
自动三态复选框
BS_DEFPU ...
WindowsAPI窗口程序设计-菜单与资源
WindowsAPI窗口程序设计-菜单与资源菜单-菜单资源法开始在资源文件区新建.rc资源文件,在Menu字样下新建一个菜单IDR_MENU,然后就可以可视的方式设计菜单。双击每个菜单项,在属性窗口中设置ID,例如ID_FILE_NEW、ID_FILE_OPEN等。
菜单添加法一:设置WNDCLASSEX结构的lpszMenuName字段,需要把IDR_MENU转为LPCTSTR类型。
1wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
法二:创建窗口时指定hMenu参数:
123HMENU hMenu;hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU));HWND hWnd = CreateWindowEx(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 180, NULL, hMenu, hInstance, NULL);
其中LoadMenu用来加载菜单资源:
...
WindowsAPI窗口程序设计-基础语法
WindowsAPI窗口程序设计-基础语法基本概念WinMain入口函数。
123456INT WINAPI _tWinMain( _In_ HINSTANCE hInstance, //应用程序当前实例句柄 _In_opt_ HINSTANCE hPrevInstance, //废弃 _In_ LPSTR lpCmdLine, //命令行参数字符串 不包括可执行文件名 _In_ INT nShowCmd //该程序最初怎么显示);
MessageBox消息提示框。
123456INT WINAPI MessageBox( _In_opt_ HWND hWnd, //所有者窗口句柄 _In_opt_ LPCTSTR lpText, //显示的消息内容 _In_opt_ LPCTSTR lpCaption, //标题 _In_ UINT uType //图标按钮样式)
按钮取值:
12345678MB_ABORTRETRYIGNOREMB_CANCELTRYCONTINUEMB_HELPMB_OKMB_OKCANCELMB_RETRYC ...
ImGUI开发入门实战
ImGUI开发入门实战此篇已废弃,不想学这个了。
简介ImGUI已在Github上开源,分为主分支和docking分支。主分支需要在控制台窗口的基础上,新建绘制窗口,窗体绘制在该窗口中。主分支可以用来游戏写挂,例如将绘制窗口透明、外部绘制并大小位置跟随游戏变换。docking主要用来制作桌面软件。
开始去Github上下载ImGUI,把里面根目录的各个.cpp和.h都拿出来。在backends目录下还需要imgui_impl_dx12(DirectX12)那俩和imgui_impl_win32的。
链接器的附加依赖项要有d3d12.lib、d3dcompiler.lib、dxgi.lib。
然后模板直接抄example_win32_directx12就行…
main.h:
1234567891011121314151617#pragma once#include "imconfig.h"#include "imgui.h"#include "imgui_impl_dx12.h"#include "imgui_impl ...