システムエラー0x5:createfilemapping()
-
10-10-2019 - |
質問
実装したい 名前の共有メモリを使用してIPC。
これを行うために、手順の1つは メモリオブジェクトのマッピング, 、使用 createfilemapping()。
私はMSDN Webサイトが再comedするように正確にそれを行います: http://msdn.microsoft.com/en-us/library/aa366551(v=vs.85).aspx:
hFileMappingHandle = CreateFileMapping
(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
256, // maximum object size (low-order DWORD)
"Global\\MyFileMappingObject" // name of mapping object
);
DWORD dwError = GetLastError();
ただし、返されるハンドルは常にです 0x0, 、 そしてその システムエラーコード 返品は次のとおりです。 0x5(アクセス拒否。)
- それだけ 名前付きメモリ共有 望ましい(ファイル共有ではありません)。
- Windows 7 x64 ビットOS
- 管理者 利用可能なユーザーの権利
- 開発されたアプリケーション:64ビットプラグインアプリケーション (.dll)
誰かが同じ経験を持っていますか、そしてそれを修正する方法はありますか?私は私の参照としてMSDNサイトを使用しているので、コードに問題があるとは思わないようにします。
解決
十分な特権がないようです。
MSDNから:
セッションゼロ以外のセッションからグローバルネームスペースにファイルマッピングオブジェクトを作成するには、secreateglobalprivilegeの特権が必要です。詳細については、カーネルオブジェクトの名前空間を参照してください。
...
セッションゼロ以外のセッションから、createfilemappingを使用することにより、グローバルネームスペースでファイルマッピングオブジェクトの作成は特権操作です。このため、任意のリモートデスクトップセッションホスト(RDセッションホスト)サーバーセッションで実行されるアプリケーションには、グローバルネームスペースにファイルマッピングオブジェクトを作成するために、ExeeTeglobalPrivilegeが有効になっている必要があります。特権チェックは、ファイルマッピングオブジェクトの作成に限定されており、既存のオブジェクトを開くことには適用されません。たとえば、サービスまたはシステムがファイルマッピングオブジェクトを作成する場合、ユーザーが必要なアクセスを備えている場合、セッションで実行されるプロセスがファイルマッピングオブジェクトにアクセスできます。
他のヒント
管理者、サービス、およびネットワークサービスには、デフォルトでExeateglobalPrivilegeがあります。ただし、Windows7/Vistaが管理者としてすべてを実行しているわけではないことを覚えておく必要があります。したがって、「管理者として開始」を使用して、アプリケーションに「グローバル」作業を行います。デバッグする場合は、管理者としてVisual Studioを開始してください。
グローバルファイルマッピングを作成するには、必要です SeCreateGlobalPrivilege
特権 - あなたはそれを持っていますか? Access-deniedは、これが許可の問題であることを確かです。
グローバルネームスペースに関するドキュメント内の端末サービスへの参照は、異常な状況がある場合にのみ心配する必要があることを意味するため、少し誤解を招くことです。
実際、IISとシステムサービスの両方がセッションゼロで実行され、セッション1でログオンする最初の /唯一のユーザーが実行されるため、IISまたはサービスと通常のプログラムの間で通信するためにグローバルネームスペースを使用する必要があります。