如何访问在Windows 7上运行的.net应用程序中的共享内存

时间:2013-05-08 12:37:53

标签: c++

我正在使用.net平台并使用C ++编写我的应用程序。当我使用以下代码创建一个全局共享内存来存储Windows XP中的某些值时,它完全正常工作但是在Windows 7中使用它时,它给出了错误,所以我也应用了安全属性,但仍然给出了特定权限错误。

//Global declaration

TCHAR szName[]=TEXT("Global\\MyObject");

bool CreateDACL(SECURITY_ATTRIBUTES *sa)
{
    wchar_t *sdd = L"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GRGW;;;IU)";
    return ConvertStringSecurityDescriptorToSecurityDescriptor((LPCSTR)sdd, SDDL_REVISION_1, &sa->lpSecurityDescriptor, NULL) == TRUE;
}

void CreateShareMemory()
{

HANDLE hMapFile =NULL;    // Create handle

    // Check if already created
    hMapFile = OpenFileMapping(
                   FILE_MAP_ALL_ACCESS,   // read/write access
                   FALSE,                 // do not inherit the name
                   szName);               // name of mapping object 

    // If not created, then create
    if(hMapFile == NULL)
    {
        SECURITY_ATTRIBUTES sa;
        CreateDACL(&sa);

        hMapFile = CreateFileMapping(
                     INVALID_HANDLE_VALUE,    // use paging file
                     &sa,                    // default security 
                     PAGE_READWRITE|SEC_COMMIT,          // read/write access
                     0,                       // max. object size 
                     256,                // buffer size  
                     szName);                 // name of mapping object

        int i=GetLastError();       // Here it is giving error no 5
    }
}

1 个答案:

答案 0 :(得分:2)

普通用户无法在全局命名空间中创建文件映射,因为Session 0分离(看起来像XP SP2)没有SeCreateGlobalPrivilege权限。

请阅读CreateFileMapping函数的文档,该文档明确提及:

  

从会话零以外的会话在全局命名空间中创建文件映射对象需要SeCreateGlobalPrivilege特权。有关更多信息,请参阅内核对象命名空间。

您的进程未在会话0中作为系统服务运行,因此无法在未获得此权限的情况下创建全局文件映射。获得此权限的最简单方法是使用提升的权限运行该进程。

一种可能的替代方法(基于来自各种未经证实的来源的信息的未经测试的猜测)是尝试使用Session\(number)\(name)在会话的命名空间中查找文件映射。如果您足够打开映射的权限,则其他进程应该可以访问它。