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