windows技术基础知识

NT架构

NT 就是new techonology 的英文单词缩写,是微软1993年推出操作系统的重大升级,如内存管理,安全机制,多任务,多线程支持。在此之前操作系统都是基于MS-DOS上面的图形化界面,只有有限的内存管理和多任务处理能力。 后续微软在NT架构上陆续推出了服务器操作系统Windows server 2003 -- 2025系列,桌面操作系统windows xp --windows 11.

主要的动态库 kernel32, user32,gdi32, ntdll

早期,NT架构从内核到ntdll.dll,kernel32, user32,gdi32都是纯32位实现,后续都进行优化和改造64位的kernel32, user32,gdi32支持兼容运行32位程序。

kernel32

kernel32.dll 是Windows重要的动态链接库,主要用于作用如下:

  • 进程,线程管理。提供了线程和进程的创建,销毁,控制的相关函数。
  • 内存管理。包括内存分配和释放等API,比virtualAlloc, virtualFree等。
  • 文件和设备IO通信相关API,比如文件创建,关闭读写等。
  • 同步机制,提供各种同步对象,信号量等用于线程交互通信。Mutex, CriticalSection,event等。
  • 时间和日期函数的管理。

user32

  • user32.dll 是Windows提供用于windows 消息管理,界面管理相关功能,作用如下。
  • 处理和分发窗口消息相关API,使得程序能够响应用户的的操作。比如GetMessage等。
  • 处理鼠标和键盘事件的方法,比如setCursorPos 设置鼠标位置。
  • 窗口对象的创建和销毁,隐藏显示等。
  • 菜单对话框相关的处理。

gdi32

  • gdi32是windows提供的图像设备接口动态链接库。用于图形管理和绘制相关
  • 图形对象的管理,通过CreatePen, CreateBrush等。
  • 图形的绘制,比如moveToEx, LineTo等。
  • 位图的处理,图标的加载,释放,以及位图的输出等。
  • 提供文本展示相关处理

ntdll

ntdll 是应用层面和Windows内核交互的重要动态链接库, 上面提到的 kernel32,user32,gid32都是通过ntdll 与内核交互的, 我这里专门测试了下, 下面是OllyDbg查到的数据, 可以看到我们代码调用CreateFileW, 是走了kernel32库, 然后库里面右去调用相关ntdll 的方法。(这里说明下,我也是学着使用OD,所以后面ntdll 的入口并不确定找到了对应的,但是可以看到kernel32 里面的确有相关ntdll 的调用,说明我们的理解是没有错误的。)

字符集

学习这一集的时候, 我们先问自己一个问题, 什么是字符集,都有哪些字符集? 为什么要有字符集,字符集作用?带着上面的一些列问题,我们开始今天的字符集之旅~~~~~~~~~

什么是字符集,都有哪些字符集??

字符集对照表

字符集其实就是一个预先定义好的表格, 里面将每个文字都罗列出来,并且为每个文字指定一个独一无二的数字来代替。

以淬渊阁中的“淬”举例:

ASCLL:

这个编码无法表示中文,所以他的字符集找不到

Unicode: 

十六进制: 0x6DEC

十进制:28140

二进制:0110 1101 1110 1100

字母A举例:

ASCLL:

十六进制: 0x41

十进制:65

二进制:01000001

Unicode: 

十六进制: 0x41

十进制:65

二进制:01000001

所以记住字符集: 就是一个表格,一个对照字符和数值对应的表格。除了上面说的 ASCLL ,Unicode外,还有GBK相关中国发布的编码规则。

ASCLL和Unicode前世今生

从上面举例大家可能也发现了,字符A在ASCLL 和Unicode 中都是一样, 这个是因为最初美国指定了ASCLL字符集,英文世界里面ASCLL的编码就足够表示相关字符和文字。但是随这个计算机普及,世界各地都希望都能使用计算机,中文,阿拉伯,柬埔寨....,于是后来人们就开始在ASCLL基础上统一推出了Unicode字符集,后者兼容了ASCLL字符集,也就是为什么ASCLL字符集的字符在Unicode 中是一样的。

utf8&utf16&utf32是字符集吗?

可能听utf8这样的描述太多,有时候会混淆编码和字符集。 首先明确的说他们不是字符集,他们是一种编码关系,是Unicode 字符的存储形势。这样的形式有很多种:

官网描述:

所以记住:utf8&utf16&utf32是一种Unicode字符的存储算法,他通过多种格式来存储一个字符。

我们还是以淬渊阁中的“淬”举例 utf8编码后:

这里可以看到”淬“在Unicode 编码字符集中对应的数值是0x6DEC,但是存入计算机就是0xE6 B7AC, 这里就可以看出UTF8是一个编码存储方案, 大家有兴趣也可以将 淬渊阁中的“淬”(0x6DEC)用utf16或32 加上BOM 或不带BOM的方式展示出来看看。(BOM 就数据大小端存储方式的标记。)

为什么要有字符集,字符集作用?

主要是以下两个作用:

  • 支持字符在计算机中存储和传递
  • 支持字符的打印和屏幕渲染

计算机只知道二进制,所以字符并没有办法存入计算机,只有采用数字,进而转化成二进制才能在计算机存储。所以字符集对应的数字就可以存入计算机,ASCLL 码比较简单,对应的数字转换成二进制就可以直接存入计算机了, 但是Unicode编码推出后,考虑到了字节浪费,所以通过UTF(8,16,32)编码方案将Unicode对应的编码优化到了1-4个字节大小来存入计算机。

这个字符集除了在存储的时候使用外,还在字符输出UI时也有用到, 比如一个字符”淬“通过二进制在计算机中传递,当要打印出来的时候,他们会去获取相关字体,字体里面会保存”淬“这个字对应的矢量数据(或者简单理解为这个字的像素点位位置)和这个字对应的字符编码。 当二进制数据和这个字体中存入的编码一致的时候, 计算机就将矢量数据渲染到屏幕上和打印机中,从而实现打印。

 字符查询网站

 ASCLL

Unicode   or    Unicode

UTF8&Unicode常见问题答案

 __stdcall和__cdecl约定

stdcall: stdandard call 

cdecl: c  declaration

__stdcall和__cdecl 用于c/c++ 调用函数方式的约定,决定了不同的参数访问和入栈的顺序,决定由谁来清理栈数据。

__stdcall

调用函数的时候,参数是从右到左顺序入栈。然后函数执行完成后,是由被调用者来负责清理栈数据。

__cdecl

调用函数的时候,参数是从右到左顺序入栈,然后函数执行完成后, 是由调用者来负责清理栈数据。 

__cdecl 由于是由调用者来负责清理栈,所以他可以支持可变参数。

其实这里我是有疑问的? 为啥__stdcall是被调用者清理栈就不支持可变参数呢?

后来我查了下资料,解释是这样的, __stdcall修饰的时候时候,编译器知道有几个参数,所以就会生成对应的栈清理代码,被调用函数调用出栈的时候就能准确清理参数个数。 如果用__stdcall来修饰可变参函数,那么编译期间就不知道运行的时候会传入几个参数的,所以__stdcall不可以用于可变参函数。 __cdecl是由调用者清理,因为调用者是动态传入的参数个数,所以函数执行完成后,他是知道传入了几个,所以知道清理几个参数,这就是为什么它可以支持可变参的原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迪杰斯特拉+二分+优先队列+拓扑+堆优化(奶牛航线Cowroute、架设电话线dd、路障Roadblocks、奶牛交通Traffic)

原文地址 https://fmcraft.top/index.php/Programming/2025040402.html 主要算法 迪杰斯特拉Dijkstra 题目列表 P1:奶牛航线Cowroute 题目描述 题目描述 Bessie已经厌倦了农场冬天的寒冷气候,她决定坐飞机去更温暖的地方去度假。不幸的是&#xf…

#Liunx内存管理# 在32bit Linux内核中,用户空间和内核空间的比例通常是3:1,可以修改成2:2吗?

在32位Linux内核中,用户空间和内核空间的3:1默认比例可以修改为2:2,但需要权衡实际需求和潜在影响。以下是具体分析: 一、修改可行性 1.技术实现 通过内核启动参数调整虚拟地址空间划分,例如在GRUB配置中添加mem2G参数&#xff0c…

JAVA:使用 Curator 进行 ZooKeeper 操作的技术指南

1、简述 Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库,它极大地简化了使用 ZooKeeper 的开发工作。Curator 提供了高层次的 API,封装了很多复杂的 ZooKeeper 操作,例如连接管理、分布式锁、Leader 选举等。 在分布式系统中&#…

Julia语言的测试覆盖率

Julia语言的测试覆盖率探讨 引言 在现代软件开发中,测试是确保软件质量的重要环节。随着软件的复杂度不断增加,测试覆盖率作为衡量测试质量的一个重要指标,受到了越来越多开发者的关注。Julia语言作为一种高性能的动态编程语言,…

【万字总结】前端全方位性能优化指南(八)——Webpack 6调优、模块联邦升级、Tree Shaking突破

构建工具深度优化——从机械配置到智能工程革命 当Webpack配置项突破2000行、Node进程内存耗尽告警时,传统构建优化已触及工具链的物理极限:Babel转译耗时占比超60%、跨项目模块复用催生冗余构建、Tree Shaking误删关键代码引发线上事故……构建流程正从「工程问题」演变为「…

使用MCP服务器实现AI任务完成通知:让Cursor更智能

0. 简介 在使用AI工具进行长时间任务时,常常需要等待结果。MCP(Model Context Protocol)服务器"mcp_server_notify"提供了一个优雅的解决方案,让AI在完成任务后通过系统通知提醒你。本文将介绍如何在Cursor中配置和使用…

Java面试黄金宝典33

1. 什么是存取控制、 触发器、 存储过程 、 游标 存取控制 定义:存取控制是数据库管理系统(DBMS)为保障数据安全性与完整性,对不同用户访问数据库对象(如表、视图等)的权限加以管理的机制。它借助定义用户…

DataX实战教程

需求: 用datax同步mysql: 192.168.236.134中test1库的user表到192.168.236.136中test1库的user表 步骤: 下载安装包 https://github.com/alibaba/DataX/blob/master/userGuid.md 进入引导页 https://github.com/alibaba/DataX/blob/ma…

C#/.NET/.NET Core技术前沿周刊 | 第 32 期(2025年3.24-3.31)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…

c++基础-----c++ 成员变量初始化顺序

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 描述 在C中,类的成员变量初始化的顺序是由它们在类中声明的顺序决定的,而不是由它们在构造函数初始化列表中的顺序决定的。这意味着无论你在构造函数初始化列表中如何…

Pascal语言的贪心算法

贪心算法与Pascal语言 引言 在算法设计与分析中,贪心算法是一类重要的算法策略。它以一种直接而高效的方式解决问题,尤其适合那些可以通过局部最优解推导出全局最优解的问题。在本文中,我们将探讨贪心算法的基本概念、工作原理及其在Pascal…

Sensodrive力控关节模组SensoJoint:TÜV安全认证助力机器人开发

在机器人技术领域,安全性和开发效率是行业关注的重点。SensoDrive的SensoJoint 机器人力控关节模组,凭借其可靠的安全性能和高效的开发优势,正在为机器人开发提供有力支持。 2025年3月31日,SensoDrive的 SensoJoint 力控关节模组获…

自动驾驶04:点云预处理03

点云组帧 感知算法人员在完成点云的运动畸变补偿后,会发现一个问题:激光雷达发送的点云数据包中的点云数量其实非常少,完全无法用来进行后续感知和定位层面的处理工作。 此时,感知算法人员就需要对这些数据包进行点云组帧的处理…

栈回溯和离线断点

栈回溯和离线断点 栈回溯(Stack Backtrace) 栈回溯是一种重建函数调用链的技术,对于分析栈溢出的根本原因非常有价值。 实现方式 // 简单的栈回溯实现示例(ARM Cortex-M架构) void stack_backtrace(void) {uint32_…

Vue3学习二

认识组件的嵌套 还可以将Main中内容再划分 scoped防止组件与组件之间的样式相互污染 组件的通信 父子组件之间通信的方式 父组件传递给子组件 给传过来的内容做限制 type为传的内容的属性类型,required为true表示该内容是必须传的,default为&#xff0c…

配置文件 yaml

文章目录 一、yaml简介二、YAML 文件基本语法1.缩进2.键值对3.注释4.支持多种数据类型5.示例 YML 文件 三、YAML 文件的基本元素:纯量、对象、数组1.纯量(scalars)(1)布尔值(Booleans)(2)Null 值 2.对象(Object) / 映射(Mapping) / 字典(Dictionaries) / 键值对(Key…

antvX6自定义 HTML 节点创建与更新教程

自定义 HTML 节点创建与更新教程 本文详细介绍如何利用 HTML、CSS 和 JavaScript 创建自定义节点,并通过动态更新节点数据来改变节点显示效果。无论你是否有前端基础,都能轻松跟着本教程一步步实现。 1. 基础样式设置 首先,使用 CSS 定义基…

前端开发工厂模式的优缺点是什么?

一、什么是工厂模式? 工厂模式属于创建型设计模式,核心思想是将对象的实例化过程封装到特定方法或类中,让客户端不需要直接通过new关键字创建对象。 举个例子:就像奶茶店不需要顾客自己调配饮品,而是通过"点单-…

Element-plus弹出框popover,使用自定义的图标选择组件

自定义的图标选择组件是若依的项目的 1. 若依的图标选择组件 js文件,引入所有的svg图片 let icons [] // 注意这里的路径,一定要是自己svg图片的路径 const modules import.meta.glob(./../../assets/icons/svg/*.svg); for (const path in modules)…

openmv用了4个了,烧了2个,质量堪忧啊

都是原装货,主板出现过存储不完全、图像存不上、主板代码保存乱码、意外出现乱码的现象。 希望要用的童鞋谨慎使用。