質問

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

略してWM6を入力しますが、OSは違いを生む場合はWM6.1です。

私が抱えている問題は、ドライバーがWM6のデバイスの起動時にのみロードしないことです。ドライバーはCE5とWM6の両方で開発されましたが、CE5ではドライバーはブートで「実行」しているため、WM6構成の問題を指しています。この時点で、ドライバーはActivatedEvice()メソッドを使用してWM6とCE5にロードすることに注意する価値があります。これは、ドライバーを起動するための小さなテストアプリであるWM6にこれまで使用してきたものです。 WM6で作業しています。

レジストリには、ドライバーのスタートアップに必要なキーがすでに入力されています。したがって、ドライバーは問題なく起動時にロードする必要があります。 hkey_local_machine drivers biltininには、サブキーa36d_gps_comが含まれており、そのキーが含まれています。

DeviceArrayIndex:0

DeviceType:0

dll:a36d.dll

フラグ:0

フレンドリー名:A36D GPS COMポート

インデックス:8

注文:3

プレフィックス:com

優先度:0

優先度:256

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

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

2)CE5とWM6の別の可能な問題と違いはセキュリティです。したがって、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 SECURTY SystemCertificates」にキーを追加します。これが機能していることを知ってください。注意の問題として、私はそれを特権的で、特権のない、ルート、およびSPC証明書ストアにインストールしました。ただし、デバイスドライバーは、モバイルデバイスが起動している場合でもdevice.exeにロードしません。

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

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

誰かが試してみることができるさらなる提案を持っていますか?

すべての助けが高く評価されています。

役に立ちましたか?

解決

私はWindows CEに精通していますが、ここにいくつかのことがあります:

  • Dllmain関数にデバッグプリントを追加して、それが呼ばれているかどうかを確認しましたか?
  • 依存の休憩をチェックしましたか。 WM6の下にないCE 5の下で利用可能なDLLをどうにかしているのでしょうか?

他のヒント

これは答えですが、「正しい」ものではありません。それは単なる積み込みの問題をめぐる仕事です。私はこれを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でアクティブになります。

署名/レジストリの問題については、これはまだ検討されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top