15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <io.h> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/metrics/sparse_histogram.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ClosePlatformFile(PlatformFile file) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (CloseHandle(file) != 0); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 SeekPlatformFile(PlatformFile file, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformFileWhence whence, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 offset) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 25c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (file == kInvalidPlatformFileValue || offset < 0) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LARGE_INTEGER distance, res; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) distance.QuadPart = offset; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD move_method = static_cast<DWORD>(whence); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SetFilePointerEx(file, distance, &res, move_method)) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return res.QuadPart; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ReadPlatformFile(PlatformFile file, int64 offset, char* data, int size) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (file == kInvalidPlatformFileValue || size < 0) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LARGE_INTEGER offset_li; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_li.QuadPart = offset; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERLAPPED overlapped = {0}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlapped.Offset = offset_li.LowPart; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlapped.OffsetHigh = offset_li.HighPart; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD bytes_read; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (::ReadFile(file, data, size, &bytes_read, &overlapped) != 0) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bytes_read; 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ERROR_HANDLE_EOF == GetLastError()) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ReadPlatformFileAtCurrentPos(PlatformFile file, char* data, int size) { 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (file == kInvalidPlatformFileValue || size < 0) 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return -1; 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DWORD bytes_read; 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (::ReadFile(file, data, size, &bytes_read, NULL) != 0) 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return bytes_read; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ERROR_HANDLE_EOF == GetLastError()) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return 0; 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return -1; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ReadPlatformFileNoBestEffort(PlatformFile file, int64 offset, char* data, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ReadPlatformFile(file, offset, data, size); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ReadPlatformFileCurPosNoBestEffort(PlatformFile file, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* data, int size) { 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ReadPlatformFileAtCurrentPos(file, data, size); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WritePlatformFile(PlatformFile file, int64 offset, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data, int size) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file == kInvalidPlatformFileValue) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LARGE_INTEGER offset_li; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_li.QuadPart = offset; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERLAPPED overlapped = {0}; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlapped.Offset = offset_li.LowPart; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlapped.OffsetHigh = offset_li.HighPart; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD bytes_written; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (::WriteFile(file, data, size, &bytes_written, &overlapped) != 0) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bytes_written; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WritePlatformFileAtCurrentPos(PlatformFile file, const char* data, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WritePlatformFile(file, 0, data, size); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WritePlatformFileCurPosNoBestEffort(PlatformFile file, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data, int size) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WritePlatformFile(file, 0, data, size); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TruncatePlatformFile(PlatformFile file, int64 length) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file == kInvalidPlatformFileValue) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the current file pointer. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LARGE_INTEGER file_pointer; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LARGE_INTEGER zero; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zero.QuadPart = 0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (::SetFilePointerEx(file, zero, &file_pointer, FILE_CURRENT) == 0) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LARGE_INTEGER length_li; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length_li.QuadPart = length; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If length > file size, SetFilePointerEx() should extend the file 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with zeroes on all Windows standard file systems (NTFS, FATxx). 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!::SetFilePointerEx(file, length_li, NULL, FILE_BEGIN)) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the new file length and move the file pointer to its old position. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is consistent with ftruncate()'s behavior, even when the file 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer points to a location beyond the end of the file. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((::SetEndOfFile(file) != 0) && 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (::SetFilePointerEx(file, file_pointer, NULL, FILE_BEGIN) != 0)); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FlushPlatformFile(PlatformFile file) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((file != kInvalidPlatformFileValue) && ::FlushFileBuffers(file)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TouchPlatformFile(PlatformFile file, const base::Time& last_access_time, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& last_modified_time) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (file == kInvalidPlatformFileValue) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILETIME last_access_filetime = last_access_time.ToFileTime(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILETIME last_modified_filetime = last_modified_time.ToFileTime(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (::SetFileTime(file, NULL, &last_access_filetime, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &last_modified_filetime) != 0); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetPlatformFileInfo(PlatformFile file, PlatformFileInfo* info) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::AssertIOAllowed(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!info) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BY_HANDLE_FILE_INFORMATION file_info; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFileInformationByHandle(file, &file_info) == 0) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LARGE_INTEGER size; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.HighPart = file_info.nFileSizeHigh; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.LowPart = file_info.nFileSizeLow; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->size = size.QuadPart; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->is_directory = 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->is_symbolic_link = false; // Windows doesn't have symbolic links. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->last_modified = base::Time::FromFileTime(file_info.ftLastWriteTime); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->last_accessed = base::Time::FromFileTime(file_info.ftLastAccessTime); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->creation_time = base::Time::FromFileTime(file_info.ftCreationTime); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)PlatformFileError LockPlatformFile(PlatformFile file) { 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BOOL result = LockFile(file, 0, 0, MAXDWORD, MAXDWORD); 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!result) 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return LastErrorToPlatformFileError(GetLastError()); 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return PLATFORM_FILE_OK; 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)PlatformFileError UnlockPlatformFile(PlatformFile file) { 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BOOL result = UnlockFile(file, 0, 0, MAXDWORD, MAXDWORD); 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!result) 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return LastErrorToPlatformFileError(GetLastError()); 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return PLATFORM_FILE_OK; 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)PlatformFileError LastErrorToPlatformFileError(DWORD last_error) { 191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) switch (last_error) { 192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_SHARING_VIOLATION: 193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_IN_USE; 194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_FILE_EXISTS: 195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_EXISTS; 196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_FILE_NOT_FOUND: 197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_PATH_NOT_FOUND: 198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_NOT_FOUND; 199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_ACCESS_DENIED: 200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_ACCESS_DENIED; 201b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_TOO_MANY_OPEN_FILES: 202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_TOO_MANY_OPENED; 203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_OUTOFMEMORY: 204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_NOT_ENOUGH_MEMORY: 205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_NO_MEMORY; 206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_HANDLE_DISK_FULL: 207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_DISK_FULL: 208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_DISK_RESOURCES_EXHAUSTED: 209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_NO_SPACE; 210b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_USER_MAPPED_FILE: 211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_INVALID_OPERATION; 212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_NOT_READY: 213b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_SECTOR_NOT_FOUND: 214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_DEV_NOT_EXIST: 215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_IO_DEVICE: 216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_FILE_CORRUPT: 217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case ERROR_DISK_CORRUPT: 218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_IO; 219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) default: 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UMA_HISTOGRAM_SPARSE_SLOWLY("PlatformFile.UnknownErrors.Windows", 221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) last_error); 222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return PLATFORM_FILE_ERROR_FAILED; 223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 227