165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "SharedMemory.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentDecoder.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentEncoder.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/RefPtr.h>
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochSharedMemory::Handle::Handle()
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_handle(0)
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_size(0)
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochSharedMemory::Handle::~Handle()
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_handle)
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::CloseHandle(m_handle);
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool SharedMemory::Handle::isNull() const
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return !m_handle;
522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid SharedMemory::Handle::encode(CoreIPC::ArgumentEncoder* encoder) const
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    encoder->encodeUInt64(m_size);
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Hand off ownership of our HANDLE to the receiving process. It will close it for us.
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: If the receiving process crashes before it receives the memory, the memory will be
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // leaked. See <http://webkit.org/b/47502>.
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    encoder->encodeUInt64(reinterpret_cast<uint64_t>(m_handle));
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_handle = 0;
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Send along our PID so that the receiving process can duplicate the HANDLE for its own use.
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    encoder->encodeUInt32(::GetCurrentProcessId());
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
682fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic bool getDuplicatedHandle(HANDLE sourceHandle, DWORD sourcePID, HANDLE& duplicatedHandle)
692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    duplicatedHandle = 0;
712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!sourceHandle)
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    HANDLE sourceProcess = ::OpenProcess(PROCESS_DUP_HANDLE, FALSE, sourcePID);
752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!sourceProcess)
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Copy the handle into our process and close the handle that the sending process created for us.
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    BOOL success = ::DuplicateHandle(sourceProcess, sourceHandle, ::GetCurrentProcess(), &duplicatedHandle, 0, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_WITH_MESSAGE(success, "::DuplicateHandle failed with error %lu", ::GetLastError());
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ::CloseHandle(sourceProcess);
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return success;
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool SharedMemory::Handle::decode(CoreIPC::ArgumentDecoder* decoder, Handle& handle)
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_ARG(handle, !handle.m_handle);
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_ARG(handle, !handle.m_size);
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t size;
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!decoder->decodeUInt64(size))
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t sourceHandle;
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!decoder->decodeUInt64(sourceHandle))
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint32_t sourcePID;
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!decoder->decodeUInt32(sourcePID))
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HANDLE duplicatedHandle;
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!getDuplicatedHandle(reinterpret_cast<HANDLE>(sourceHandle), sourcePID, duplicatedHandle))
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handle.m_handle = duplicatedHandle;
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handle.m_size = size;
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<SharedMemory> SharedMemory::create(size_t size)
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HANDLE handle = ::CreateFileMappingW(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, 0);
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!handle)
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void* baseAddress = ::MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, size);
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!baseAddress) {
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::CloseHandle(handle);
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<SharedMemory> memory = adoptRef(new SharedMemory);
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memory->m_size = size;
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memory->m_data = baseAddress;
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memory->m_handle = handle;
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return memory.release();
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic DWORD accessRights(SharedMemory::Protection protection)
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (protection) {
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case SharedMemory::ReadOnly:
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return FILE_MAP_READ;
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case SharedMemory::ReadWrite:
1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return FILE_MAP_READ | FILE_MAP_WRITE;
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<SharedMemory> SharedMemory::create(const Handle& handle, Protection protection)
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<SharedMemory> memory = adopt(handle.m_handle, handle.m_size, protection);
1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!memory)
1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0;
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // The SharedMemory object now owns the HANDLE.
1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    handle.m_handle = 0;
1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return memory.release();
1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassRefPtr<SharedMemory> SharedMemory::adopt(HANDLE handle, size_t size, Protection protection)
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!handle)
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 0;
1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DWORD desiredAccess = accessRights(protection);
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void* baseAddress = ::MapViewOfFile(handle, desiredAccess, 0, 0, size);
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT_WITH_MESSAGE(baseAddress, "::MapViewOfFile failed with error %lu", ::GetLastError());
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!baseAddress)
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<SharedMemory> memory = adoptRef(new SharedMemory);
1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    memory->m_size = size;
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memory->m_data = baseAddress;
1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    memory->m_handle = handle;
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return memory.release();
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochSharedMemory::~SharedMemory()
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_data);
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_handle);
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::UnmapViewOfFile(m_data);
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::CloseHandle(m_handle);
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool SharedMemory::createHandle(Handle& handle, Protection protection)
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_ARG(handle, !handle.m_handle);
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_ARG(handle, !handle.m_size);
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HANDLE processHandle = ::GetCurrentProcess();
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HANDLE duplicatedHandle;
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!::DuplicateHandle(processHandle, m_handle, processHandle, &duplicatedHandle, accessRights(protection), FALSE, 0))
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handle.m_handle = duplicatedHandle;
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    handle.m_size = m_size;
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochunsigned SharedMemory::systemPageSize()
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static unsigned pageSize = 0;
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!pageSize) {
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        SYSTEM_INFO systemInfo;
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::GetSystemInfo(&systemInfo);
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pageSize = systemInfo.dwPageSize;
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return pageSize;
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
217