問題タブ [setupapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
293 参照

c++ - SP_DEVICE_INTERFACE_DETAIL_DATAのmemallocを使用したデバッグアサートに苦労しています

テストプログラムが終了するときに、いくつかのデバッグアサートに苦労しています。目的は、セットアップAPIを使用してディスクドライブへのデバイスパスを取得することです。これをやっています。ここで説明するSetupDiGetDeviceInterfaceDetailのルールに従います。つまり、SetupDiGetDeviceInterfaceDetail()を呼び出して構造に必要なサイズを決定し、構造にメモリを割り当てて、SetupDiGetDeviceInterfaceDetail()を再度呼び出します。

このプロセスは機能し、必要なデータを取得しています。正しく機能していないのは、プログラムが終了したとき、またはメモリを直接削除したときに、デバッグアサーションが発生することです。アサーションウィンドウには、問題が見つかったファイルdbgdel.cppが52行目にあります。問題:「式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)」。

何が問題なのかわかりません。使用しているすべてのコードを削除し、すべてのセットアップAPI呼び出しなしでSP_DEVICE_INTERFACE_DETAIL_DATAオブジェクトを新しくすると、削除の呼び出しが機能します。基本的に、これが私がしていることです:

プログラムが終了するか、delete []が呼び出されると、前述のアサートが表示されます。私が間違っていることを説明してください。

ありがとう、アンディ

更新:SP_DEVICE_INTERFACE_DETAIL_DATAの定義を追加するのを忘れました。それはここで見つけることができます。ただし、次のようになります。

0 投票する
1 に答える
1123 参照

windows - SetupUninstallOEMInfはいつERROR_NO_MORE_ITEMSを返しますか?

SetupAPIのSetupUninstallOEMInf関数はどのような状況でERROR_NO_MORE_ITEMSエラーコードを設定しますか?

MSDNのドキュメントでは、これについて詳しく説明していません。

0 投票する
1 に答える
288 参照

c# - コードアクセスセキュリティにより、PInvokingSetupAPI呼び出しが防止されています

もう少し理解できたので、この質問を言い換えています。もともと、私が持っていたものはあまりにも曖昧でした。「コードアクセスセキュリティ」と呼ばれるものによってルーティングされていることを発見しました。これは古いものです。これを読んでいるすべての人にとっては確かですが、私にとってはそうではありません。

アプリケーションは非常に大きいので、一言で言えば、2つのアセンブリがあります。1つは、プログラム全体で使用されるさまざまな「ツール」を備えたユーティリティアセンブリです。もう1つは、機能するためにこれらのツールを呼び出すことです。

ユーティリティアセンブリには、PInvokedである多くの関数がありますが、私に不満を与えるのは、SetupDiGetDeviceInterfaceDetail()です(ここを参照)。私の関数プロトタイプは次のようになります。

この関数を使用するアセンブリでは、SP_DEVICE_INTERFACE_DETAIL_DATA構造体にあるDevicePathを格納するために必要なスペースの量を理解するために、注釈で概説されている2つのステップのプロセスを使用しています(ここを参照)。例えば:

最も苛立たしいことは、これらのアセンブリが2つの異なるプログラムによって使用されていることです。1つは、VisualStudioの分離シェルを使用するGUIです。もう1つは、単なるコマンドラインプログラムです。GUIが実行されているとき、上記のコードが呼び出され、期待どおりに実行されます。ただし、コマンドラインツールでは、何が起こったかに関するいくつかのデータで失敗します(このセットアップAPI関数のMSDNリファレンスで説明されています)。この時点では、返されたデータの一部しか回復できません。これがランタイムから返されるものです: "stem.Security.PartialTrustVisibilityLevel、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken=b77a5c561934e089"。

これがコードアクセスセキュリティと関係があることは知っていますが、修正方法がまったくわかりません。これまでに見つけたいくつかの提案を使用して、この属性をアセンブリに試しました(コードの名前空間ブロックの前に配置しました):[アセンブリ:AllowPartiallyTrustedCallers]

しかし、これは他のコンパイルの問題を引き起こしました。

どうか、何でも最も役に立ち、大いに感謝します。

アンディ

0 投票する
1 に答える
3691 参照

c# - 32 ビットおよび 64 ビットのランタイムでの動的構造のマーシャリング

ここでSetupDiGetDeviceInterfaceDetail() を呼び出していますが、SP_DEVICE_INTERFACE_DETAIL_DATA 構造が正しくマーシャリングされていません。構造体の定義はここにあります。PInvoke.net のこの構造の定義を使用しようとしましたが、ここでは役に立ちませんでした。

これまでのところ、関数の呼び出しが成功した場合 (つまり、マーシャラーがエラーをスローしなかった場合)、戻り値は 1784 (INVALID_USER_BUFFER) です。キッカーは、このコードが私のボックスの 32 ビット プロセスから実行される場合、これらすべてが正常に機能することです。64 ビット プロセスで実行すると、この問題が発生します。

私の現在の SetupDiGetInterfaceDetailData() 署名は次のようになります。

現在、私は Marshal.AllocHGlobal() でメモリを割り当て、Marshal.* 関数ファミリーを使用してそのバッファからデータを読み書きしています。

参考までに、これは私がやっていることです:

前述したように、SP_DEVICE_INTERFACE_DETAIL_DATA (上記のリンクを参照) の PInvoke.net で概説されている構造を定義して、それを処理する新しい PInvoke メソッド シグネチャを作成してみました。64 ビット システムから実行すると、同じ問題が発生します。つまり、関数が 1784 を返します。その理由は、64 ビット ランタイムで実行する場合、C# での参照が 8 バイト アラインされているためと思われます (別のStackOverflow の記事)。その構造体に対してさまざまなレイアウトを試し、(明示的なフィールド オフセットを使用して) レイアウトを 4 バイト アラインされた構造体に強制しようとしましたが、それもうまくいきませんでした。コンパイル時間の問題がありました。

PInvoke メソッドの署名パラメーターにさまざまな装飾を使用してみました。MarshalAs(UnmanagedType.LPStruct) など、不適切にペアリングし続けています。私は今、これについて助けが必要なところまで来ています。

私が本当に理解していないのは、なぜそれが起こっているのかということです。私のボックスで 32 ビット ランタイムで動作する場合でも、64 ビット ランタイムはセットアップ API の正しい 64 ビット バージョンに接続するだけではないでしょうか? どうしたの?

助けてくれてありがとう、アンディ

問題は解決しました

良いことは、それが解決されたことです。イライラすることは、ここに投稿してから 1、2 時間以内に問題を修正するのが好きではないことです。したがって、問題は確かに64ビットの問題でした。Marshal.GetLastWin32Error() からのエラー コードが問題を教えてくれました。cbSize 値が正しくありませんでした。8 に変更したところ、すべてが機能するようになりました。

誰か、サイズが 64 ビットで 8 になった理由を説明してください。構造は上記のとおりです (コメント投稿者から、それを含めるように依頼されました)。この構造は、単一の DWORD と TCHAR[ANYSIZE_ARRAY] の 2 つのメンバーで構成されます。ANYSIZE_ARRAY は 1 と評価されます。TCHAR は、Unicode の場合は常に WCHAR であり、それ以外の場合は char です。DWORD は常に 32 ビット (4 バイト) であり、Unicode の 1 つの TCHAR は 2 バイトです。では、4 + 2 = 6 です。なぜ 8 なのですか? これは、64 ビットでのその構造のバイト アラインメントによるものですか? 私は本当にこれを理解したいです。

とにかく、cbSize メンバーを 64 ビットの場合は 8、32 ビットの場合は 6 に設定すると機能し、生のメモリの割り当て/割り当て解除とマーシャリングの代わりに、上記で定義した構造を使用できます。

0 投票する
1 に答える
1896 参照

setupapi - セットアップ API を使用して、デバイスが有効になっているかどうかを確認できますか

Setup API を使用してデバイスを有効または無効にする方法を知っています。私が知る必要があるのは、この同じ API を使用して、デバイスが有効か無効かを判断できるかということです。Microsoftのdevconはハードウェアの操作にSetup APIを使用し、そのプログラムはデバイスが有効か無効かを通知するため(デバイスマネージャーと同様)、本当の問題はそれをどのように使用するかだと思います。これはどのように行われますか?この時点までのセットアップ API メソッドの調査では、明確な答えは示されていません。

アンディ

0 投票する
1 に答える
1033 参照

windows - CurrentControlSet \ Control \ MediaPropertiesを見つけるためにWindowsAPIを修正しますか?

カスタムジョイスティックデバイスをサポートしたいと考えていますが、プロジェクトの要件により、DirectInputAPIを使用できなくなりました。「クラシック」なWindowsマルチメディアAPI(joyGetDevCapsやファミリーなど)の使用に切り替えましたが、1つの例外を除いてすべて機能します。

DirectInput DeviceInstanceには、デバイスの正しい「カスタム」名を返すInstanceNameProductNameの2つのフィールドがありました。

対応するjoyGetDevCaps製品名フィールドszPnameは、一般的な「MicrosoftPC-ジョイスティックドライバー」を返します。

デバイスがインストールされているシステムのレジストリを検索したところ、このノードに必要な文字列を持つREG_SZOEMNameエントリがあることがわかりました。

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ MediaProperties \ PrivateProperties \ Joystick \ OEM \ VID_07C0&PID_1128

JOYCAPSには、wMid(メーカーID)とwPid(製品ID)の2つのフィールドが返されます。これらのフィールドは、キー名の2つの16進値wMid = 0x07c0、wPid=0x1128にマップされます。

さらに、GUID_DEVINTERFACE_HIDでSetupDiEnumDeviceInfo APIを使用して、一致するコントローラーを見つけることができます(ただし、この手順は必要ない場合があります)。

HID \ VID_07C0&PID_1128&REV_1032、HID準拠のゲームコントローラー

質問:使用する必要があるMediaProperties \ PrivatePropertiesを列挙するためのAPIはありますか、それともこの情報を使用してレジストリに直接クエリを実行するのは「安全」ですか?APIがある場合は、リファレンスやサンプルコードで回答してください。関連するものが見つかりません。

0 投票する
2 に答える
3631 参照

c++ - HID デバイスのプログラミング - C++ (SETUPAPI.dll および HID.dll) で動作しますか?

@Stackoverflowに質問するのはちょっと初めてですが、特に私の主題のほとんどの最終プロジェクトの最近では、聖書として(リッチーのCの本を除いて)最も近いものでした。とにかく、私の質問は、HID デバイスと通信するアプリケーションに必要なライブラリと、C++ でそれを行う可能性についてです。

ファームウェアについてのサポートは必要ありません。デバイスはすでに期待どおりに動作しています。ただし、HID デバイスのプログラミング経験はC (Windows - VS2010) のみであり、現在、マトリックス画面を備えたデバイスに情報を送信して「もの」を表示する Compilers クラスの最終プロジェクトにいます。しかし、私のパートナーは、時間を大幅に節約できるC++で何かを行う必要があります(期限が 2 日であることを考えると、すばらしいことです)。

これの全体的なポイントは、Cで既に行っているのと同じ方法で(明らかな調整を加えて)、コードの一部をC++で実行し、SetupApi.DLL および HID.DLL と互換性を保つことができるかどうかを尋ねることです。

あらゆる種類のアドバイス、ポインター、または指示をいただければ幸いです。これまでに使用したコードを含めます。

私が持っているかもしれないスペイン語と混乱のすべてのコメントを許してください

0 投票する
1 に答える
517 参照

c++ - SetupVerifyInfFileは、Windows XPに対してERROR_INVALID_PARAMETER(0x57)を返します。

このコードはVista/Win7で正常に機能しますが、win xpでは失敗します(ERROR_INVALID_PARAMETERを返します)。この問題に関するドキュメントはインターネットにありません。誰かが間違いがどこにあるか知っていますか?ありがとう。

0 投票する
1 に答える
658 参照

wix - WIX インストーラーには、プラットフォームに応じて異なるマージ モジュールが含まれます

WIX インストーラーを使用してアプリケーションを作成しています。このアプリケーションにはドライバーが必要で (これも私が作成しました)、これはメインの WIX インストーラー プロジェクトに含まれるマージ モジュールを介してインストールされます。

異なるプラットフォームには異なるドライバー バリアントが必要です。また、同じインストーラーに diffxapp_x64 と diffxapp_x86 を含めることはできないため、私が知る限り、異なるインストーラー パッケージが必要です。

したがって、1 つのメイン インストーラーと 3 つのマージ モジュール (x86、x64、および ia64 用) があります。ターゲット プラットフォーム設定を使用して、正しいマージ モジュール バリアントを条件付きでメイン インストーラー プロジェクトに含め、3 つのパッケージを吐き出すことはできますか?

ありがとう

トム

0 投票する
1 に答える
695 参照

c++ - DiInstallDevice x86 でのリンカ エラー

ドライバーのインストールにDiInstallDevice 関数 ( MSDN ) を使用しています。ただし、x64 バージョンは問題ありませんが、x86 でソリューションをビルドするとリンカー エラーが発生します。エラーは LNK2019 です。リンクされた関数は x86 バージョンの newdev.lib で見つかりませんでした。x86 および x64 バージョンのリンカー出力は次のとおりです。

x86:

C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\newdev.lib の検索:
_UpdateDriverForPlugAndPlayDevicesW@20が見つかりました KernelDriverInstaller.obj
で参照されている newdev.lib
(newdev.dll)が読み込まれています __IMPORT_DESCRIPTOR_newdev が
見つかりまし
た newdev.lib(newdev. dll)
newdev.lib(newdev.dll ) をロード newdev_NULL_THUNK_DATA を
発見 newdev.lib (newdev.dll)
で参照 newdev.lib(newdev.dll) を
ロード

x64:

C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64\newdev.lib の検索:
KernelDriverInstaller.obj
で参照されている DiInstallDevice が見つかりました
newdev.lib(newdev.dll)が読み込ま
れました UpdateDriverForPlugAndPlayDevicesW
が KernelDriverInstaller.obj で参照されました
Loaded newdev. lib(newdev.dll)
が見つかりました __IMPORT_DESCRIPTOR_newdev
newdev.lib(newdev.dll) で
参照されました newdev.lib(newdev.dll) で参照されました newdev.lib
(newdev.dll)
が見つかりました newdev_NULL_THUNK_DATA newdev.lib( newdev.dll
) で参照されました
newdev.lib(newdev.dll)

ご覧のとおり、リンカーは x86 ライブラリの関数参照を見つけることができませんでした。誰かがこの問題とそれを解決する方法について何か知っていますか? Win7 x64 + VS2008 SP1 を使用しています。

ありがとうございました