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() 返回读取数据长度。

总结:写驱动时一定要注意各函数的传入参数与返回值。

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