OpenMutexを使用して、フルパス修飾によって名前付きミューテックスを開いたりクエリしたりできますか?例えば:完全修飾パスで名前付きミューテックスを開く
HANDLE hHandleMutex = OpenMutex(READ_CONTROL, FALSE,
"\\Sessions\\1\\BaseNamedObjects\\SmartScreen_AppRepSettings_Mutex");
しかし、この関数はNULLを返し、エラー161で失敗(ERROR_BAD_PATHNAME
:指定されたパスが無効です)。はい、ドキュメントには\\Global
と\\Local
接頭辞についての説明があり、これらの完全なオブジェクト名については何も記載していません。ただし、MSDNにはすべてが記載されていません!
ドキュメント化されていないAPI NtQuerySystemInformation
とNtQueryObject
を使用して同じクエリをクエリできます。しかし、それはプロセスを開くこと、トークンを複製することなどを必要とします。私はこれらのAPIを非常によく使うことができますが、単純な解決策が必要でした。
プロセスがSYSTEMアカウントとして実行されていると仮定すると、エラー5(アクセス拒否)は問題にはなりません。それが問題なら、私はそれを処理することができます。
あなたが必要とするか、または\\場合、または完全なパスをしたいを招くことなく、 'セッション\\ 1 \\ SmartScreen_AppRepSettings_Mutex'を使用する - ' ZwOpenMutant' – RbMm
'OpenMutex'は' \セッション\ \ BaseNamedObjects'または唯一の '\ BaseNamedObjects'に見えました。両方のディレクトリに '\ BaseNamedObjects \ Session'と' \ Sessions \ 1 \ BaseNamedObjects \ Session'というシンボリックリンクがあり、 '\ Sessions \ BNOLINKS'を指しています。ここにはセッションごとの' BaseNamedObjects'ディレクトリへの別のシンボリックリンクがあります。なぜなら、この "Session \\" '接頭辞が働いていたからです。または他の方法ではネイティブAPI 'ZwOpenMutant'を使用します - この場合は任意のパスを自由に使用します –
RbMm
要するに、OpenMutexは、(カーネルに見られるような)生のパスを無効にする方法で与えられたパスを処理します。そうではありません。あなたはOpenMutexに意味のあるパスを使用する必要があります。 –