可以';t在屏幕上打开日志中的内存映射文件

本文关键字:日志 内存 文件 映射 屏幕 可以 | 更新日期: 2023-09-27 18:26:28

我正在尝试使用内存映射文件在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

可以';t在屏幕上打开日志中的内存映射文件

如msdn所述,OpenFileMapping定义为

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

因此,当使用FALSE调用bInheritHandle时,句柄不会与其他进程共享。尝试TRUE,就像您在C#中使用System.IO.HandleInheritability.Inheritable一样。

ipcBufferHandle = OpenFileMapping(FILE_MAP_READ, TRUE, myFileName);