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