PPP over USB通信について

お世話になります。
PPP over USB通信について質問させてください。
まず、背景と構成を説明させて頂きます。

[背景]

PC(WindowsXP SP3以降)とデバイスをUSBで接続し、HTTPベースの通信を実現したい。

[構成]

上記を実現するために下記のような構成を構築しPPP接続をすることで実現しました。
デバイス ―(USBケーブル)― USBドライバ ― モデムドライバ ― 電話帳エントリ
デバイス:

  • CDC-ACMに対応。
  • デバイス内部構成:USBドライバ - シリアルドライバ - pppd

USBドライバ:

  • Windows標準ドライバ(usbser.sys、serenum.sys)を使用。
  • 仮想COMポート(シリアル化)を実現。
  • Portsクラス。

モデムドライバ:

  • Windows標準ドライバ(modem.sys、RootMdm.sys)を使用。
  • 下記の電話帳エントリを作成すると自動で登録される。
  • 「2台のコンピュータ間の通信ケーブル」と表示されます。

電話帳エントリ :

  • 直接接続(ダイアルアップ接続ではない)。
  • [ネットワーク接続]-[新しい接続を作成する]より作成可能。
<電話帳エントリ作成手順>

  1. [詳細接続をセットアップする]を選択
  2. [ほかのコンピュータに直接接続する]を選択
  3. [ゲスト]を選択
  4. [コンピュータ名]に任意の文字列を入力
  5. [デバイスを選択してください]に対象のUSB仮想COMポートを選択

※上記の構成でPPP接続するためには、電話帳エントリをダブルクリックするとデバイスと通信が可能となる。

[課題(問題)]

デバイスとPPP接続中に、USBケーブルを抜いてもPPP接続が切断されない。
  • デバイスマネージャー上からUSBデバイスは削除されている。
  • [ネットワーク接続]で電話帳エントリは「接続」のまま。
  • [ネットワーク接続]で電話帳エントリを右クリックし、切断を選択すればPPP接続を切ることは可能。
  • デバイスの電源断でも同じ現象が発生。

この問題を解決するには、どうすればいいでしょうか?

上記の補足です。 現

上記の補足です。
現在までに試みた解決方法です。

[USBドライバ]

DDKにserenum.sysのサンプルがあるので、独自にフィルタドライバを作成。
usbser.sysの上位フィルタドライバとして登録。
下記の2点を試みました。

  1. IRP_MN_SURPRISE_REMOVALを検知しときに、IRP_MN_REMOVE_DEVICEの処理を実行。
    ⇒ PPP接続が切れること確認。しかし、PPPが切断されるまでに6秒程度時間がかかる。
  2. PPP接続中、IOCTL_SERIAL_WAIT_ON_MASK の要求が出続けている。
    このことから、WaitCommEvent関数をポーリングしていると推測できる。
    IRP_MN_SURPRISE_REMOVALを検知したときに、IOCTL_SERIAL_WAIT_ON_MASKの処理内で何らかのイベント発生させることはできないか?
    (現在、調査中ですが、イベントの発生方法などがわからない状態です。いい方法があれば教えてください)

[モデムドライバ設定]

  1. デバイスマネージャから[モデム]-[2台のコンピュータ間の通信ケーブル]を選択してプロパティダイアログを開き、
    [詳細設定]タブの[追加の初期化コマンド]に下記のATコマンドを入力。

    • &D2
    • &D3
    • &K0
    • &K3
    • &K4
    • &S1

    上記のATコマンドを入力したが、現象に変わりなし。

  2. モデムドライバプロパティ画面の[詳細]タブを開き[機能]を選択すると、現れるCM_DEVCAP_REMOVE と CM_DEVCAP_SURPRISEREMOVALOK について調査。
    ⇒この属性は、ドライバインストール時に自動で割り当てられる模様。また、PnPデバイスでない場合は、この属性は設定できない模様。
    ⇒この属性を設定できるようにするためには、USBをモデムクラスとして登録しなければならない。その場合、電話帳エントリを作成すると、「直接接続」では作成できず、「ダイアルアップ接続」としてのみ作成可能となる。「ダイアルアップ接続」とした場合、デバイス側でATコマンドの対応が必要となる。

[電話帳エントリ設定]

ハードウェアフロー制御のON/OFFを実施したが、現象に変わりなし。

micと申します。 Windows

micと申します。
Windowsドライバの業務から離れて数年経ち浦島太郎状態ですが、このたび職場で支援のためWindowsドライバの業務に呼び戻され、このフォーラムを拝見させていただいておりました。
以前作ったドライバに仕様が似ており、コメントいたします。

そのドライバはモデムと、シリアルの口を持っていました。

nishiさんの場合、「モデム」でつなぐことが必須なのでしょうか?
単にUSB<->Serial変換をするドライバがCOMポートを提供し、上位アプリケーション層に任せれば良いだけのような気がいたします。

ごめんなさい。この業界リハビリ中ですして、あまり的確なコメントができません。

--
Michio Nakamura