C 實現預裝驅動功能

2021-07-31 12:02:44 字數 1775 閱讀 4749

工作中遇到的乙個需求:需要在專案中打包乙個硬體裝置的驅動安裝程式,提供了驅動安裝包檔案。

wdk中 函式driverpackageinstall就是實現這個功能的!  

setupcopyoeminf這個函式很好,可以預裝驅動,也就是在裝置插入之前執行這個函式。那麼當裝置插入電腦的時候,系統就可以自動安裝驅動。

bool winapi setupcopyoeminf(

pctstr sourceinffilename,

pctstr oemsourcemedialocation,

dword oemsourcemediatype,

dword copystyle,

ptstr destinationinffilename,

dword destinationinffilenamesize,

pdword requiredsize,

ptstr destinationinffilenamecomponent

);

sourceinffilename,就是驅動inf的全路徑。 

oemsourcemedialocation,這個也是路徑,但是其具體含義有後面的引數來制定(windows的引數很多就是這樣。連個引數。乙個是型別,乙個是內容。內容又型別來決定)。 

oemsourcemediatype。spost_none:忽略oemsourcemedialocation的內容。spost_path:代表oemsourcemedialocation為真正驅動檔案的位址,一般為驅動檔案sys的位址。(如果你的sys檔案跟inf在乙個地方,那麼oemsourcemedialocation可以為null),spost_url,這個代表oemsourcemedialocation為乙個**,即驅動在internet上。 

copystyle:這個很重要,但是一般我們用到的就sp_copy_replaceonly,替換,一般是公升級時用。sp_copy_nooverwrite,系統是否已經預存了inf檔案。sp_copy_newer_or_same,inf檔案比系統的inf新或者一樣時進行更新。 

destinationinffilename,一般inf檔案系統為例保證不衝突,會進行改名字,所以,這個是系統最終的inf的名字,也就是系統改完名字後,的inf的名字一般為oemxx.inf。 

destinationinffilenamesize,destinationinffilename這個檔案的大小。 

requiredsize,輸出。 

destinationinffilenamecomponent,輸出。 

setupcopyoeminf(inffilename, null,spost_path, sp_copy_newer_or_same,null, 0, null,null); 

乙個inffilename的路徑,copy就用sp_copy_newer_or_same。 

在傳遞引數copystyle時,用的sp_copy_nooverwrite,考慮到如果有驅動那麼就不去copy了,本來是好心,但是發現在vista上出現了問題。 因為,我在解除安裝驅動時,是在裝置管理裡面解除安裝驅動,同時選擇上了。如下圖中的刪除此裝置的驅動程式軟體。 這樣一來導致系統把驅動的相關sys檔案刪掉了。但是inf沒有刪掉,還是存在的。 所以下一次安裝時,setupcopyoeminf返回false。也就是不拷貝inf,因為已經有了inf。所以導致驅動無法安裝上。 現在我把這個引數copystyle改為sp_copy_newer_or_same,就可以,因為這個函式是會拷貝inf的,就算系統已經有了inf。

完整的vs工程原始碼請參考:

c 實現ftp功能

背景 作為我的工作的一部分,我已經使用了ftp模組,但是我只能在.net 1.1中去使用它,所以我不能深入的研究.net 2.0下ftp的實現。但是我相信,ne 2.0下對ftp的支援是非常好的。不要忘記引入命名空間 using system.net using system.io 下面的幾個步驟包...

c 實現ping功能

思路 首先新增乙個文字框,用來接收ip位址。用ipaddress myip ipaddress.parse textbox1.text.tostring 把文字框內容變成ip位址,寫到乙個異常中,就可以省略掉判斷ip位址是否正確了。定義乙個ping的方法 system.net.networkinfo...

C 實現列印功能

實際開發過程中經常會遇到列印某種報表的情況,用c 實現列印報表的功能。第一,如果報表的大小合適,或者紙張的大小足夠放得下報表,則可以選擇直接截圖,列印截圖所得的 第二,如果報表和紙張的大小不匹配,則可能需要在程式中根據一定格式拼出合適大小的報表。private void button3 click ...