windows驅動面試 基礎
1、CreateFile從r3到r0所呼叫的函式
CreateFile->ZwCreateFile->NtCreateFile->IoCreateFile->IRP_MJ_CREATE
2、自旋鎖和訊號量在互斥使用時注意哪些?
使用自旋鎖的程序不能睡眠,使用訊號量的程序可以睡眠。中斷服務例程中的互斥使用的是自旋鎖
3、minifilter與sfilter的區別
解決了重入問題
實現了使用者態與核心態雙向通訊,打破了傳統的CDO,共享記憶體的方式
載入順序更容易控制、冗餘程式碼更少、相容性更好
minifilter
流上下文:檔案控制塊(PCB),一一對應
流控制代碼上下文:檔案物件(FO),一對多
除錯
常用命令 https://bbs.pediy.com/thread-178808-2.htm
_asm INT 3; 軟體斷點
bp 條件斷點
!process [PID] 0,檢視程序資訊
!analyze -v 自動分析當前出錯的原因
g 卡住就按
dt DriverObject 檢視某個引數的當前值
!dt nt!_* 檢視當前核心資料結構
!irql 檢視CPU 的IRQL,中斷級別
.sympath 看當前符號路徑
.cls清屏
lm 當前系統載入的模組和驅動
dv 檢視當前引數值
kb 顯示堆疊和前三個引數
kp 顯示堆疊和引數的完整列表
kn 允許你檢視堆疊及其旁邊的框架資訊
RTLMoveMemory、RTLCopyMemory 區別
一個會記憶體重疊,一個不會
程序空間32位的為4GB
分為兩部分:低2GB,使用者空間(程序獨立使用)
高2GB,系統空間(共用)
UNICODE_STRING str= RTL_CONSTANT_STRING(L"hello");//字串賦初值
核心模組並不生成一個程序,只是填寫一組回撥函式讓windows來呼叫
裝置物件是唯一可接收請求的實體,任何一個IRP都是傳送給某個裝置物件的
驅動物件可以生成多個裝置物件
#define PAGEDCODE code_seg(“PAGE”);//分頁記憶體 #define LOCKEDCODE code_seg();//非分頁的 #define INITCODE code_seg(“INIT”);
#pragma alloc_text(INIT , DriverEntry);
#pragma alloc_text(PAGE, Other);
INIT 初始化完畢後就被釋放
PAGE 可以進行分頁交換的記憶體空間,交換到檔案中
預設為 PAGELK 載入後位於不可分頁交換的記憶體空間中
NonPagedPool不分頁的記憶體是永遠存在的
DISPATCH_LEVEL及以上 必須用非分頁記憶體
//列印
UNICODE_STREING u;
PUNICODE_STRING pu;
ANSI_STRING A;
kdPrint("%wZ \n",&u);
kdPrint("%ws / %S \n",pu->Buffer);
kdPrint("%Z \n",A);
呼叫函式時先將引數入棧,再將函式的返回地址入棧
APC 非同步過程呼叫
SSDT 系統服務描述表
DPC 延遲過程呼叫
MDL 記憶體服務描述表
NT 新技術
PE 可移植執行體
VPB 卷引數體
為什麼windbg看不到微軟的驅動
自己的驅動載入的PDB是private PDB,微軟的是public PDB,你可以在VS的PDB生成選項裡指定是否去除私有資訊。區別是 private PDB是完整的包含了程式碼資訊的PDB,比如說區域性變數,全域性變數,等等,幾乎等同於原始碼。而public PDB一般只包含函式名稱和全域性變數