win32

字符编码
原始ascll码 十六进制 0-7F 十进制 0-127
拓展ascll编码 十六进制80-FF 十进制 128-255
天朝的GB2312或GB2312-80 两个字节(扩展ascll编码)表示一个中文字符
引出问题:每个国家都会占用扩展ascll编码表示各个国家的象形文字
UNICODE编码横空出世,它给全世界所有文字每一个唯一的编码(它只给了每个字符的编码,但没给如何储存)下面给出两种编码存储方式
UTF-16以16位为一个单位( A 存储成 41 00)00属于浪费
UTF-8以8位为一个单位(网络传输)解码编码较为繁琐(A存储成 41)省去00
判断文本存储格式BOM(Byte Order Mark)
UTF-8 || EF BB BF
UTF-16LE || FF FE ( 小端)
UTF-16BE || FE FF (大端)
ASCLL编码字符和UNICODE编码字符(也叫C语言中的宽字符,默认使用UTF-16,4个16进制位为单位,存在00浪费,比较“宽”)使用函数不一样
win32 API:windows提供好的执行功能的函数
win32会有许多新类型,其实是原来汇编、C、C++的类型另一种写法,利于跨平台,后期平台升级
win32API中既有ascll码又有UNICODE编码所以定义字符串和字符串指针时推荐写法:
TCHAR stzSr[]=TEXT(“中国”) //定义字符串
PTSTR ptszStr =TEXT(“中国‘) //定义字符串指针
可根据程序类型自动调整编码形式(ascll还是unicode)
win32API函数也是会提供两份(MessageBox(通用 对我说的瓦斯的 sd wsdwasdwsdw as的Wsdaqwsdsaddsa) MessageBoxA (ascll) MessageBoxW(Unicode))
进程提供程序所需的资源如数据、代码等(一堆PE文件)
内存空间地址的划分内存空间地址的划分
进程的创建:1.任何进程都是别的进程创建的,由别的进程调用CreateProcess()创建
2.进程创建的过程
1.映射EXE文件
2.创建内核对象EPROCESS
3.映射系统DLL(ntd.dll)
4.创建线程内核对象ETHREAD5.系统启动线程(映射线程所需的dll 然后线程开始执行)

创建进程必需创建至少一个线程

in指针只管往里传out指针程序结束后往回传相当于返回值
创建进程
//GetLastError()(函数会返回一个数字用来查看错误发生在那)(解释上图getlasterror()函数)
内核对象:像进程、线程、文件、互斥体、事件等在内核都有一个对应的结构体,这些结构体由内核负责管理,我们管这样的对象叫做内核对象
如何管理内核对象引出,想到每个内核对象都有一个对应的结构体,我们可以得到结构体的地址进而对结构体操作(但这样操作风险很大,访问错误的内存地址计算机直接蓝屏),微软提供一种解决方案,给每个进程一张句柄表(进程私有的索引)
句柄表
想对内核对象做任何事,一定要得到句柄值
多进程共享一个内核对象:
1.两个平行的进程,你create我就open
多进程共享一个内核对象,除线程外,其余内核对象结构体的计数器为0时,内核对象关闭,线程满足线程关闭(线程代码执行完毕),计数器为0,线程这个内核对象才会关闭。多进程共享一个内核对象
2.子进程父进程,子进程可继承父进程的句柄表
子进程继承父进程句柄表
操作系统的全局句柄表包含所有正在运行的进程和线程,全局句柄(PID)大家都认识,而进程的句柄表只有自己认识,自己在哪玩。

以挂起形式创建进程,进程先创建好,等你输入恢复命令后再执行。
模块路径:这个程序在那儿
工作路径:创建程序进程(子进程)的进程(也就是父进程)给填的
模块+工作
创建线程:
线程是附属在进程上的执行实体,是代码的执行流程
一个进程可以包含多个线程,但一个进程至少要包含一个线程
线程控制:
SuspendThread(句柄) 挂起某个线程,挂起几次进程就要恢复几次线程
ResumeThread(句柄) 恢复某个线程
线程安全问题:1.多线程有全局变量,2.线程对全局不光有的读的操作,也有写的操作|因此两个或多个线程会对全局变量查看与修改不同步
临界资源:每次只允许一个线程访问 采用win32API线程锁来实现
线程锁
互斥体在内核里的“令牌”让程序只执行一份在这里插入图片描述
CreatMutex()三个参数创建互斥体
获取令牌(互斥体)1.有信号2.线程的拥有者(第二参数填true)
互斥体与线程锁
事件:通知类型
通知类型不去改令牌状态,让两个或多个线程都能拿到令牌然后执行||互斥状态改令牌状态,只让一个线程拿到令牌然后执行。
线程互斥:有你没我有我没你
线程同步:互斥+有序(你一下然后我一下)
互斥体无法实现线程同步,事件可以实现线程同步
窗口的本质
窗口的本质
真正实现画图的是win32k.sys这个模块,而user32.dll(GUI)gdi32.dll(GDI)这两个dll是接口
HWND
由于所有窗口的都是在win32k.dll里的画的,win32k.dll会给每个窗口一个句柄值(HWND),这个句柄值是全局的。
GDI画窗口,并且不停画才能保证窗口一直存在
消息队列
消息:我们鼠标点击和键盘输入,系统会把这些记录封装在一个结构体里,这个结构体就是消息(鼠标 键盘 其他应用程序 系统内核 产生消息 )
消息的处理
消息的第一承接者是系统,系统找到对应的窗口对象,窗口对象找到对应的线程,将消息放到消息队列,线程再根据消息队列的消息执行操作(流水线的操作)
创建窗口程序的步骤
1.定义窗口类
2.创建窗口并显示
3.接受消息并处理
消息的处理机制
子窗口控件:系统提供的几个预定义的窗口类以方便我们使用,控件会自己处理消息,并在自己状态发生改变时通知父窗口,预定义的控件有按钮、复选框、编辑框、静态字符串标签和滚动条
虚拟内存
每个进程有4GB的虚拟内存,这是“空头支票”,使用的时候才会放到物理内存,每个物理内存大小是4KB,采用页式管理,一页4KB,称为物理页
如果物理内存不够用,将硬盘划出一部分当内存使
把物理页挪来挪去,谁着急就给谁用,本身内存不大但可以运行很多程序
物理页挪来挪去
私有内存的申请释放
私有内存:只归当前进程使用的物理页
在这里插入图片描述
P.S.以前malloc是从已经从操作系统要来的内存里分得的内存,而virtualalloc是从操作系统真正地要内存
共享内存的申请释放
共享内存:物理页被多个进程共享大多数内存是共享内存
在这里插入图片描述
文件系统:在磁盘上如何组织文件的方法
文件系统
卷->目录->文件(各部分用到的API)

内存映射文件
内存映射文件
读文件和读自己的内存一样方便
写拷贝:见下图写拷贝
静态链接库目的是模块化
动态链接库(英文缩写DLL),微软在微软WIindows操作系统中,实现共享函数库概念的一种方式,常见后缀名.dll 和.ocx 通常有导出表(这个表会显示有那些函数外面可以使用) 有对应的格式
隐式链接(使用DLL的另一种方式,优点:省事)用到隐式链接,exe会生成一张导入表来记录使用了那些DLL和那些函数 有对应的格式
创建远程线程CreateRemoteThread 远程线程函数(万恶之源:D)
注入:将模块或者代码写入对方进程空间,并设法执行的技术
进程间的通信 通过共享物理内存实现
模块隐藏
代码注入

为心中的美好而战 :D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值