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