Friday, June 26, 2009

WDM Driver

WDM程式編譯出來的並不是我們常見的.exe,而是.sys檔案,在未經設定編譯環境之前,是不能直接用VC來編譯的.其實驅動程式也是一種PE檔案,它同樣由DOS MZ header開頭,也有完整的DOS stub和PE header,同樣擁有Import table和Export table.

我們可以使用tdump.exe來分析.sys檔案.首先使用Delphi裡附帶的tdump.exe程式,然後鍵入︰C:\WINNT\System32\Drivers>tdump ccport.sys -em -ee
參數-em是列出Import table,-ee是列出Export table。返回之後,螢幕列出一大堆東西︰

C:\WINNT\SYSTEM32\DRIVERS>tdump ccport.sys -em -ee
Turbo Dump Version 5.0.16.12 Copyright ? 1988, 2000 Inprise Corporation
Display of File CCPORT.SYS

IMPORT: NTOSKRNL.EXE={hint:011Fh}.’memcpy’
IMPORT: NTOSKRNL.EXE={hint:003Dh}.’IoDeleteDevice’
IMPORT: NTOSKRNL.EXE={hint:0030h}.’IoAttachDeviceToDeviceStack’
IMPORT: NTOSKRNL.EXE={hint:008Eh}.’KeSetEvent’
IMPORT: NTOSKRNL.EXE={hint:0068h}.’IofCallDriver’
IMPORT: NTOSKRNL.EXE={hint:0095h}.’KeWaitForSingleObject’
IMPORT: NTOSKRNL.EXE={hint:0074h}.’KeInitializeEvent’
IMPORT: NTOSKRNL.EXE={hint:003Fh}.’IoDetachDevice’
IMPORT: NTOSKRNL.EXE={hint:00D3h}.’RtlFreeUnicodeString’
IMPORT: NTOSKRNL.EXE={hint:0077h}.’KeInitializeSpinLock’
IMPORT: NTOSKRNL.EXE={hint:0129h}.’strcpy’
IMPORT: NTOSKRNL.EXE={hint:0121h}.’memset’
IMPORT: NTOSKRNL.EXE={hint:003Ch}.’IoCreateUnprotectedSymbolicLink’
IMPORT: NTOSKRNL.EXE={hint:0038h}.’IoCreateDevice’
IMPORT: NTOSKRNL.EXE={hint:00C2h}.’RtlAnsiStringToUnicodeString’
IMPORT: NTOSKRNL.EXE={hint:0069h}.’IofCompleteRequest’
IMPORT: NTOSKRNL.EXE={hint:0124h}.’sprintf’
IMPORT: NTOSKRNL.EXE={hint:003Eh}.’IoDeleteSymbolicLink’
IMPORT: NTOSKRNL.EXE={hint:0042h}.’IoFreeIrp’
IMPORT: NTOSKRNL.EXE={hint:004Dh}.’IoInitializeIrp’
IMPORT: NTOSKRNL.EXE={hint:002Dh}.’IoAllocateIrp’
IMPORT: NTOSKRNL.EXE={hint:0027h}.’InterlockedExchange’
IMPORT: NTOSKRNL.EXE={hint:0025h}.’InterlockedCompareExchange’
IMPORT: NTOSKRNL.EXE={hint:0035h}.’IoCancelIrp’
IMPORT: NTOSKRNL.EXE={hint:012Ah}.’strlen’
IMPORT: NTOSKRNL.EXE={hint:0126h}.’strcat’
IMPORT: NTOSKRNL.EXE={hint:0114h}.’atoi’
IMPORT: NTOSKRNL.EXE={hint:0128h}.’strcmp’
IMPORT: NTOSKRNL.EXE={hint:0034h}.’IoBuildSynchronousFsdRequest’
IMPORT: NTOSKRNL.EXE={hint:00D5h}.’RtlInitAnsiString’
IMPORT: HAL.DLL={hint:0006h}.’KfAcquireSpinLock’
IMPORT: HAL.DLL={hint:0009h}.’KfReleaseSpinLock’

EXPORT ord:0001=’Vcomm_DriverControl’

我們可以很清楚地看到,它主要是用了NTOSKRNL.EXE和HAL.DLL檔案(幾乎所有的WDM驅動程式都會使用NTOSKRNL.EXE檔案),並且輸出了一個函數“Vcomm_DriverControl”。

這說明.sys跟.exe檔案都是一種PE檔案,不同的是.sys檔案Import的通常是NTOSKRNL.EXE,而.exe檔案Import的通常是KERNEL32.DLL和USER32.DLL。

因為.sys通常不使用KERNEL32.DLL和USER32.DLL,所以是不能在設備驅動程式裡面使用任何C、C++和Win32函數,而且也不能使用C++關鍵字new和delete等(不過可以用malloc和free來代替),而必須使用大量的內核函數。

下面是列出一些常見的驅動程式可用的內核函數︰
Ex… 執行支援
Hal… 硬體抽象層(僅NT/Windows 2000)
Io… I/O管理器(包括即插即用函數)
Ke… 內核
Ks… 內核流IRP管理函數
Mm… 內存管理器
Ob… 對象管理器
Po… 電源管理
Ps… 進程架構
Rtl… 營運時庫
Se… 安全引用監視
Zw… 其他函數

Saturday, June 13, 2009

心煩

公司的事情讓我有點心煩,可是當我想起毛毛的承諾的時候.一切就沒有煩惱了,我要守候我答應毛毛的承諾.所以我要努力衝衝衝.謝謝你,毛毛.謝謝你,毛毛.因為這樣.讓我大聲的說我愛你.

Saturday, June 6, 2009

疲倦

昨天一場激戰,好累好累真的好累.原本OK的, 結果我修正了, 另外一不部分有異狀. 本想說請他改到其他Solution下去跑, 結果馬上有其他聲音出現. 最後是兩個都不行 ........

到底是要修到好還是要出版本出去比較重要 ?再加上最近事情特別多, 6/20 又有新的東西要出來, 宣布時間點又剛好是定飯店時間的之前 (應該是我第一次問和最後確定有的中間點), 兩者的交叉趕工, 讓我工作好累好累. 下班之後很擔心毛毛最近怎麼了, 還有一些 Work List要做完. 也很想和毛毛見面 .......

今天可以放我一天假嗎 ? 不想做任何事情, 只想做我想做的事情. 我疲倦了.

希望你可以明白, 昨天已經沒有力氣告訴你了. 直到今天早上五點多又醒了, 因為工作還沒Final, 擔心會Delay到六月中和毛毛的旅行. 七點我又倒下去了, 直到剛剛醒來沖個澡之後才稍微有精神一點.

前陣子我胸口有一種差點喘不口氣的感覺, 大概是我太疲倦了吧.