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.pswp.cn/diannao/76741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76741.shtml
英文地址,請注明出處:http://en.pswp.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個,質量堪憂啊

都是原裝貨,主板出現過存儲不完全、圖像存不上、主板代碼保存亂碼、意外出現亂碼的現象。 希望要用的童鞋謹慎使用。