当前位置: 首页 > article >正文

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是由调用者清理,因为调用者是动态传入的参数个数,所以函数执行完成后,他是知道传入了几个,所以知道清理几个参数,这就是为什么它可以支持可变参的原因。

相关文章:

windows技术基础知识

NT架构 NT 就是new techonology 的英文单词缩写,是微软1993年推出操作系统的重大升级,如内存管理,安全机制,多任务,多线程支持。在此之前操作系统都是基于MS-DOS上面的图形化界面,只有有限的内存管理和多任…...

在 Windows 环境下使用 VSCode 和 TinyGo 开发 ESP8266(NodeMcu) or STM32

支持的型号 https://tinygo.org/docs/reference/microcontrollers/ 1. 安装Go 2. 安装TinyGo,并添加环境变量 https://github.com/tinygo-org/tinygo/releases 3. VSCode配置,安装插件,选择设备 package mainimport ("machine"&q…...

计算机视觉算法实战——基于YOLOv8的汽车试验场积水路段识别系统

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 引言:汽车试验场智能化管理的迫切需求 在现代汽车研发流程中,试验场作为验证车辆性…...

One API:LLM API 管理 分发系统,github 24.2K Star!

随着人工智能领域的不断发展,国内外各大厂商纷纷推出了自己的 AI 大模型。面对 DeepSeek、OpenAI、Claude、腾讯元宝等众多平台的 API 接口差异,开发者常常需要花费大量时间调整代码、处理密钥管理与流量调控。One API 正是在这种背景下诞生,…...

Android Settings 有线网设置界面优化

Android Settings 有线网设置界面优化 文章目录 Android Settings 有线网设置界面优化一、前言二、简单修改1、修改的EthernetSettings代码:2、有线网ip获取代码:3、AndroidManifest.xml定义有线网的Activity4、修改后界面: 三、其他1、有线网…...

正则入门到精通

​ 一、正则表达式入门​ 正则表达式本质上是一串字符序列,用于定义一个文本模式。通过这个模式,我们可以指定要匹配的文本特征。例如,如果你想匹配一个以 “abc” 开头的字符串,正则表达式可以写作 “^abc”,其中 …...

微信小程序基于Canvas实现头像图片裁剪(上)

序言 嘿,打工人混迹职场这么久,图片处理肯定都没少碰。不过咱说实话,大部分时候都是直接 “抄近道”,用现成的三方组件😏。就像我,主打一个会用工具,毕竟善用工具可是咱人类的 “超能力”&…...

Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)

一、Logback 在 Spring Boot 中,日志框架默认使用的是 Logback,Spring Boot 提供了对日志配置的简化 Spring Boot 默认会将日志输出到控制台,并且日志级别为 INFO 可以在 application.yaml 或 application.properties 文件中进行日志配置 …...

基于VMware的Cent OS Stream 8安装与配置及远程连接软件的介绍

1.VMware Workstation 简介: VMware Workstation(中文名“威睿工作站”)是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。…...

Ubuntu环境基于Ollama部署DeepSeek+Open-Webui实现本地部署大模型-无脑部署

Ollama介绍 Ollama是一款简单好用的模型部署工具,不仅可以部署DeepSeek,市面上开源模型大部分都可以一键部署,这里以DeepSeek为例 官网 DeepSeek 版本硬件要求 安装Ollama 环境 sudo apt update sudo apt install curl sudo apt install lsof1.命令一键安装 在官网点击…...

goto在Java中的用法

说明:goto 在一些编程语言(如C语言)中,是用来表示跳转的,即代码执行到此处跳转到对应位置继续执行。 举例 举个例子,如下,是一个双层嵌套循环。现在我需要代码在内层循环符合某条件时跳出双层…...

Vue3+Vite+TypeScript+Element Plus开发-03.主页设计与router配置

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 文章目录 目录 系列文档目录 文章目录 前言 一、主页设计 二、配置代替别名 三、配置router 四、运行效果 五、参考文献 前言 本文将重点介绍如何使用…...

linux gcc

一、常用编译选项 ​基本编译 gcc [input].c -o [output] ​示例: gcc hello.c -o hello # 将 hello.c 编译为可执行文件 hello ./hello # 运行程序 ​分步编译 预处理:-E(生成 .i 文件) gcc -E hello.c -o hello…...

无限滚动(Infinite Scroll)页面谷歌不收录!必须改回分页吗?

近三年,全球超过58%的网站采用无限滚动设计(数据来源:PageTraffic 2023) 谷歌官方数据显示,动态加载内容的索引失败率高达73%(Google Webmaster Report 2022),而采用纯无限滚动的页…...

出现次数超过一半的数(信息学奥赛一本通-1186)

【题目描述】 给出一个含有n&#xff08;0 < n < 1000&#xff09;个整数的数组&#xff0c;请找出其中出现次数超过一半的数。数组中的数大于-50且小于50。 【输入】 第一行包含一个整数n&#xff0c;表示数组大小&#xff1b; 第二行包含n个整数&#xff0c;分别是数组…...

Git相关笔记1 - 本地文件上传远程仓库

Git相关笔记 目录 Git相关笔记Git上传相关文件第一步创建一个仓库&#xff1a;第二步本地创建空文件夹&#xff1a;第三步开始在gitbush上传文件&#xff1a;解决外网网络连接的问题&#xff1a;中文文件的编码问题&#xff1a;参考资料 Git上传相关文件 第一步创建一个仓库&a…...

Linux_4

开始学习ssh工具 在做开发的时候,肯定不止一台服务器,那么假设每台服务器都是Linux服务器,要在服务器上操作就需要登入终端,即Terminal。ssh的作用就是可以通过一个服务器登陆上其他的服务器。 登陆到哪个服务器看到的就是哪个服务器的终端terminal。 ssh登陆 ssh user@…...

如何计算财富自由所需要的价格?

写在前面&#xff1a;​【财富自由计算器】已上线&#xff0c;快算算财富自由要多少​ 多少钱&#xff0c;才能实现你的财富梦想&#xff1f; 需要多少&#xff0c;才能实现财务安全、财务独立&#xff0c;甚至财务自由&#xff1f; 看到结尾&#xff0c;你会很清楚地看到&…...

thinkphp每条一级栏目中可自定义添加多条二级栏目,每条二级栏目包含多个字段信息

小程序客户端需要展示团购详情这种结构的内容,后台会新增多条套餐,每条套餐可以新增多条菜品信息,每条菜品信息包含菜品名称,价格,份数等字段信息,类似于购物网的商品多规格属性,数据表中以json类型存储,手写了一个后台添加和编辑的demo 添加页面 编辑页面(json数据…...

Perl语言的文件系统

Perl语言中的文件系统操作 引言 在软件开发中&#xff0c;文件系统操作是一个不可或缺的部分。无论是简单的文件读取、写入&#xff0c;还是复杂的文件管理&#xff0c;合理的文件系统操作都能极大提升程序的效率和可维护性。Perl语言是一种强大的文本处理语言&#xff0c;凭…...

深入解析ARM与RISC-V架构的Bring-up核心流程

深入解析ARM与RISC-V架构的Bring-up核心流程 作者&#xff1a;嵌入式架构探索者 | 2023年10月 引言 在嵌入式开发中&#xff0c;处理器的Bring-up&#xff08;启动初始化&#xff09;是系统运行的第一道门槛。ARM和RISC-V作为两大主流架构&#xff0c;其Bring-up流程既有共性…...

关于UDP端口扫描概述

尽管互联网上大多数流行服务都基于 TCP 协议运行&#xff0c;但 UDP 服务也广泛部署。DNS、SNMP 和 DHCP&#xff08;注册端口 53、161/162 和 67/68&#xff09;是最常见的服务之一。 由于 UDP 扫描通常比 TCP 扫描更慢、更困难&#xff0c;一些安全审计人员可能会忽略这些端…...

C语言的操作系统

C语言的操作系统 引言 操作系统是一种系统软件&#xff0c;它管理计算机硬件和软件资源&#xff0c;并为计算机程序提供公共服务。在现代计算机科学中&#xff0c;操作系统是不可或缺的组成部分&#xff0c;而C语言则是实现高效操作系统的主要编程语言之一。本文将探讨C语言在…...

洛谷题单3-P5725 【深基4.习8】求三角形-python-流程图重构

题目描述 模仿例题&#xff0c;打印出不同方向的正方形&#xff0c;然后打印三角形矩阵。中间有个空行。 输入格式 输入矩阵的规模&#xff0c;不超过 9 9 9。 输出格式 输出矩形和正方形 输入输出样例 输入 4输出 01020304 05060708 09101112 13141516010203040506 …...

Lettuce与Springboot集成使用

一、Lettuce核心优势与Spring Boot集成背景 Lettuce特性 基于Netty的非阻塞I/O模型&#xff0c;支持同步/异步/响应式编程线程安全&#xff1a;共享单连接实现多线程并发操作&#xff0c;性能衰减低原生支持Redis集群、哨兵、主从架构&#xff0c;自动重连机制保障高可用Spring…...

C# 类库生成后自动复制到指定目录

C# 类库生成后自动复制到指定目录 在C#中,当你开发了一个类库项目(通常是.NET Core或.NET Framework项目),你可能会希望在构建(Build)完成后自动将生成的DLL文件复制到指定的目录。有几种方法可以实现这个需求,下面是一些常用的方法: 方法1:使用MSBuild的AfterBuild…...

《系统分析师-基础篇-1-6章总结》

第1章 绪论 系统分析师角色 职责&#xff1a;需求分析、系统设计、项目管理、技术协调。 能力要求&#xff1a;技术深度&#xff08;架构设计、开发方法&#xff09; 业务理解&#xff08;企业流程、行业知识&#xff09; 沟通能力。 系统开发生命周期 传统模型&#xf…...

一个完整的 HTTP/HTTPS 请求流程

HTTP 一个完整的 HTTP 请求流程可以分为以下几个步骤&#xff1a; 1. DNS 解析 当客户端&#xff08;通常是浏览器&#xff09;输入 URL&#xff08;例如 https://www.example.com&#xff09;时&#xff0c;它首先需要解析出对应的 IP 地址。这个过程涉及 DNS&#xff08;域…...

go游戏后端开发25:红中麻将规则介绍

一、游戏基础规则介绍 在开发红中麻将游戏之前&#xff0c;我们需要先了解其基础规则。红中麻将的牌面由 a、b、c、d 四种花色组成&#xff0c;其中 a、b、c 分别代表万、条、筒&#xff0c;每种花色都有 1 - 9 的九种牌&#xff0c;每种牌各有四张&#xff0c;总计 36 张 4 …...

【YOLO系列(V5-V12)通用数据集-电梯内电动车检测数据集】

YOLO格式的电梯内电动车检测数据集&#xff0c;适用于YOLOv5-v11所有版本&#xff0c;可以用于本科毕设、发paper、做课设等等&#xff0c;有需要的在这里获取&#xff1a; 电梯内电动车检测数据集 数据集专栏地址&#xff1a;https://blog.csdn.net/qq_41304809/category_1290…...