写在前面

  本笔记是由本人独自整理出来的,图片来源于网络。本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

本篇文章主要是让读者对Win32基本知识和底层有一个简单的了解,并不是详细介绍WinAPI的使用,如果有这个想法的请不要继续阅读,以免浪费时间。

Win32碎碎念

  1. 文字编码:常见的有ASCIIGB2312Unicode等。
  2. Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。Unicode不一定只占两个字节,也可能是一个字节或者多个字节。
  3. TCHAR是一个宏,它是ASCII编码还是Unicode编码取决于项目的设置。
  4. 每个进程都有一个句柄表;多进程共享一个内核对象;句柄是否“可以”被继承。
  5. 如果句柄不通过继承得到,如果通过调用打开内核对象的API得到的句柄,和源创建内核对象得到的句柄可能是不同的。
  6. 模块目录与工作目录:当前模块路径是不变的,文件放在哪就在哪。工作路径是父进程通过CreateProcess这个API传给。
  7. 把所有引用线程对象CloseHandle,并不会真正销毁该线程对象,除非该线程执行完毕或被Terminate。
  8. malloc是假申请内存,它的本质的HeapAlloc,都是VirtualAlloc提前申请好的私有内存。
  9. 在局部变量创建线程并给线程传参时,要确保这个局部变量的生命周期比线程长,否则局部变量所在函数执行完毕堆栈被清空导致错误。
  10. 进程的虚拟内存只有使用时才挂上对应的物理页(物理内存按照4KB为一页管理)
  11. 一个程序真正拥有低2GB的空间(相对4GB)
  12. 消息队列:每个线程只有一个消息队列
  13. TranslateMessage函数的作用是把键盘消息转化为字符消息(WM_CHAR)

UTF-16/UTF-8/UTF-32Unicode的实现方式

1️⃣ UTF-16

  UTF-16编码以16位无符号整数为单位,注意是16位为一个单位,不

表示一个字符就只有16位。这个要看字符的Unicode编码处于什么范围而定,有可能是2个字节,也可能是4个字节。现在机器上的Unicode编码一般指的就是UTF-16

2️⃣ UTF-8编码规则(网络传输中含有较多字母时建议使用)

Unicode编码(16进制) UTF-8字节流(二进制)
000000 - 00007F 0xXXXXXX
000080 - 0007FF 110xxxxx 10xxxxxx
000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000- 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

3️⃣ UTF-32:以4个字节为单位,类比UTF-16

️ BOM(Byte Order Mark)

LE:小端存储;BE:大端存储

BOM
UTF-8 EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF

️ C语言的宽字符

char(多字节字符类型) wchar_t(宽字符类型)
printf wprintf
strlen wcslen
strcpy wcscpy

️ Win系统中几个重要的DLL

  1. Kernel32.dll:最核心的功能模块,比如管理内存、进程和线程相关的函数等。
  2. User32.dll:是Windows用户界面相关应用程序接口,如创建窗口和发送消息等。
  3. GDI32.dll:全称是Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数。

️ 进程内存空间的地址划分

️ 进程的创建

1️⃣ 任何进程都是别的进程创建的: CreateProcess()

2️⃣ 创建过程

  1. 映射EXE文件
  2. 创建内核对象EPROCESS
  3. 映射系统DLL(ntdll.dll)
  4. 创建线程内核对象ETHREAD
  5. 如果是挂起的方式创建的(CREATE_SUSPENDED),就在这停了,等你Resume。
  6. 系统启动线程:映射DLL(ntdll.LdrlnitializeThunk),线程开始执行

️ 什么是内核对象

  像进程、线程、文件、互斥体、事件等在内核都有一个对应的结构体,这些结构体由内核负责管理,这样的对象叫做内核对象。

️ 如何让线程暂停

让自己停:Sleep()函数

让别人停:SuspendThread()函数

线程恢复:ResumeThread()函数

【注意:挂起几次线程就必须恢复几次线程,线程才能继续】

️ 等待线程结束

  1. WaitForSingleObject();
  2. WaitForMultipleObjects();
  3. GetExitCodeThread();

️ 设置、获取线程上下文

BOOL GetThreadContext(
HANDLE hThread, // handle to thread with context
LPCONTEXT lpContext // context structure
); BOOL SetThreadContext(
HANDLE hThread, // handle to thread
CONST CONTEXT*lpContext // context structure
);

️ 临界区实现之线程锁

  1. 创建全局变量
CRITICAL_SECTION Cs;
  1. 初始化全局变量
lnitializeCriticalSection(&cs);
  1. 实现临界区
EnterCriticalSection(&cs);
//使用临界资源
LeaveCriticalSection(&cs);

️ 使用互斥体示例


HANDLE g__hMlutex =CreateHutex(NULL,FALSE,"XYZ"); //创建互斥体 WaitForSingle0bject(g_hMutex, INF INITE); //获取令牌 //操作代码 ReleaseMutex(g_hMutex); //释放令牌

️ 互斥体与线程锁的区别

  1. 线程锁只能用于单个进程间的线程控制
  2. 互斥体可以设定等待超时,但线程锁不能
  3. 线程意外终结时,Mutex可以避免无限等待
  4. Mutex效率没有线程锁高

️ 线程互斥

 线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。

️ 线程同步(CreateEvent可以实现)

 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。

️ 窗体的本质

图上的dll仅为编程提供接口,真正的实现在右边的exe和sys文件

内核句柄:HANDLE;窗体句柄:HWND

️ GDI图形设备接口(Graphics Device Interface)

️ 窗体是画图画出来的

【注】如果不进行关联的话,将使用默认的画笔

HWND hwnd;
HDC hdc;
HPEN hpen;
//1. 设备对象画在哪
hwnd = (HWND) /*HWND句柄值,为NULL则是桌面*/; //2. 获取设备对象上下文
hdc = GetDc(hwnd); //3.创建画笔设置线条的属性
hpen = CreatePen(PS_soLID,5 ,RGB(0XFF,00,00)); //4. 关联
Selectobject(hdc,hpen); //5. 开始画
MoueToEx(hdc,8,400,NULL);
LineTo(hdc,400,400) ; // gdi32.d11 //6. 释放资源
DeleteObject(hpen);
Re1easeDC(hwnd,hdc);

️ Win32工程入口函数

int APIENTRY WinMain(
HINSTANCE hInstance, //当前模块的内存地址
HINSTANCE hPrevInstance, //NULL
LPSTR lpCmdLine, //命令行
int nCmdShow //显示状态
)

️ 消息机制示意图:

️ 子窗口控件:

  1. WINDOWS提供了几个预定义的窗口类以方便我们的使用,我们一般就它们叫做子窗口控件,简称控件。
  2. 控件会自己处理消息,并在自己状态发生改变时通知父窗口。
  3. 预定义的控件有:按钮、复选框、编辑框、静态字符串标签和滚动条等。

️ 虚拟内存与物理内存的关系

️ 可供使用的物理内存:

  1. MmNumberOfPhysicalPages × 4
  2. 虚拟内存(硬盘)

️ 能够识别的物理内存

  32位系统最多可以识别物理内存为64GB,但由于操作系统的限制

比如XP,只能识别4GB(Windows 2003服务器版本可以识别4GB以上)。

️ 物理页

一个程序对应的物理页如果不经常使用,将会失去,转到硬盘的虚拟内存。如果失去后,程序又要调用,,将走下图的流程获取。

️ 申请内存的两种方式:

  1. 通过VirtualAlloc/VirtualAllocEx申请的: Private Memory(只有该进程使用,别的不能使用)
  2. 通过CreateFileMapping映射的:Mapped Memory(可以公共使用)

️ 文件系统

 文件系统是操作系统用于管理磁盘上文件的方法和数据结构;简单点说就是在磁盘上如何组织文件的方法。

1️⃣ EFS加密是指一个用户在文件属性-高级-加密以保护数据选中时,切换到另一个用户,则该用户无法访问该文件。

2️⃣ 磁盘配额是指Admin赋予给其他用户的磁盘空间,如果超过则拒绝。

️ 卷(在此电脑打开看到的驱动器)相关API

  1. 获取卷:GetLogicalDrives()
  2. 获取一个所卷的盘符的字符串:GetLogicalDrives()
  3. 获取卷的类型:GetLogicalDrives()
  4. 获取卷的类型:GetVolumelnformation()

️ 目录相关API

  1. 创建目录:CreateDirectory()
  2. 删除目录:RemoveDirectory()
  3. 修改目录名称:MoveFile()
  4. 获取程序当前目录:GetCurrentDirectory()
  5. 设置程序当前目录:SetCurrentDirectory()

️ 文件相关API

  1. 创建文件:CreateFile()
  2. 关闭文件的:CloseHandle()
  3. 获取文件长度:GetFileSize()
  4. 获取文件的属性和信息:GetFileAttributes()/GetFileAttributesEx()
  5. 读/写/拷贝/删除文件:ReadFile()/WriteFile()/CopyFile()/DeleteFile()
  6. 查找文件:FindFirstFile()/FindNextFile()

️ 内存映射文件

️ 内存映射文件之共享

️ 写拷贝

羽夏笔记——Win32(非WinAPI)的更多相关文章

  1. 羽夏笔记——PE结构(不包含.Net)

    写在前面   本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...

  2. 羽夏笔记——Hook攻防基础

    写在前面   本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...

  3. 羽夏笔记—— AT&T 与 GCC

    写在前面   本文是本人根据<AT&T 汇编语言与 GCC 内嵌汇编简介>进一步整理,修改了一些错误,并删除我并不能复现代码相关的部分.该文章一是我对 AT&T 的学习记录 ...

  4. 羽夏逆向指引—— Hook

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的, ...

  5. 羽夏看Linux内核——引导启动(下)

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  6. (九)羽夏看C语言——C++番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  7. 羽夏看Win系统内核——进程线程篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  8. 羽夏看Win系统内核——消息机制篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  9. 羽夏 Bash 简明教程(上)

    写在前面   该文章根据 the unix workbench 中的 Bash Programming 进行汉化处理并作出自己的整理,并参考 Bash 脚本教程 和 BashPitfalls 相关内容 ...

随机推荐

  1. PDMan使用

    场景: 这几天项目要完结交付,需要补很多文档.此时发现甲方要求提供数据库设计文档,尽管我觉得他们不会看,但是人家要求,还是补一下吧!时间紧迫,要赶出整个项目的数据库设计文档比较麻烦,每个两三天不行.于 ...

  2. 一键设置WPS_Office_2019专业版的定时自动备份的批处理文件

    一键设置WPS_Office_2019专业版的定时自动备份的批处理文件 rem ================================================ rem 一键设置WPS ...

  3. jadx的使用

    使用jadx之前必须安装配置java环境才能正常打开运行 https://www.cnblogs.com/yhoil/p/14808648.html 一.前言 今天介绍一个非常好用的反编译的工具 ja ...

  4. TypeScript学习笔记(三)泛型、模块化和命名空间

    目录 一.泛型 1. 泛型函数 2. 泛型类 3. 泛型接口 写法一 写法二 两种写法的区别 二.模块化 1. export写法一 2. export写法二 3. 为引入的方法或变量起别名 4. ex ...

  5. MySQL 执行优化查询

    查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...

  6. MSF使用OpenSSL流量加密

    MSF使用OpenSSL流量加密 前言 之前在博客里使用了Openssl对流量进行加密,这次我们来复现暗月师傅红队指南中的一篇文章,尝试用OpenSSL对Metasploit的流量进行加密,以此来躲避 ...

  7. 墙裂推荐!2020Android阿里&腾讯&百度&字节&美团校招面试汇总

    基本情况 2021届硕士生,Android开发岗 此文主要是2020年年初春招实习的面试和正式校招面试经验汇总,最终校招拿到了腾讯,百度,美团等offer 主要包括阿里4面,腾讯实习4面和校招4面,字 ...

  8. 月薪20k+的Android面试都问些什么?(含答案)

    金九银十跳槽季接近尾声了,可是今年由于疫情的影响仍然不太好找工作,相信大家肯定急需一套Android面试宝典,下面就分享给大家我珍藏已久的Android高阶面试宝典,供大家学习 ! 1.自定义Hand ...

  9. PTA 朋友圈 (25 分) 代码详解 (并查集)

    1.题目要求: 某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友" ...

  10. Azure Bicep 开发利器

    Bicep 是一种用于声明式部署Azure资源的领域特定语言.它的目标是通过更清晰的语法.改进的类型安全性.以及对模块化和代码重用的更好支持,彻底简化编写体验. Bicep 其实是对 ARM 模板的透 ...