WINCE 中句柄傳送出現的錯誤

我曾因爲一時大意,碰到了一個這樣的問題,今天突然想到剛好可拿出來說說.
問題現象:系統在進入睡眠時,驅動彈出一個異常.
問題分析:經過我分析發現,異常是其中一個驅動在調用(IOCTL_POWER_SET)時產生的.因爲這個驅動是新的,我開始懷疑IOCTL_POWER_SET裏面調用的函數有問題,於是我將裏面的函數注掉了,但異常照常產生.於是我又懷疑傳入的參數有誤,將參數也打出來,發現傳入的電源的狀態也是有效的,這時我就覺得奇怪了,開始逐句的分析我的IOControl()函數的代碼,最後我發現有幾個地方用到了IOControl()傳入的設備上下文句柄,會不會是因爲傳入的參數有問題呢?於是我將這個句柄輸出看了一下,我驚訝的發現它竟然是1.這個句柄是應用在調用驅動 Open()時返回的,再在應用調用IOControl()時傳進來的。於是我追溯源頭,發現我的Open()函數裏竟然返回了一個TRUE,這是因爲我拷貝代碼時忘了改這個地方造成的,想一想真是暈。

問題結論:由於IOControl()傳入的值是一個非法指針,從而造成了驅動異常。

順便說一下流接口各函數的返回句柄與用途。
1.Init():返回設備上下文句柄,主要爲Deinit() Open() powerUp() PowerDown()函數提供設備信息。
2.Open():返回設備上下文句柄,主要爲IoControl() Close() Read() Write() Seek()函數提供設備信息。
3.DeInit() Close() IoControl() 返回BOOL,表示操作是否成功。
4.Read() Write() 返回讀取數據長度。

總結:寫驅動時一定要注意各函數的傳入參數與返回值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章