0

ストリーム デバイス ドライバーを WinCE 5 から WinCE 6 に移行しようとしましたが、CreateFile() でインターフェイスを開くときに問題が発生しました。しかし、最初から:

次のレジストリ情報を Platform.reg に追加しました。

[HKEY_LOCAL_MACHINE\Drivers\MyDriver\DRV]
"Index"=dword:1
"DLL"="MyDriver.DLL"
"Prefix"="DRV"

Platform.bib には、次のようにドライバーを含めました。

MyDriver.dll      $(_FLATRELEASEDIR)\MyDriver.dll                   NK  SHK

ドライバーは OS デザインの dirs ファイルに追加され、Visual Studio ソリューションでドライバーを正常にビルドできます。

私のアプリケーションでは、ActivateDeviceEx によってドライバーを手動でロードします。

#define DRIVERSHELL_REG_KEY (TEXT("Drivers\\MyDriver\\DRV"))    

hDriverShell = ActivateDeviceEx( DRIVERSHELL_REG_KEY,
                            NULL,
                            0,
                            NULL
                            );

ここでの結果は0でもINVALID_HANDLE_VALUEでもないので、ドライバは正常にロードされていると思います。

CreateFile() でドライバーを開こうとすると:

hDS = CreateFile(TEXT("DRV1:")
        ,   GENERIC_READ|GENERIC_WRITE
        ,   FILE_SHARE_READ | FILE_SHARE_WRITE
        ,   NULL
        ,   OPEN_EXISTING
        ,   FILE_ATTRIBUTE_NORMAL
        ,   0);

GetLastError は 1359 を返します。エラーには次のように記載されています。

1359 ERROR_INTERNAL_ERROR (説明: セキュリティ アカウント データベースに内部矛盾があります)

前述のように、ドライバーは動作中の WinCE 5 イメージから移行されます。すべてのストリーム インターフェイス関数は、ドライバーのソース コードで宣言されます (xxx_init()、xxx_open()...)。このエラーの原因や、詳しく調べる必要がある詳細を知っている人はいますか?

編集:回答ありがとうございます!イメージと実装されたドライバーのデバッグに成功しました。「ActivateDeviceEx()」は「XXX_Init()」を呼び出し、「CreateFile()」は「XXX_Open()」を呼び出します。各ドライバー関数にブレークポイントを設定し、それに到達しました。ここまでは順調ですね。デバイス (ジョイスティック、ドライバーは HID ジョイスティック ドライバー) を接続したときに関数 "HIDDeviceAttach()" が呼び出されないという問題を特定しました。次に、一部のハンドルが 0 になり、XXX_Open() が内部エラーを LastError として設定します。OS はどのデバイスが USB バスに接続されているか、どの HIDDeviceAttach() 関数を呼び出す必要があるか (マウス/キーボード/ジョイスティック) をどのように認識しますか? [ところで: これに関して新しい質問をしましょうか?]

4

2 に答える 2

0

マーティン、ドライバーの詳細をここ [HKEY_LOCAL_MACHINE\Drivers\MyDriver\DRV] に追加し、提供しているコードに追加しました

#define DRIVERSHELL_REG_KEY (TEXT("Drivers\\Drivers\\MyDriver\\DRV"))

2つの「ドライバー」はスペルミスである可能性があります.bcozは、ActivateDeviceExエラーを返していないと述べました。これを確認したい場合は、最初のパラメーター、つまり ' LPCTSTR pContext' を印刷できますDRV_Init()。これにより、ドライバーがアクティブなキー (Drivers\Active\66 など) にあるレジストリの場所が得られます。

通常CreateFile()は 7 つの引数を取りますが、あなたは 6 つしか挙げていません。

于 2013-11-12T12:02:35.687 に答える
0

デバッグ OS を使用して、XXX_Init および XXX_Open エントリ ポイントにブレークポイントを配置して、ドライバー コードの何が問題なのかを確認できますか? 接続に KITL を使用できない場合でも、ドライバのデバッグ バージョンをビルドできます (残りの OS をリリースのままにしたい場合は、ソース ファイルで COMPILE_DEBUG ディレクティブを使用できます)。デバッグ シリアル ポートに送信されます。

于 2013-11-12T22:17:11.447 に答える