1

私たちの組み込みシステムプログラマーは、モバイルハードウェア用の仮想シリアルポートドライバーのシェルを開発しました。私はそれを機能させるための方法を入力してきました。ドライバーは期待どおりに機能し、NMEA文字列(GPSデータ)を吐き出すUSBデバイスのCOMポートをシミュレートします。

略してWM6と入力しますが、違いがあればOSはWM6.1です。

私が抱えている問題は、WM6でのみデバイスの起動時にドライバーがロードされないことです。ドライバーはCE5とWM6の両方用に開発されましたが、CE5では、ドライバーは起動時に「ロード」されます。これは、WM6構成の問題を示しています。この時点で、ActivateDevice()メソッドを使用してドライバーがWM6とCE5に読み込まれることに注意してください。これは、少なくともドライバーをテストできるように、ドライバーを起動するための小さなテストアプリであるWM6にこれまで使用してきたものです。 WM6に取り組んでいます。

レジストリには、ドライバの起動に必要なキーがすでに入力されています。したがって、ドライバは起動時に問題なくロードされるはずです。HKEY_LOCAL_MACHINE \ Drivers \ BuiltInにはサブキーA36D_GPS_COMが含まれており、そのキーには含まれています。

DeviceArrayIndex:0

DeviceType:0

Dll:A36D.dll

フラグ:0

わかりやすい名前:A36DGPSCOMポート

インデックス:8

注文:3

プレフィックス:COM

優先度:0

優先度:256

私が言えることから、私がすでに調査したこの問題に対する一般的な2つの一般的な答えがあります。これらのアイデアは組み込みプログラマーによって私に与えられましたが、私はそれらを自分で行う方法を研究しました。

1)デバイスがロードされるとCOMポートが最終的に解放された場合でも、ドライバーがロードしようとしたときにCOMポートはすでに使用されています。レジストリのインデックス値を1から20に変更し、デバイスを再起動しましたが、ドライバーが指定されたCOMポートにロードされません。したがって、これをより徹底的にテストするために、別のデバイスをCOM9からCOM8に移動し、ドライバーをCOM9に移動しました(上記のレジストリ設定を使用)。他のデバイスドライバーはCOM8で起動時に非常にうまくロードされますが、私のデバイスドライバーはCOM9で起動しません。他の設定を微調整しようとしましたが、それでも起動時にロードされません。

2)CE5とWM6のもう1つの考えられる問題と違いは、セキュリティです。したがって、MSDNの記事http://msdn.microsoft.com/en-us/library/bb737570.aspxを使用します。私は署名とXMLプロビジョニングに取り組んできました。特権キー(有効期限が切れていない)を使用して、A36D.dllはVisual Studioで署名され、作成されたインストールCABファイルも同じキーで署名されます。_setup.xmlファイルが作成され、cabファイルに追加されるため、署名されたキーが証明書ストアに追加されます。CABファイルは、それがまだ有効であることを確認するために、同じキーで再度署名されます。さらに、_setup.xmlは独自の.CPFファイルにパッケージ化されています。CABファイルとCPFファイルはどちらも、証明書ストア「HKEY_LOCAL_MACHINE \ Comm \ Security \ SystemCertificates」にキーを追加するので、これが機能していることを確認してください。注意の問題として、私はそれを特権、非特権、ROOTおよびSPC証明書ストアにインストールしました。ただし、モバイルデバイスの起動時にデバイスドライバーがdevice.exeに読み込まれません。

ドライバーでActivateDevice()を呼び出すスタートアップアプリケーションの回避策以外に、スタートアップ時にこのドライバーをロードする方法に困惑しています。

CE5では機能しますがWM6では機能しないのは非常に奇妙だと思います。問題を引き起こしている可能性のあるものは他にありません。

誰かが試すことができるさらなる提案がありますか?

すべての助けに感謝します。

4

2 に答える 2

1

私は Windows CE に慣れていますが、いくつかのことを次に示します。

  • DllMain 関数にデバッグ プリントを追加して、それが呼び出されるかどうかを確認しましたか?
  • 依存関係の中断を確認しましたか。CE 5 では WM6 にはない Dll が利用可能である可能性がありますか?
于 2010-08-29T04:41:12.680 に答える
0

これは答えですが、「正しい」ものではありません。これは単に読み込みの問題を回避するためのものです。私はこれを1週間以上前に理解しましたが、解決策として使用したくありませんでした. したがって、これは一時的な修正に過ぎないことを願っています。

次のコードは、ドライバーを手動でロードするために使用されます。C++ 呼び出しを使用して C# で記述されています。私は C# に慣れているため、C++ プロジェクトではなく C# プロジェクトを作成しました。C++ を使用するユーザーは、間違いなくこれを C++ アプリで作成します。

public class LoadDriver
{
    [DllImport("coredll.dll", SetLastError = true)]
    public extern static IntPtr ActivateDevice(string lpszDevKey, int dwClientInfo);
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern void SignalStarted( uint dw);

    public static void Main(string[] args)
    {
        Cursor.Current = Cursors.Default;
        IntPtr handle = ActivateDevice("Drivers\\BuiltIn\\A36D_GPS_COM", 0);
        if(handle != IntPtr.Zero)
        {
            Console.Write("Success");
        }

        if (args.Length > 0)
        {
            try
            {
                SignalStarted(uint.Parse(args[0]));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

これを機能させるには、起動時に実行する必要があるため、必要なレジストリ キーを追加しました。

"HKEY_LOCAL_MACHINE/init"
Launch62 = A36D_loaddriver.exe
Depend62 = "32 00"

「32 00」は、shell32.exe の後に読み込まれるようにするためのものです。

これでデバイスが起動し、device.exe でドライバが有効化されます。

署名/レジストリの問題に関しては、これはまだ調査中です。

于 2010-09-01T15:32:15.233 に答える