驅動編寫技巧說明

1。在編寫驅動程序的主要頭文件中會有:

#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")

#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")


它定義了分頁內存、非分頁內存和INIT段內存的標誌,以便在後面的程序中聲明

例如,

#pragma PAGEDCODE
NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp)
{
	PAGED_CODE();

	KdPrint(("Enter。。。。。。。。。。。。。。。。

#pragma PAGEDCODE 表示將此函數放在INIT段中,當驅動加載結束後,此函數就可以從內存中卸載掉。

(在此函數編寫結束後,要在其後的後續函數的前面,加入PAGEDCODE等其它的標誌)

2.在驅動程序中,應該儘量避免全局變量的使用,因爲全局變量涉及不容易同步的問題。解決方法就是將全局變量存在設備擴展裏面。

3. 在adddevice函數的最後,需要設置fdo的flags子域。

	fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
	fdo->Flags &= ~DO_DEVICE_INITIALIZING

DO_BUFFERED_IO定義設備爲“緩衝內存設備”,
~DO_DEVICE_INITIALIZING是將Flag上的DO_DEVICE_INITIALIZING位清零,保證設備初始化完畢,這一步是必需的

4. RtlCopyMemory可以複製內存,但其內部沒有考慮內存重疊的情況。

    RtlMoveMemory考慮了內存重疊,但犧牲了效率。

5. 注意_try和_finally或_try和_except的使用,

注意assert宏的使用

6.對於等於或高於DSPATCH_LEVEL級別的程序不能使用分頁內存,必需使用費分頁內存。驅動程序的StartIO例程、DPC例程、中斷服務例程都運行在DISPATCH_LEVEL或者更高的IRQL上。因此,在這些例程中不能使用分頁內存,否則會導致系統崩潰。

7. 自旋鎖不同於線程中的等待事件。它會浪費過多的cpu執行時間。所以對自旋鎖佔用時間不宜過長

8. StartIO是執行在DISPATCH_LEVEL級別上的,因此在聲明時要加上#pragma LOCKDCODE修飾符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章