本地系統服務常式:Nt和Zw系列函數

来源:https://www.cnblogs.com/liaoguifa/archive/2018/09/14/9647870.html
-Advertisement-
Play Games

Windows本地操作系統服務API由一系列以 Nt 或 Zw 為首碼的函數實現的,這些函數以內核模式運行,內核驅動可以直接調用這些函數,而用戶層程式只能通過系統進行調用。通常情況下用戶層應用程式不會直接調用 Nt 和 Zw 系函數,更多的是通過直接調用Win32函數,這些Win32函數內部會調用 ...


Windows本地操作系統服務API由一系列以NtZw為首碼的函數實現的,這些函數以內核模式運行,內核驅動可以直接調用這些函數,而用戶層程式只能通過系統進行調用。通常情況下用戶層應用程式不會直接調用NtZw系函數,更多的是通過直接調用Win32函數,這些Win32函數內部會調用NtZw系函數,但也僅限於通常情況下,當Win32函數不支持一些操作時,用戶層也會直接調用這些本地系統服務函數。

Nt首碼是Windows NT的縮寫,但Zw首碼並沒有任何意義,使用Zw只是避免跟其他已存在和未來可能出現的API有命名衝突而已。很多Windows驅動支持函數都以兩到三個特定的簡稱字母為首碼進行命名,以此來表示這些常式都是由哪些內核系統組件實現的,比如CmRegisterCallbackEx中的Cm就表示配置管理器(Configuration manager

每個本地系統服務常式都有兩個有著不同首碼的相似名稱的函數版本,比如NtCreateFileZwCreateFile,兩者執行相同的操作,並且事實上兩者也都服務於相同的內核模式系統常式。對於用戶層的系統調用,NtZw系函數是沒有什麼區別的,但對於來自於內核驅動的調用,NtZw系函數對傳入參數的處理方式有些不一樣。

如果傳入參數是來自於可信任的內核層,那麼內核模式驅動則調用Zw版本的本地系統服務常式來通知其他常式,在這種情況下,常式都是不經過驗證就直接使用這些參數。反而,如果這些參數可能來自用戶層或者內核層,那麼驅動則調用Nt版本的常式,這取決於調用線程的歷程——這些參數是從用戶層還是內核層發起的,線程對象中有個PreviousMode的屬性可用於判斷參數是否從用戶層過來的,關於常式如何判斷參數是來自用戶層還是內核層,詳細內容請參見預先模式

當一個用戶層應用程式調用NtZw系函數,這些本地系統服務函數始終會認為它接收到的參數來自於不可信任的用戶層,在使用前必先驗證參數的有效性。特別是對於由調用者提供的緩存區,這些函數將會探測其記憶體地址是否有效並且是否正常對齊。

本地系統服務常式對於接收到參數值還會做額外的設定。如果一個常式接收到一個由指向由內核驅動分配的緩存區指針,它會認為這緩存區是從系統記憶體而不是從用戶層記憶體分配的,如果常式接收到一個由用戶層應用程式打開的句柄類型參數,那麼常式就會從用戶層句柄表中查找句柄而不是從內核層。

在一些情況下,從用戶層調用還是從內核層調用對傳入參數的意義和後續的使用影響重要。比如說ZwNotifyChangeKey(或說NtNotifyChangeKey)這個函數,其中有兩個輸入參數ApcRoutineAPCContext,從用戶層和從內核層傳過來分別代表不同的意義。如果其從用戶層被調用,ApcRoutine指向一個APC常式,ApcContext則指向一個由操作系統在調用APC常式時分配的上下文;如果其從內核層被調用,ApcRoutine指向一個WORK_QUEUE_ITEM結構,而ApcContext則表示WORK_QUEUE_ITEM隊列項的類型。

用戶層不支持調用Zw系函數,而在內核層調用Zw系函數時,上面也稍微提到過,系統不檢測調用者的訪問許可權,調用之前必須檢測從用戶模式下傳來的參數的有效性

大多數Zw 系函數的聲明在Wdm.h中可以找得到,少部分散落在其他頭文件里如Ntddk.hNtifs.h

用戶層可通過引用Ntdll.lib靜態庫(在WDK中可以找到)來調用這些本地系統服務常式,大多數文檔化的Nt系函數聲明在Windows SDKWinternl.h頭文件中,對於未文檔化的Nt系函數,微軟一直不建議開發者進行調用,因為在未來的Windows版本中這些函數介面可能會有所改動或者直接被廢除,這對使用了這些未文檔化函數的應用程式的穩定運行造成一定的影響,但往往是這些未文檔化的函數和結構體能夠獲取更多的系統許可權,這也是眾多的Windows應用開發者不聽勸告反而樂此不疲地去挖掘的原因。

內核驅動可通過調用NtZwNtoskrnl.exe的動態鏈接庫的入口點(entry points)來使用這些本地系統服務常式的,該DLL(動態鏈接庫)包含這些服務常式的具體實現,要訪問這些入口點,驅動程式需要靜態鏈接到Ntoskrnl.lib(在WDK中也可以找到)

對於Nt*Xxx* and Zw*Xxx* 的具體函數列表可查看此處


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹從DDD(Domain-Driven Design[領域驅動設計])的角度來說說為什麼要使用Entity Framework(以下都會簡稱為EF),同時也看出類似Drapper之類的簡陋ORM不足的地方。 ...
  • 主要是通過一個WindowManager管理類,在window後臺代碼中通過WindowManager註冊需要彈出的窗體類型,在ViewModel通過WindowManager的Show方法,顯示出來。 WindowManager代碼如下: 做一個擴展方法,將子窗體註冊方法擴展到Window類型的對 ...
  • . 創建.net core web api 1.1 選擇一個empty 模式,裡面只有簡單的2個class 1.2 配置web api 的路由. 1.2.1 打開Startup.cs,首先引用config(Microsoft.Extensions.Configuration),創建一個構造函數,註入 ...
  • 在ASP.Net Core中,如果直接在Middleware中獲取RouteData返回的是空值,這是因為RouterMiddleware還沒執行。但有些情況下需要獲取RouteData,這要怎麼做呢? ...
  • 一、Webservice開發 1、在解決方案右鍵添加新建項目,新建空的web應用程式 2、在新建的項目右鍵添加新建項選擇web服務 3、這裡就是webservice 里的方法,可以添加自己需要的方法(方法前需要添加[WebMethod] 的特性,才可以被調用) 4、發佈iis即可訪問 5、需要身份驗 ...
  • GCC(GNU Compiler Collection,GNU 編譯器套件)是由 GNU 開發的編程語言編譯器,支持C、C++、Objective-C、Fortran、Java、Ada和Go語言等多種預言的前端,以及這些語言的庫(如libstdc++、libgcj等等),它是以 GLP 許可證所發行... ...
  •     對任意一門語言都會有變數,在awk中變數分為 內置變數 和 自定義變數 。 內置變數:就是預先在awk中定義好的,用戶可以直接使用 自定義變數:這種變數為用戶自己定義的變數,需要先定義後再使用。 內置變數 awk主要的內置變數如下所示: | 變數 | 解釋 |預設值| | ...
  • 一. ovs 從源碼編譯安裝: 安裝依賴項: 下載源碼包 生成配置文件 配置 編譯 啟動 測試 二. Ovs的卸載 啟動ovs之後,如果改動ovs源代碼並且想更新ovs服務,進行如下操作: 參考資料 "Open vSwitch on Linux, FreeBSD and NetBSD" 作者: "y ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...