Windows Driver Model (WDM)







⊕ WDK 7.1 (Assembly)
  ∗ 開發環境
  ∗ DriverEntry()
  ∗ AddDevice()
  ∗ DriverUnload()
  ∗ Hello world!
  ⊕ File
    ∗ IRP
    ∗ DO_BUFFERED_IO
    ∗ DO_DIRECT_IO(PIO)
    ∗ DO_DIRECT_IO(DMA)
    ∗ DO_NEITHER_IO
  ⊕ IOCTL
    ∗ IRP
    ∗ METHOD_BUFFERED
    ∗ METHOD_IN_DIRECT
    ∗ METHOD_OUT_DIRECT
    ∗ METHOD_NEITHER
  ∗ Thread
  ⊕ Timer
    ∗ I/O
    ∗ DPC
  ∗ StartIO
  ∗ Queue IRP
  ∗ Cancel IRP
  ∗ Cancel-Safe IRP Queue(CSQ)
⊕ WDK 7.1 (C/C++)
  ∗ 開發環境
  ∗ DriverEntry()
  ∗ AddDevice()
  ∗ DriverUnload()
  ∗ Hello world!
  ⊕ File
    ∗ IRP
    ∗ DO_BUFFERED_IO
    ∗ DO_DIRECT_IO(PIO)
    ∗ DO_DIRECT_IO(DMA)
    ∗ DO_NEITHER_IO
  ⊕ IOCTL
    ∗ IRP
    ∗ METHOD_BUFFERED
    ∗ METHOD_IN_DIRECT
    ∗ METHOD_OUT_DIRECT
    ∗ METHOD_NEITHER
  ∗ Thread
  ⊕ Timer
    ∗ I/O
    ∗ DPC
  ∗ StartIO
  ∗ Queue IRP
  ∗ Cancel IRP
  ∗ Cancel-Safe IRP Queue(CSQ)
  ∗ Hook IDT
⊕ WDK 10 (C/C++)
  ∗ 開發環境
  ∗ Hello world!
WinDbg Symbol路徑
停止Win7數位簽章檢查
停止Win10數位簽章檢查
使用私人憑證加簽驅動程式
使用Verifier驗證驅動程式
如何移除已經簽章的驅動程式
關閉WinXP數位簽章警告視窗
解決DbgView輸出訊息的問題
解決DbgView的Dbgv.sys問題
ZwQueryValueKey()使用方式
__try __except在使用上的限制
Multi-core上的DISPATCH_LEVEL
ProbeForRead()、ProbeForWrite()
RtlQueryRegistryValues()使用方式
解決"INF does not contain digital ..."問題
解決"unresolved symbol _DriverEntry@8"問題
解決"unresolved symbol SDDL_DEVOBJ..."問題
為何ZwAllocateVirtualMemory無法配置超過0x80000000位址
如何在User Mode開啟"\Device\"下的驅動程式(非Symbolic Link)
Namespace("\\.\"、"\??\"、"\??\GLOBALROOT\"、"\\?\"、"\GLOBAL??\"、"\Device\"、"\DosDevices\")




Kernel Mode Driver Framework (KMDF)







⊕ WDK 7.1 (C/C++)
  ⊕ PNP
    ⊕ Basic
      ∗ 開發環境
      ∗ DriverEntry
      ∗ AddDevice
    ⊕ Advanced
      ∗ Hello, world!
  ⊕ Non-PNP
    ⊕ Basic
      ∗ DriverEntry
    ⊕ Advanced
      ∗ Hello, world!
⊕ WDK 7.1 (MASM32)
  ⊕ PNP
    ⊕ Basic
      ∗ 開發環境
    ⊕ Advanced
      ∗ Hello, world!
      ⊕ File Operation
        ∗ IRP
        ∗ WdfDeviceIoBuffered
        ∗ WdfDeviceIoDirect with PIO
        ∗ WdfDeviceIoDirect with DMA
        ∗ WdfDeviceIoNeither
      ⊕ IOCTL Operation
        ∗ IRP
        ∗ METHOD_BUFFERED
        ∗ METHOD_IN_DIRECT
        ∗ METHOD_OUT_DIRECT
        ∗ METHOD_NEITHER
      ∗ Thread
      ∗ Timer
        ∗ I/O
        ∗ DPC
      ∗ Timer(WdfTimerCreate)
      ∗ Queue IRP
      ∗ Cancel IRP
⊕ WDK 10 (C/C++)
  ⊕ PNP
    ⊕ Basic
      ∗ 開發環境
    ⊕ Advanced
      ∗ Hello, world!
  ⊕ Non-PNP
    ⊕ Advanced
      ∗ Hello, world!
WDFFunctions是如何產生的
為何沒有StartIO的相關處理方式
為何沒有IRP Pending的相關處理方式




Windows NT Driver (Legacy)







⊕ WDK 7.1 (C/C++)
  ⊕ Basic
    ∗ 開發環境
  ⊕ Advanced
    ∗ Hello, world!
⊕ WDK 7.1 (MASM32)
  ⊕ Basic
    ∗ 開發環境
  ⊕ Advanced
    ∗ Hello, world!
⊕ WDK 7.1 (Delphi)
  ⊕ Basic
    ∗ 開發環境
  ⊕ Advanced
    ∗ Hello, world!



Linux Device Driver (LDD)







⊕ C/C++
  ⊕ Basic
    ∗ 開發環境
  ⊕ Advanced
    ⊕ Char (Kernel 2.4)
      ∗ Hello, world!
      ∗ File Operation
      ∗ IOCTL
    ⊕ Char (Kernel 2.6)
      ∗ File Operation
    ⊕ Framebuffer
      ∗ register
      ∗ check var
⊕ Assembly (ARM CPU)
  ⊕ Basic
    ∗ 開發環境
  ⊕ Advanced
    ⊕ Char (Kernel 2.4)
      ∗ Hello, world!
      ∗ File Operation
      ∗ IOCTL
    ⊕ Char (Kernel 2.6)
      ∗ File Operation
打印高精度的時間
如何替換開機圖片
pr_xxx()和dev_xxx()的簡易區別
如何取得系統上的全部Export Symbols
如何知道SDL是否設定成SDL_DOUBLEBUF
SDL_Flip V.S. SDL_UpdateRect
SDL_SWSURFACE V.S. SDL_HWSURFACE
cdev_add()和register_chrdev()的差別
dma_mmap_coherent()和remap_pfn_range()的差別




MS-DOS Device Driver (MDD)







⊕ Assembly
  ⊕ Basic
    ∗ 開發環境
    ∗ 基本觀念
    ∗ I/O Request Packet(IRP)
  ⊕ Advanced
    ⊕ Char
      ⊕ Hello, world!
    ⊕ Block
      ∗ Hello, world!