如何在INF中執行程式

出自GaryLee
跳轉到: 導覽, 搜尋

Description

凡寫過INF檔案的人,大概都免不了要抱怨一下INF真是個難用的東西,比較複雜的安裝步驟,幾乎很難用INF來達成。本文要提供一個trick來解決這個問題。

Text

首先,本文的INF主要是用於驅動程式的安裝上面。其他的應用程式的安裝,我並沒有實際試過,所以不曉得是否合用。不過,如果是一般應用程式的安裝,本人建議就別用INF安裝了。可以選擇InstallShield, WISE或是Mircosoft自家的Install工具。目前網路上已有一些免費而且好用的Install工具,像是:

  • InnoSetup
  • NSIS

不過,如果您在撰寫驅動程式的話,可就免不了要與INF打交道。不過說實在的,INF還真是一個難用的東西。稍微複雜一點的安裝,想透過INF還真的是不行。當然,INF也有提供所謂的Co-installation的功能,不過要寫一個Co-installation,並不如想像中的容易。為什麼INF 不能提供一個執行其他命令的功能呢?這樣我們就可以自己寫一個輔助安裝的小程式,然後透過INF呼叫它來幫我們進行一些比較複雜的安裝。

有一天我在寫INF的時候,突然發現一件很神奇的事情,就是原本只是一個寫registry的動作,居然可以用來執行程式。這可真令我驚訝不已。剛開始還以為是哪裡弄錯了,經過反覆測試後,我終於確定這是一個undocument的trick。於是我特別撰寫本文將這個trick分享給同樣被INF給殘害的苦命programmer。

寫INF的人應該都知道AddReg這個指令可以用來新增registry。比較有在玩registry的人應該也知道下面這個registry key可以讓系統在開機的時候執行指定的程式一次。並且執行完後,就自動刪除這個registry。如此,下次在開機就不會再執行了。

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce

可是,我想許多人大概不知道,設定RunOnce在INF並不會等到重開機後才執行。而是會在處理INF的過程中被執行。這是根據MSDN上面的文章所得知的。因此,我們就可以透過新增這個RunOnce的Registry的方式來執行我們要的程式。

不過,根據MSDN上面的文章,在INF中使用RunOnce時,只能使用rundll32.exe這個程式。如果,您使用了其他的程式,其實也是可以執行的。不過,問題在於您要去過WHQL認證時,就過不去了。不過,反正rundll32.exe也是用來執行某個dll的。所以我們還是可以寫一個簡單的 DLL作為wrapper來執行自己想要的程式。

個人工具