1fb299fa2Sopenharmony_ci/* 2fb299fa2Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at 6fb299fa2Sopenharmony_ci * 7fb299fa2Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb299fa2Sopenharmony_ci * 9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and 13fb299fa2Sopenharmony_ci * limitations under the License. 14fb299fa2Sopenharmony_ci */ 15fb299fa2Sopenharmony_ci#include "pkg_utils.h" 16fb299fa2Sopenharmony_ci#ifdef _WIN32 17fb299fa2Sopenharmony_ci#include <windows.h> 18fb299fa2Sopenharmony_ci#else 19fb299fa2Sopenharmony_ci#include <climits> 20fb299fa2Sopenharmony_ci#include <sys/mman.h> 21fb299fa2Sopenharmony_ci#endif 22fb299fa2Sopenharmony_ci#include <cstring> 23fb299fa2Sopenharmony_ci#include <fcntl.h> 24fb299fa2Sopenharmony_ci#include <sys/stat.h> 25fb299fa2Sopenharmony_ci#include <unistd.h> 26fb299fa2Sopenharmony_ci#include "utils.h" 27fb299fa2Sopenharmony_ci 28fb299fa2Sopenharmony_cinamespace Hpackage { 29fb299fa2Sopenharmony_ci#ifdef _WIN32 30fb299fa2Sopenharmony_ci#undef ERROR 31fb299fa2Sopenharmony_ci#endif 32fb299fa2Sopenharmony_ci 33fb299fa2Sopenharmony_ci#ifdef __APPLE__ 34fb299fa2Sopenharmony_ci#define MAP_POPULATE 0x08000 35fb299fa2Sopenharmony_ci#endif 36fb299fa2Sopenharmony_ci 37fb299fa2Sopenharmony_ciconstexpr int32_t MIN_YEAR = 80; 38fb299fa2Sopenharmony_ciconstexpr uint32_t TM_YEAR_BITS = 9; 39fb299fa2Sopenharmony_ciconstexpr uint32_t TM_MON_BITS = 5; 40fb299fa2Sopenharmony_ciconstexpr uint32_t TM_MIN_BITS = 5; 41fb299fa2Sopenharmony_ciconstexpr uint32_t TM_HOUR_BITS = 11; 42fb299fa2Sopenharmony_ciconstexpr uint32_t BYTE_SIZE = 8; 43fb299fa2Sopenharmony_ciconstexpr uint32_t SECOND_BUFFER = 2; 44fb299fa2Sopenharmony_ciconstexpr uint32_t THIRD_BUFFER = 3; 45fb299fa2Sopenharmony_ciconstexpr uint8_t SHIFT_RIGHT_FOUR_BITS = 4; 46fb299fa2Sopenharmony_ci 47fb299fa2Sopenharmony_ciusing namespace Updater::Utils; 48fb299fa2Sopenharmony_ci 49fb299fa2Sopenharmony_cistd::string GetFilePath(const std::string &fileName) 50fb299fa2Sopenharmony_ci{ 51fb299fa2Sopenharmony_ci std::size_t pos = fileName.find_last_of('/'); 52fb299fa2Sopenharmony_ci if (pos == std::string::npos) { 53fb299fa2Sopenharmony_ci pos = fileName.find_last_of('\\'); 54fb299fa2Sopenharmony_ci } 55fb299fa2Sopenharmony_ci return fileName.substr(0, pos + 1); 56fb299fa2Sopenharmony_ci} 57fb299fa2Sopenharmony_ci 58fb299fa2Sopenharmony_cisize_t GetFileSize(const std::string &fileName) 59fb299fa2Sopenharmony_ci{ 60fb299fa2Sopenharmony_ci char realPath[PATH_MAX] = { 0 }; 61fb299fa2Sopenharmony_ci#ifdef _WIN32 62fb299fa2Sopenharmony_ci if (_fullpath(realPath, fileName.c_str(), PATH_MAX) == nullptr) { 63fb299fa2Sopenharmony_ci#else 64fb299fa2Sopenharmony_ci if (realpath(fileName.c_str(), realPath) == nullptr) { 65fb299fa2Sopenharmony_ci#endif 66fb299fa2Sopenharmony_ci PKG_LOGE("realPath is null"); 67fb299fa2Sopenharmony_ci return 0; 68fb299fa2Sopenharmony_ci } 69fb299fa2Sopenharmony_ci FILE *fp = fopen(realPath, "r"); 70fb299fa2Sopenharmony_ci if (fp == nullptr) { 71fb299fa2Sopenharmony_ci PKG_LOGE("Invalid file %s", fileName.c_str()); 72fb299fa2Sopenharmony_ci return 0; 73fb299fa2Sopenharmony_ci } 74fb299fa2Sopenharmony_ci 75fb299fa2Sopenharmony_ci if (fseek(fp, 0, SEEK_END) < 0) { 76fb299fa2Sopenharmony_ci PKG_LOGE("return value of fseek < 0"); 77fb299fa2Sopenharmony_ci fclose(fp); 78fb299fa2Sopenharmony_ci return 0; 79fb299fa2Sopenharmony_ci } 80fb299fa2Sopenharmony_ci long size = ftell(fp); 81fb299fa2Sopenharmony_ci if (size < 0) { 82fb299fa2Sopenharmony_ci PKG_LOGE("return value of ftell < 0"); 83fb299fa2Sopenharmony_ci fclose(fp); 84fb299fa2Sopenharmony_ci return 0; 85fb299fa2Sopenharmony_ci } 86fb299fa2Sopenharmony_ci fclose(fp); 87fb299fa2Sopenharmony_ci // return file size in bytes 88fb299fa2Sopenharmony_ci return static_cast<size_t>(size); 89fb299fa2Sopenharmony_ci} 90fb299fa2Sopenharmony_ci 91fb299fa2Sopenharmony_cistd::string GetName(const std::string &filePath) 92fb299fa2Sopenharmony_ci{ 93fb299fa2Sopenharmony_ci return filePath.substr(filePath.find_last_of("/") + 1); 94fb299fa2Sopenharmony_ci} 95fb299fa2Sopenharmony_ci 96fb299fa2Sopenharmony_ciint32_t CreatDirectory(const std::string &path, mode_t mode) 97fb299fa2Sopenharmony_ci{ 98fb299fa2Sopenharmony_ci size_t slashPos = 0; 99fb299fa2Sopenharmony_ci struct stat info {}; 100fb299fa2Sopenharmony_ci while (true) { 101fb299fa2Sopenharmony_ci slashPos = path.find_first_of("/", slashPos); 102fb299fa2Sopenharmony_ci if (slashPos == std::string::npos) { 103fb299fa2Sopenharmony_ci break; 104fb299fa2Sopenharmony_ci } 105fb299fa2Sopenharmony_ci if (slashPos == 0) { 106fb299fa2Sopenharmony_ci slashPos++; 107fb299fa2Sopenharmony_ci continue; 108fb299fa2Sopenharmony_ci } 109fb299fa2Sopenharmony_ci if (slashPos > PATH_MAX) { 110fb299fa2Sopenharmony_ci PKG_LOGE("path too long"); 111fb299fa2Sopenharmony_ci return -1; 112fb299fa2Sopenharmony_ci } 113fb299fa2Sopenharmony_ci auto subDir = path.substr(0, slashPos); 114fb299fa2Sopenharmony_ci if (stat(subDir.c_str(), &info) != 0) { 115fb299fa2Sopenharmony_ci#ifdef __WIN32 116fb299fa2Sopenharmony_ci int ret = mkdir(subDir.c_str()); 117fb299fa2Sopenharmony_ci#else 118fb299fa2Sopenharmony_ci int ret = mkdir(subDir.c_str(), mode); 119fb299fa2Sopenharmony_ci#endif 120fb299fa2Sopenharmony_ci if (ret && errno != EEXIST) { 121fb299fa2Sopenharmony_ci return ret; 122fb299fa2Sopenharmony_ci } 123fb299fa2Sopenharmony_ci } 124fb299fa2Sopenharmony_ci slashPos++; 125fb299fa2Sopenharmony_ci } 126fb299fa2Sopenharmony_ci#ifdef __WIN32 127fb299fa2Sopenharmony_ci int ret = mkdir(path.c_str()); 128fb299fa2Sopenharmony_ci#else 129fb299fa2Sopenharmony_ci int ret = mkdir(path.c_str(), mode); 130fb299fa2Sopenharmony_ci#endif 131fb299fa2Sopenharmony_ci if (ret && errno != EEXIST) { 132fb299fa2Sopenharmony_ci return ret; 133fb299fa2Sopenharmony_ci } 134fb299fa2Sopenharmony_ci return 0; 135fb299fa2Sopenharmony_ci} 136fb299fa2Sopenharmony_ci 137fb299fa2Sopenharmony_ciint32_t CheckFile(const std::string &fileName, int type) 138fb299fa2Sopenharmony_ci{ 139fb299fa2Sopenharmony_ci // Check if the directory of @fileName is exist or has write permission 140fb299fa2Sopenharmony_ci // If not, Create the directory first. 141fb299fa2Sopenharmony_ci std::string path = GetFilePath(fileName); 142fb299fa2Sopenharmony_ci if (path.empty()) { 143fb299fa2Sopenharmony_ci return PKG_SUCCESS; 144fb299fa2Sopenharmony_ci } 145fb299fa2Sopenharmony_ci if (access(path.c_str(), F_OK) == -1) { 146fb299fa2Sopenharmony_ci CreatDirectory(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); 147fb299fa2Sopenharmony_ci } 148fb299fa2Sopenharmony_ci int ret = -1; 149fb299fa2Sopenharmony_ci if (type == PkgStream::PkgStreamType_Read) { 150fb299fa2Sopenharmony_ci ret = access(path.c_str(), R_OK); 151fb299fa2Sopenharmony_ci } else { 152fb299fa2Sopenharmony_ci ret = access(path.c_str(), R_OK | W_OK); 153fb299fa2Sopenharmony_ci } 154fb299fa2Sopenharmony_ci if (ret == -1) { 155fb299fa2Sopenharmony_ci PKG_LOGE("file %s no permission ", fileName.c_str()); 156fb299fa2Sopenharmony_ci return PKG_NONE_PERMISSION; 157fb299fa2Sopenharmony_ci } 158fb299fa2Sopenharmony_ci return PKG_SUCCESS; 159fb299fa2Sopenharmony_ci} 160fb299fa2Sopenharmony_ci 161fb299fa2Sopenharmony_ciuint8_t *AnonymousMap(const std::string &fileName, size_t size) 162fb299fa2Sopenharmony_ci{ 163fb299fa2Sopenharmony_ci void *mappedData = nullptr; 164fb299fa2Sopenharmony_ci // Map memory for file 165fb299fa2Sopenharmony_ci mappedData = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_POPULATE | MAP_ANON, -1, 0); 166fb299fa2Sopenharmony_ci if (mappedData == MAP_FAILED) { 167fb299fa2Sopenharmony_ci PKG_LOGE("Failed to alloc memory for file %s ", fileName.c_str()); 168fb299fa2Sopenharmony_ci return nullptr; 169fb299fa2Sopenharmony_ci } 170fb299fa2Sopenharmony_ci return static_cast<uint8_t *>(mappedData); 171fb299fa2Sopenharmony_ci} 172fb299fa2Sopenharmony_ci 173fb299fa2Sopenharmony_ciuint8_t *FileMap(const std::string &path) 174fb299fa2Sopenharmony_ci{ 175fb299fa2Sopenharmony_ci if (access(path.c_str(), 0) != 0) { 176fb299fa2Sopenharmony_ci PKG_LOGE("Path not exist %s", path.c_str()); 177fb299fa2Sopenharmony_ci return nullptr; 178fb299fa2Sopenharmony_ci } 179fb299fa2Sopenharmony_ci int fd = open(path.c_str(), O_RDONLY); 180fb299fa2Sopenharmony_ci if (fd < 0) { 181fb299fa2Sopenharmony_ci PKG_LOGE("Failed to open file"); 182fb299fa2Sopenharmony_ci return nullptr; 183fb299fa2Sopenharmony_ci } 184fb299fa2Sopenharmony_ci size_t size = GetFileSize(path); 185fb299fa2Sopenharmony_ci void *mappedData = mmap(nullptr, size, PROT_READ, MAP_PRIVATE, fd, 0); 186fb299fa2Sopenharmony_ci if (mappedData == MAP_FAILED) { 187fb299fa2Sopenharmony_ci close(fd); 188fb299fa2Sopenharmony_ci PKG_LOGE("Failed to mmap file"); 189fb299fa2Sopenharmony_ci return nullptr; 190fb299fa2Sopenharmony_ci } 191fb299fa2Sopenharmony_ci close(fd); 192fb299fa2Sopenharmony_ci return static_cast<uint8_t *>(mappedData); 193fb299fa2Sopenharmony_ci} 194fb299fa2Sopenharmony_ci 195fb299fa2Sopenharmony_civoid ReleaseMemory(uint8_t *memMap, size_t size) 196fb299fa2Sopenharmony_ci{ 197fb299fa2Sopenharmony_ci if (size <= 0 || memMap == nullptr) { 198fb299fa2Sopenharmony_ci PKG_LOGE("Size must > 0"); 199fb299fa2Sopenharmony_ci return; 200fb299fa2Sopenharmony_ci } 201fb299fa2Sopenharmony_ci // Flush memory and release memory. 202fb299fa2Sopenharmony_ci msync(static_cast<void *>(memMap), size, MS_ASYNC); 203fb299fa2Sopenharmony_ci munmap(memMap, size); 204fb299fa2Sopenharmony_ci} 205fb299fa2Sopenharmony_ci 206fb299fa2Sopenharmony_cistd::string GetCurrPath() 207fb299fa2Sopenharmony_ci{ 208fb299fa2Sopenharmony_ci std::string path; 209fb299fa2Sopenharmony_ci char *buffer = getcwd(nullptr, 0); 210fb299fa2Sopenharmony_ci if (buffer == nullptr) { 211fb299fa2Sopenharmony_ci PKG_LOGE("getcwd error"); 212fb299fa2Sopenharmony_ci return "./"; 213fb299fa2Sopenharmony_ci } 214fb299fa2Sopenharmony_ci path.assign(buffer); 215fb299fa2Sopenharmony_ci free(buffer); 216fb299fa2Sopenharmony_ci return path + "/"; 217fb299fa2Sopenharmony_ci} 218fb299fa2Sopenharmony_ci 219fb299fa2Sopenharmony_civoid ExtraTimeAndDate(time_t when, uint16_t &date, uint16_t &time) 220fb299fa2Sopenharmony_ci{ 221fb299fa2Sopenharmony_ci when = static_cast<time_t>((static_cast<unsigned long>(when) + 1) & (~1)); 222fb299fa2Sopenharmony_ci struct tm nowTime {}; 223fb299fa2Sopenharmony_ci#ifdef __WIN32 224fb299fa2Sopenharmony_ci localtime_s(&nowTime, &when); 225fb299fa2Sopenharmony_ci#else 226fb299fa2Sopenharmony_ci localtime_r(&when, &nowTime); 227fb299fa2Sopenharmony_ci#endif 228fb299fa2Sopenharmony_ci int year = nowTime.tm_year; 229fb299fa2Sopenharmony_ci if (year < MIN_YEAR) { 230fb299fa2Sopenharmony_ci year = MIN_YEAR; 231fb299fa2Sopenharmony_ci } 232fb299fa2Sopenharmony_ci date = static_cast<uint16_t>(static_cast<uint16_t>(year - MIN_YEAR) << TM_YEAR_BITS); 233fb299fa2Sopenharmony_ci date |= static_cast<uint16_t>(static_cast<uint16_t>(nowTime.tm_mon + 1) << TM_MON_BITS); 234fb299fa2Sopenharmony_ci date |= static_cast<uint16_t>(nowTime.tm_mday); 235fb299fa2Sopenharmony_ci time = static_cast<uint16_t>(static_cast<uint16_t>(nowTime.tm_hour) << TM_HOUR_BITS); 236fb299fa2Sopenharmony_ci time |= static_cast<uint16_t>(static_cast<uint16_t>(nowTime.tm_min) << TM_MIN_BITS); 237fb299fa2Sopenharmony_ci time |= static_cast<uint16_t>(static_cast<uint16_t>(nowTime.tm_sec) >> 1); 238fb299fa2Sopenharmony_ci} 239fb299fa2Sopenharmony_ci 240fb299fa2Sopenharmony_ciuint32_t ReadLE32(const uint8_t *buff) 241fb299fa2Sopenharmony_ci{ 242fb299fa2Sopenharmony_ci if (buff == nullptr) { 243fb299fa2Sopenharmony_ci PKG_LOGE("buff is null"); 244fb299fa2Sopenharmony_ci return 0; 245fb299fa2Sopenharmony_ci } 246fb299fa2Sopenharmony_ci size_t offset = 0; 247fb299fa2Sopenharmony_ci uint32_t value32 = buff[0]; 248fb299fa2Sopenharmony_ci offset += BYTE_SIZE; 249fb299fa2Sopenharmony_ci value32 += static_cast<uint32_t>(static_cast<uint32_t>(buff[1]) << offset); 250fb299fa2Sopenharmony_ci offset += BYTE_SIZE; 251fb299fa2Sopenharmony_ci value32 += static_cast<uint32_t>(static_cast<uint32_t>(buff[SECOND_BUFFER]) << offset); 252fb299fa2Sopenharmony_ci offset += BYTE_SIZE; 253fb299fa2Sopenharmony_ci value32 += static_cast<uint32_t>(static_cast<uint32_t>(buff[THIRD_BUFFER]) << offset); 254fb299fa2Sopenharmony_ci return value32; 255fb299fa2Sopenharmony_ci} 256fb299fa2Sopenharmony_ci 257fb299fa2Sopenharmony_ciuint64_t ReadLE64(const uint8_t *buff) 258fb299fa2Sopenharmony_ci{ 259fb299fa2Sopenharmony_ci if (buff == nullptr) { 260fb299fa2Sopenharmony_ci PKG_LOGE("buff is null"); 261fb299fa2Sopenharmony_ci return 0; 262fb299fa2Sopenharmony_ci } 263fb299fa2Sopenharmony_ci uint32_t low = ReadLE32(buff); 264fb299fa2Sopenharmony_ci uint32_t high = ReadLE32(buff + sizeof(uint32_t)); 265fb299fa2Sopenharmony_ci uint64_t value = ((static_cast<uint64_t>(high)) << (BYTE_SIZE * sizeof(uint32_t))) | low; 266fb299fa2Sopenharmony_ci return value; 267fb299fa2Sopenharmony_ci} 268fb299fa2Sopenharmony_ci 269fb299fa2Sopenharmony_civoid WriteLE32(uint8_t *buff, uint32_t value) 270fb299fa2Sopenharmony_ci{ 271fb299fa2Sopenharmony_ci if (buff == nullptr) { 272fb299fa2Sopenharmony_ci PKG_LOGE("buff is null"); 273fb299fa2Sopenharmony_ci return; 274fb299fa2Sopenharmony_ci } 275fb299fa2Sopenharmony_ci size_t offset = 0; 276fb299fa2Sopenharmony_ci buff[0] = static_cast<uint8_t>(value); 277fb299fa2Sopenharmony_ci offset += BYTE_SIZE; 278fb299fa2Sopenharmony_ci buff[1] = static_cast<uint8_t>(value >> offset); 279fb299fa2Sopenharmony_ci offset += BYTE_SIZE; 280fb299fa2Sopenharmony_ci buff[SECOND_BUFFER] = static_cast<uint8_t>(value >> offset); 281fb299fa2Sopenharmony_ci offset += BYTE_SIZE; 282fb299fa2Sopenharmony_ci buff[THIRD_BUFFER] = static_cast<uint8_t>(value >> offset); 283fb299fa2Sopenharmony_ci} 284fb299fa2Sopenharmony_ci 285fb299fa2Sopenharmony_ciuint16_t ReadLE16(const uint8_t *buff) 286fb299fa2Sopenharmony_ci{ 287fb299fa2Sopenharmony_ci if (buff == nullptr) { 288fb299fa2Sopenharmony_ci PKG_LOGE("buff is null"); 289fb299fa2Sopenharmony_ci return 0; 290fb299fa2Sopenharmony_ci } 291fb299fa2Sopenharmony_ci uint16_t value16 = buff[0]; 292fb299fa2Sopenharmony_ci value16 += static_cast<uint16_t>(buff[1] << BYTE_SIZE); 293fb299fa2Sopenharmony_ci return value16; 294fb299fa2Sopenharmony_ci} 295fb299fa2Sopenharmony_ci 296fb299fa2Sopenharmony_civoid WriteLE16(uint8_t *buff, uint16_t value) 297fb299fa2Sopenharmony_ci{ 298fb299fa2Sopenharmony_ci if (buff == nullptr) { 299fb299fa2Sopenharmony_ci PKG_LOGE("buff is null"); 300fb299fa2Sopenharmony_ci return; 301fb299fa2Sopenharmony_ci } 302fb299fa2Sopenharmony_ci buff[0] = static_cast<uint8_t>(value); 303fb299fa2Sopenharmony_ci buff[1] = static_cast<uint8_t>(value >> BYTE_SIZE); 304fb299fa2Sopenharmony_ci} 305fb299fa2Sopenharmony_ci 306fb299fa2Sopenharmony_cistd::string ConvertShaHex(const std::vector<uint8_t> &shaDigest) 307fb299fa2Sopenharmony_ci{ 308fb299fa2Sopenharmony_ci const std::string hexChars = "0123456789abcdef"; 309fb299fa2Sopenharmony_ci std::string haxSha256 = ""; 310fb299fa2Sopenharmony_ci unsigned int c; 311fb299fa2Sopenharmony_ci for (size_t i = 0; i < shaDigest.size(); ++i) { 312fb299fa2Sopenharmony_ci auto d = shaDigest[i]; 313fb299fa2Sopenharmony_ci c = (d >> SHIFT_RIGHT_FOUR_BITS) & 0xf; // last 4 bits 314fb299fa2Sopenharmony_ci haxSha256.push_back(hexChars[c]); 315fb299fa2Sopenharmony_ci haxSha256.push_back(hexChars[d & 0xf]); 316fb299fa2Sopenharmony_ci } 317fb299fa2Sopenharmony_ci return haxSha256; 318fb299fa2Sopenharmony_ci} 319fb299fa2Sopenharmony_ci} // namespace Hpackage 320fb299fa2Sopenharmony_ci 321fb299fa2Sopenharmony_ci#ifdef _WIN32 322fb299fa2Sopenharmony_civoid *mmap([[maybe_unused]] void *addr, [[maybe_unused]] size_t length, 323fb299fa2Sopenharmony_ci [[maybe_unused]] int prot, [[maybe_unused]] int flags, int fd, [[maybe_unused]] size_t offset) 324fb299fa2Sopenharmony_ci{ 325fb299fa2Sopenharmony_ci HANDLE FileHandle = reinterpret_cast<HANDLE>(_get_osfhandle(fd)); 326fb299fa2Sopenharmony_ci if (FileHandle == INVALID_HANDLE_VALUE) { 327fb299fa2Sopenharmony_ci return MAP_FAILED; 328fb299fa2Sopenharmony_ci } 329fb299fa2Sopenharmony_ci HANDLE FileMappingHandle = ::CreateFileMappingW(FileHandle, 0, PAGE_READONLY, 0, 0, 0); 330fb299fa2Sopenharmony_ci if (FileMappingHandle == nullptr) { 331fb299fa2Sopenharmony_ci PKG_LOGE("CreateFileMappingW Failed"); 332fb299fa2Sopenharmony_ci return MAP_FAILED; 333fb299fa2Sopenharmony_ci } 334fb299fa2Sopenharmony_ci void *mapAddr = ::MapViewOfFile(FileMappingHandle, FILE_MAP_READ, 0, 0, 0); 335fb299fa2Sopenharmony_ci if (mapAddr == nullptr) { 336fb299fa2Sopenharmony_ci PKG_LOGE("MapViewOfFile Failed"); 337fb299fa2Sopenharmony_ci ::CloseHandle(FileMappingHandle); 338fb299fa2Sopenharmony_ci return MAP_FAILED; 339fb299fa2Sopenharmony_ci } 340fb299fa2Sopenharmony_ci ::CloseHandle(FileMappingHandle); 341fb299fa2Sopenharmony_ci return mapAddr; 342fb299fa2Sopenharmony_ci} 343fb299fa2Sopenharmony_ci 344fb299fa2Sopenharmony_ciint msync(void *addr, size_t len, [[maybe_unused]] int flags) 345fb299fa2Sopenharmony_ci{ 346fb299fa2Sopenharmony_ci return FlushViewOfFile(addr, len); 347fb299fa2Sopenharmony_ci} 348fb299fa2Sopenharmony_ci 349fb299fa2Sopenharmony_ciint munmap(void *addr, [[maybe_unused]] size_t len) 350fb299fa2Sopenharmony_ci{ 351fb299fa2Sopenharmony_ci return !UnmapViewOfFile(addr); 352fb299fa2Sopenharmony_ci} 353fb299fa2Sopenharmony_ci#endif 354