XN_C_API XnStatus xnOSCreateSharedMemory(const XnChar* strName, XnUInt32 nSize, XnUInt32 nAccessFlags, XN_SHARED_MEMORY_HANDLE* phSharedMem) { XnStatus nRetVal = XN_STATUS_OK; XN_VALIDATE_INPUT_PTR(strName); XN_VALIDATE_OUTPUT_PTR(phSharedMem); DWORD mapflags; nRetVal = AccessFlagsToWin32MapFlags(nAccessFlags, &mapflags); XN_IS_STATUS_OK(nRetVal); DWORD viewflags; nRetVal = AccessFlagsToWin32ViewFlags(nAccessFlags, &viewflags); XN_IS_STATUS_OK(nRetVal); XnChar strWinName[XN_FILE_MAX_PATH]; nRetVal = NameToWin32Name(strName, strWinName); XN_IS_STATUS_OK(nRetVal); // allocate handle XnOSSharedMemory* pHandle; XN_VALIDATE_CALLOC(pHandle, XnOSSharedMemory, 1); // create file mapping pHandle->hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // use paging file NULL, // default security mapflags, // read/write access 0, // max. object size nSize, // buffer size strWinName); // name of mapping object if (pHandle->hMapFile == NULL) { XN_LOG_ERROR_RETURN(XN_STATUS_OS_FAILED_TO_CREATE_SHARED_MEMORY, XN_MASK_OS, "Could not create file mapping object (%d).", GetLastError()); } // map it to the process pHandle->pAddress = MapViewOfFile( pHandle->hMapFile, // handle to map object viewflags, // read/write permission 0, 0, nSize); if (pHandle->pAddress == NULL) { XN_LOG_ERROR_RETURN(XN_STATUS_OS_FAILED_TO_CREATE_SHARED_MEMORY, XN_MASK_OS, "Could not map view of file (%d).", GetLastError()); } *phSharedMem = pHandle; return (XN_STATUS_OK); }
XN_C_API XnStatus XN_C_DECL xnOSCreateSharedMemoryEx(const XnChar* strName, XnUInt32 nSize, XnUInt32 nAccessFlags, XnBool bAllowOtherUsers, XN_SHARED_MEMORY_HANDLE* phSharedMem) { XnStatus nRetVal = XN_STATUS_OK; XN_VALIDATE_INPUT_PTR(strName); XN_VALIDATE_OUTPUT_PTR(phSharedMem); DWORD mapflags; nRetVal = AccessFlagsToWin32MapFlags(nAccessFlags, &mapflags); XN_IS_STATUS_OK(nRetVal); DWORD viewflags; nRetVal = AccessFlagsToWin32ViewFlags(nAccessFlags, &viewflags); XN_IS_STATUS_OK(nRetVal); XnChar strWinName[XN_FILE_MAX_PATH]; nRetVal = XnWin32CreateKernelObjectName(strWinName, MAX_PATH, strName, bAllowOtherUsers); if (nRetVal != XN_STATUS_OK) { return XN_STATUS_OS_EVENT_CREATION_FAILED; } SECURITY_ATTRIBUTES* pSecurityAttributes = NULL; nRetVal = XnWin32GetSecurityAttributes(bAllowOtherUsers, &pSecurityAttributes); if (nRetVal != XN_STATUS_OK) { return XN_STATUS_OS_EVENT_CREATION_FAILED; } // allocate handle XnOSSharedMemory* pHandle; XN_VALIDATE_CALLOC(pHandle, XnOSSharedMemory, 1); // create file mapping pHandle->hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // use paging file pSecurityAttributes, // security mapflags, // read/write access 0, // max. object size nSize, // buffer size strWinName); // name of mapping object if (pHandle->hMapFile == NULL) { XN_LOG_ERROR_RETURN(XN_STATUS_OS_FAILED_TO_CREATE_SHARED_MEMORY, XN_MASK_OS, "Could not create file mapping object (%d).", GetLastError()); } // map it to the process pHandle->pAddress = MapViewOfFile( pHandle->hMapFile, // handle to map object viewflags, // read/write permission 0, 0, nSize); if (pHandle->pAddress == NULL) { XN_LOG_ERROR_RETURN(XN_STATUS_OS_FAILED_TO_CREATE_SHARED_MEMORY, XN_MASK_OS, "Could not map view of file (%d).", GetLastError()); } *phSharedMem = pHandle; return (XN_STATUS_OK); }