1. 程式人生 > >windows驅動面試 基礎

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一般只包含函式名稱和全域性變數