| 87 | } |
| 88 | |
| 89 | XN_C_API XnStatus XN_C_DECL xnOSCreateSharedMemoryEx(const XnChar* strName, XnUInt32 nSize, XnUInt32 nAccessFlags, XnBool bAllowOtherUsers, XN_SHARED_MEMORY_HANDLE* phSharedMem) |
| 90 | { |
| 91 | XnStatus nRetVal = XN_STATUS_OK; |
| 92 | |
| 93 | XN_VALIDATE_INPUT_PTR(strName); |
| 94 | XN_VALIDATE_OUTPUT_PTR(phSharedMem); |
| 95 | |
| 96 | DWORD mapflags; |
| 97 | nRetVal = AccessFlagsToWin32MapFlags(nAccessFlags, &mapflags); |
| 98 | XN_IS_STATUS_OK(nRetVal); |
| 99 | |
| 100 | DWORD viewflags; |
| 101 | nRetVal = AccessFlagsToWin32ViewFlags(nAccessFlags, &viewflags); |
| 102 | XN_IS_STATUS_OK(nRetVal); |
| 103 | |
| 104 | XnChar strWinName[XN_FILE_MAX_PATH]; |
| 105 | nRetVal = XnWin32CreateKernelObjectName(strWinName, MAX_PATH, strName, bAllowOtherUsers); |
| 106 | if (nRetVal != XN_STATUS_OK) |
| 107 | { |
| 108 | return XN_STATUS_OS_EVENT_CREATION_FAILED; |
| 109 | } |
| 110 | |
| 111 | SECURITY_ATTRIBUTES* pSecurityAttributes = NULL; |
| 112 | nRetVal = XnWin32GetSecurityAttributes(bAllowOtherUsers, &pSecurityAttributes); |
| 113 | if (nRetVal != XN_STATUS_OK) |
| 114 | { |
| 115 | return XN_STATUS_OS_EVENT_CREATION_FAILED; |
| 116 | } |
| 117 | |
| 118 | // allocate handle |
| 119 | XnOSSharedMemory* pHandle; |
| 120 | XN_VALIDATE_CALLOC(pHandle, XnOSSharedMemory, 1); |
| 121 | |
| 122 | // create file mapping |
| 123 | pHandle->hMapFile = CreateFileMapping( |
| 124 | INVALID_HANDLE_VALUE, // use paging file |
| 125 | pSecurityAttributes, // security |
| 126 | mapflags, // read/write access |
| 127 | 0, // max. object size |
| 128 | nSize, // buffer size |
| 129 | strWinName); // name of mapping object |
| 130 | |
| 131 | if (pHandle->hMapFile == NULL) |
| 132 | { |
| 133 | XN_LOG_ERROR_RETURN(XN_STATUS_OS_FAILED_TO_CREATE_SHARED_MEMORY, XN_MASK_OS, "Could not create file mapping object (%d).", GetLastError()); |
| 134 | } |
| 135 | |
| 136 | // map it to the process |
| 137 | pHandle->pAddress = MapViewOfFile( |
| 138 | pHandle->hMapFile, // handle to map object |
| 139 | viewflags, // read/write permission |
| 140 | 0, |
| 141 | 0, |
| 142 | nSize); |
| 143 | |
| 144 | if (pHandle->pAddress == NULL) |
| 145 | { |
| 146 | XN_LOG_ERROR_RETURN(XN_STATUS_OS_FAILED_TO_CREATE_SHARED_MEMORY, XN_MASK_OS, "Could not map view of file (%d).", GetLastError()); |
no test coverage detected