4

Windows (C# で記述) サービスと C++ で記述されたスクリーンセーバーの間でデータを共有するために、メモリ マップ ファイルを使用しようとしています。

これは、スクリーンセーバーがログイン ユーザーのコンテキストで実行されている場合はうまく機能しますが、スクリーンセーバーがログオン画面で実行されている場合は機能しません。代わりOpenFileMappingに、不正アクセス エラーで失敗します。アクセス ルール (または、おそらくこれを機能させるためのシステム設定) が不足していることは明らかですが、どれがどれかわかりません。

私のC#サイドコード:

    public CreateMemMappedFile(string fileName)
    {
        this.rootName = fileName;
        var security = new MemoryMappedFileSecurity();

        security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(
            new SecurityIdentifier(WellKnownSidType.WorldSid, null),
            MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));
        security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(
            new SecurityIdentifier(WellKnownSidType.AnonymousSid, null),
            MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));
        security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(
            new SecurityIdentifier(WellKnownSidType.NullSid, null),
            MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));

        // printing the SID from the screensaver shows that we are running as Local Service
        security.AddAccessRule(new System.Security.AccessControl.AccessRule<MemoryMappedFileRights>(
            new SecurityIdentifier(WellKnownSidType.LocalServiceSid, null),
            MemoryMappedFileRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));

        this.handle = MemoryMappedFile.CreateOrOpen(
            "Global\\" + fileName, 1024 * 1024,
            MemoryMappedFileAccess.ReadWriteExecute
            ,MemoryMappedFileOptions.DelayAllocatePages,
            security, System.IO.HandleInheritability.Inheritable
            );
    }

私のスクリーンセーバーコード:

        TCHAR* myFileName = _T("Global\\myfile");
        ipcBufferHandle = OpenFileMapping(FILE_MAP_READ,FALSE,myFileName);
        if(ipcBufferHandle == NULL)
        {
             _tprintf(_T("couldn't open file \"%s\" with error code %d\n"),myFileName,GetLastError());
        }
        else
        {
            _tprintf(_T("opened file %s\n"),myFileName);
        }

出力するcouldn't open file "Global\myfile" with error code 5

4

1 に答える 1

0

msdnで述べたように、 OpenFileMappingは次のように定義されています。

HANDLE WINAPI OpenFileMapping(
  _In_  DWORD dwDesiredAccess,
  _In_  BOOL bInheritHandle,
  _In_  LPCTSTR lpName
);

したがって、で呼び出すbInheritHandleFALSE、ハンドルは他のプロセスと共有されません。TRUEC# で を使用したのと同じように、 を試してくださいSystem.IO.HandleInheritability.Inheritable

ipcBufferHandle = OpenFileMapping(FILE_MAP_READ, TRUE, myFileName);
于 2013-08-05T21:10:34.607 に答える