(toppers-users 301) Re: Q:Win シミュレーションの割込機能

Takayuki WAKABAYASHI takayuki @ ertl.ics.tut.ac.jp
2001年 10月 24日 (水) 01:45:09 JST


豊橋技術科学大学の若林です.

以前、青木さんよりご報告を受けたWindowsデバイスエミュレーションの
外部割込み要求がうまく処理されないという問題が解決しましたので、
報告します。

---8<---
現象
  外部VisualBASICアプリケーションから、DeviceControl.RaiseInterrupt
  メソッドを実行すると、一般保護違反(またはリモートプロシジャコール
  エラー)が発生する.

原因
  デバイスエミュレータサービスを提供しているカーネル内のスレッドに
  対して予期しないメッセージ(DEV_READ = WM_USER)が送られており、
  該当スレッドが不正なパラメータのままデバイスリード処理を行って
  しまうことにより不正な読み込みバッファへのポインタがCOMに渡る
  ことで一般保護違反が発生している.
   #送られてきている原因は不明だが、COMのRPC処理の一部で
   #生成していると推察している.

対処
  ・DEV_READメッセージをWM_USERからWM_APP+0x10へ移動 (device_com.cpp:44)
       #define DEV_READ WM_USER -> #define DEV_READ (WM_APP+0x10)

  ・DEV_WRITEメッセージをWM_USER+1からWM_APP+0x11へ移動 (device_com.cpp:45)
       #define DEV_WRITE WM_USER+1 -> #define DEV_WRITE (WM_APP+0x11)

  ・デバイスエミュレータサービスを提供しているスレッドが
     DEV_READまたはDEV_WRITE以外のメッセージを受け取った場合、
     DispatchMessageを実行するように修正 (device_com.cpp:184)
       switchの最後に "default: DispatchMessage(&msg);"を追加

修正個所のdiff
44,45c44,45
< #define DEV_READ WM_USER
< #define DEV_WRITE WM_USER+1
---
> #define DEV_READ WM_APP+0x10
> #define DEV_WRITE WM_APP+0x11
183a183,184
>                       default:
>                               DispatchMessage(&msg);


動作確認
  Microsoft Windows 2000 Professional SP2
  Microsoft VisualStudio 6.0 SP6 + ProcessorPack
---8<---

スレッドのメッセージキューには、自分が投げたメッセージ以外、
どんなメッセージもこないと思っていたのは思い込みだったようです。
 #とはいえ、あのDispatchMessageでどこに飛んでいくのかまったく判らない...
DeviceManagerとJSPカーネルのプロセスの隙間で起っていたエラーだったので、
原因を追求するのに苦労しました。
何とかご期待には応えられたようで、ほっと一安心です。

青木さん、ご報告感謝します。

+----------------------------------------------+
| Takayuki WAKABAYASHI (わかばやし たかゆき)   |
|  mailto: takayuki @ ertl.ics.tut.ac.jp         |
+----------------------------------------------+
| 豊橋技術科学大学 工学研究科 電子情報工学専攻 |
|   組込みリアルタイムシステム研究室           |
+----------------------------------------------+