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修飾符