fileio-win.cpp revision 7dd2a985bc9a50a60cadc4b77aec248d113676c8
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * IPRT - File I/O, native implementation for the Windows host platform.
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * available from http://www.virtualbox.org. This file is free software;
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * you can redistribute it and/or modify it under the terms of the GNU
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * General Public License (GPL) as published by the Free Software
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * The contents of this file may alternatively be used under the terms
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * of the Common Development and Distribution License Version 1.0
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * VirtualBox OSE distribution, in which case the provisions of the
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * CDDL are applicable instead of those of the GPL.
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * You may elect to license modified versions of this file under the
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * terms and conditions of either the GPL or the CDDL or both.
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * additional information or have any questions.
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync/*******************************************************************************
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync* Header Files *
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync*******************************************************************************/
e04781b223e38e3b0c386d7e7c1dd7f30e9f6e90vboxsync/*******************************************************************************
e04781b223e38e3b0c386d7e7c1dd7f30e9f6e90vboxsync* Defined Constants And Macros *
e04781b223e38e3b0c386d7e7c1dd7f30e9f6e90vboxsync*******************************************************************************/
e04781b223e38e3b0c386d7e7c1dd7f30e9f6e90vboxsync/** @def RT_DONT_CONVERT_FILENAMES
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * Define this to pass UTF-8 unconverted to the kernel. */
e04781b223e38e3b0c386d7e7c1dd7f30e9f6e90vboxsync * This is wrapper around the ugly SetFilePointer api.
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * It's equivalent to SetFilePointerEx which we so unfortunately cannot use because of
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * it not being present in NT4 GA.
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * @returns Success indicator. Extended error information obtainable using GetLastError().
97b634ea021fd984782256de4ba4ff31cdb96c47vboxsync * @param File Filehandle.
DECLINLINE(bool) MySetFilePointer(RTFILE File, uint64_t offSeek, uint64_t *poffNew, unsigned uMethod)
bool fRc;
return fRc;
bool fIsBeyondLimit = false;
/** @todo r=bird: I'd be very interested to know on which versions of windows and on which file systems
return fIsBeyondLimit;
if ( h == INVALID_HANDLE_VALUE
return VERR_INVALID_HANDLE;
return VINF_SUCCESS;
if (!pFile)
return VERR_INVALID_PARAMETER;
if (!pszFilename)
return VERR_INVALID_PARAMETER;
return rc;
case RTFILE_O_OPEN:
case RTFILE_O_OPEN_CREATE:
case RTFILE_O_CREATE:
case RTFILE_O_CREATE_REPLACE:
return VERR_INVALID_PARAMETER;
case RTFILE_O_READ:
case RTFILE_O_WRITE:
case RTFILE_O_READWRITE:
return VERR_INVALID_PARAMETER;
case RTFILE_O_ACCESS_ATTR_READWRITE: dwDesiredAccess |= FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE; break;
case RTFILE_O_READWRITE: dwDesiredAccess |= FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE; break;
return VERR_INVALID_PARAMETER;
case RTFILE_O_DENY_NOT_DELETE | RTFILE_O_DENY_NONE: dwShareMode = FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE; break;
case RTFILE_O_DENY_NOT_DELETE | RTFILE_O_DENY_READ: dwShareMode = FILE_SHARE_DELETE | FILE_SHARE_WRITE; break;
case RTFILE_O_DENY_NOT_DELETE | RTFILE_O_DENY_WRITE: dwShareMode = FILE_SHARE_DELETE | FILE_SHARE_READ; break;
return VERR_INVALID_PARAMETER;
#ifdef RT_DONT_CONVERT_FILENAMES
NULL);
return rc;
NULL);
if ( fCreated
#ifdef RT_DONT_CONVERT_FILENAMES
else if ( !fCreated
#ifndef RT_DONT_CONVERT_FILENAMES
return VINF_SUCCESS;
#ifndef RT_DONT_CONVERT_FILENAMES
return rc;
return VINF_SUCCESS;
return VERR_INVALID_PARAMETER;
return VINF_SUCCESS;
if (cbToRead <= 0)
return VINF_SUCCESS;
if (pcbRead)
if (cbReadPart == 0)
return VERR_EOF;
return VINF_SUCCESS;
if (cbToWrite <= 0)
return VINF_SUCCESS;
if (pcbWritten)
if (!WriteFile((HANDLE)File, (char*)pvBuf + cbWritten, cbToWriteAdj - cbWritten, &cbWrittenPart, NULL))
return rc;
if (cbWrittenPart == 0)
return VERR_WRITE_ERROR;
return VINF_SUCCESS;
return rc;
int rc;
return VINF_SUCCESS;
int rc;
return VINF_SUCCESS;
return VINF_SUCCESS;
return VERR_NOT_IMPLEMENTED;
switch (dwType)
case FILE_TYPE_CHAR:
case FILE_TYPE_DISK:
case FILE_TYPE_PIPE:
case FILE_TYPE_REMOTE:
case FILE_TYPE_UNKNOWN:
return VERR_INVALID_PARAMETER;
return VINF_SUCCESS;
return VERR_INVALID_PARAMETER;
return rc;
return rc;
unsigned fLockOld = (fLock & RTFILE_LOCK_WRITE) ? fLock & ~RTFILE_LOCK_WRITE : fLock | RTFILE_LOCK_WRITE;
return VERR_FILE_LOCK_VIOLATION;
return VERR_FILE_LOCK_LOST;
if (UnlockFile((HANDLE)File, LOW_DWORD(offLock), HIGH_DWORD(offLock), LOW_DWORD(cbLock), HIGH_DWORD(cbLock)))
return VINF_SUCCESS;
RTR3DECL(int) RTFileQueryInfo(RTFILE File, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs)
return VERR_INVALID_PARAMETER;
if (!pObjInfo)
return VERR_INVALID_PARAMETER;
return VERR_INVALID_PARAMETER;
pObjInfo->Attr.fMode = rtFsModeFromDos((Data.dwFileAttributes << RTFS_DOS_SHIFT) & RTFS_DOS_MASK_NT, "", 0);
switch (enmAdditionalAttribs)
case RTFSOBJATTRADD_EASIZE:
case RTFSOBJATTRADD_UNIX:
pObjInfo->Attr.u.Unix.INodeIdDevice = 0; /** @todo Use the volume serial number (see GetFileInformationByHandle). */
case RTFSOBJATTRADD_NOTHING:
return VERR_INTERNAL_ERROR;
return VINF_SUCCESS;
if (pBirthTime)
if (pAccessTime)
if (pModificationTime)
return rc;
return VERR_INVALID_PARAMETER;
Log(("RTFileSetMode(%RTfile, %RTfmode): rtFileNativeSetAttributes (0x%08X) failed with err %d (%Rrc)\n",
return rc;
return VINF_SUCCESS;
return VERR_NOT_SUPPORTED;
#ifdef RT_DONT_CONVERT_FILENAMES
return VINF_SUCCESS;
return rc;
AssertMsgReturn(!(fRename & ~RTPATHRENAME_FLAGS_REPLACE), ("%#x\n", fRename), VERR_INVALID_PARAMETER);
return rc;
return rc;