| 157 | } |
| 158 | |
| 159 | XN_C_API XnStatus XN_C_DECL xnOSOpenSharedMemoryEx(const XnChar* strName, XnUInt32 nAccessFlags, XnBool bAllowOtherUsers, XN_SHARED_MEMORY_HANDLE* phSharedMem) |
| 160 | { |
| 161 | XnStatus nRetVal = XN_STATUS_OK; |
| 162 | |
| 163 | XN_VALIDATE_INPUT_PTR(strName); |
| 164 | XN_VALIDATE_OUTPUT_PTR(phSharedMem); |
| 165 | |
| 166 | DWORD flags; |
| 167 | nRetVal = AccessFlagsToWin32ViewFlags(nAccessFlags, &flags); |
| 168 | XN_IS_STATUS_OK(nRetVal); |
| 169 | |
| 170 | XnChar strWinName[XN_FILE_MAX_PATH]; |
| 171 | nRetVal = XnWin32CreateKernelObjectName(strWinName, MAX_PATH, strName, bAllowOtherUsers); |
| 172 | if (nRetVal != XN_STATUS_OK) |
| 173 | { |
| 174 | return XN_STATUS_OS_FAILED_TO_OPEN_SHARED_MEMORY; |
| 175 | } |
| 176 | |
| 177 | // allocate handle |
| 178 | XnOSSharedMemory* pHandle; |
| 179 | XN_VALIDATE_CALLOC(pHandle, XnOSSharedMemory, 1); |
| 180 | |
| 181 | // create file mapping |
| 182 | pHandle->hMapFile = OpenFileMapping( |
| 183 | flags, // read/write access |
| 184 | FALSE, // do not inherit the name |
| 185 | strWinName); // name of mapping object |
| 186 | |
| 187 | if (pHandle->hMapFile == NULL) |
| 188 | { |
| 189 | XN_LOG_ERROR_RETURN(XN_STATUS_OS_FAILED_TO_OPEN_SHARED_MEMORY, XN_MASK_OS, "Could not open file mapping object (%d).", GetLastError()); |
| 190 | } |
| 191 | |
| 192 | // map it to the process |
| 193 | pHandle->pAddress = MapViewOfFile( |
| 194 | pHandle->hMapFile, // handle to map object |
| 195 | flags, // read/write permission |
| 196 | 0, |
| 197 | 0, |
| 198 | 0); |
| 199 | |
| 200 | if (pHandle->pAddress == NULL) |
| 201 | { |
| 202 | XN_LOG_ERROR_RETURN(XN_STATUS_OS_FAILED_TO_OPEN_SHARED_MEMORY, XN_MASK_OS, "Could not map view of file (%d).", GetLastError()); |
| 203 | } |
| 204 | |
| 205 | *phSharedMem = pHandle; |
| 206 | |
| 207 | return (XN_STATUS_OK); |
| 208 | } |
| 209 | |
| 210 | XN_C_API XnStatus xnOSCloseSharedMemory(XN_SHARED_MEMORY_HANDLE hSharedMem) |
| 211 | { |
no test coverage detected