写在前面

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

本篇文章主要是让读者对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. CUDA学习笔记-1: CUDA编程概览

    1.GPU编程模型及基本步骤 cuda程序的基本步骤如下: 在cpu中初始化数据 将输入transfer到GPU中 利用分配好的grid和block启动kernel函数 将计算结果transfer到C ...

  2. 「必知必会」最细致的 ArrayList 原理分析

      从今天开始也正式开 JDK 原理分析的坑了,其实写源码分析的目的不再是像以前一样搞懂原理,更重要的是看看他们编码风格更进一步体会到他们的设计思想.看源码前先自己实现一个再比对也许会有不一样的收获! ...

  3. JAVA预科:Markdown基础语法

    JAVA预科:Markdown语法 什么是Markdown?Markdown是一种轻量级的「标记语言」,通常为程序员群体所用,目前它已是全球最大的技术分享网站 GitHub 和技术问答网站 Stack ...

  4. 为什么crictl和ctr的输出有时不一样

    containerd 相比于docker , 多了namespace概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间 cr ...

  5. RHCAS_DAY06

    vi/vim文本编辑器 Vim是从 vi 发展出来的一个文本编辑器,vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性 vi/vim 共分为三种模式:命令模式.输入模式.底线命令模式(末 ...

  6. 网安日记④之搭建域环境(domain)并且配置域

    搭建域环境(domain)并且配置域 什么是域 域就是将多台计算机在逻辑上组织到一起,进行集中管理,也就是创建在域控制器上的组,将组的账户信息保存在活动目录中.域组可以用来控制域内任何一台计算机资源的 ...

  7. 37岁Android程序员裸辞,四个月被497家公司拒绝,问猎头后懵了

    一位网友在职场论坛上发了一个帖子,他说自己今年三十七岁了,是一名Android老兵,因为和上家公司的领导闹矛盾有了嫌隙,一气之下就裸辞了,如今已经辞职四个月了,也失业了四个月. 每天都在努力投简历,共 ...

  8. 进程信号的未决状态(pending status)

    这两天看了apue有关进程信号的部分,觉得未决状态这个词很是不一般,呵呵.一开始当我看到这个词,我不理解,什么意思呢,读了好几遍.不知道是书里面讲的晦涩难懂,还是脑子越来越不行了,就是没有搞明白.后来 ...

  9. jeesite中重启项目时用户头像丢失的疑惑

    jeesite中重启项目时用户头像丢失 使用的时候发现,在更换完头像以后,进行页面的刷新会将头像同步给各个位置,但是在系统重新载入的时候,会出现用户的头像加载不出来的情况,还是以demo为例 可以看到 ...

  10. 常见web中间件漏洞(一)IIS漏洞

    web中间件作为web安全的重要一块,经常会有人问balabala,虽然有很多已经人尽皆知并且基本不再构成威胁了,但是还是有必要说一下,了解历史,了解我们从哪里来 鉴于内容实在是太多,本来打算一起写完 ...