VirtualBox

source: vbox/trunk/src/VBox/Runtime/nt/fileioutils-nt.cpp@ 76843

Last change on this file since 76843 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.5 KB
Line 
1/* $Id: fileioutils-nt.cpp 76553 2019-01-01 01:45:53Z vboxsync $ */
2/** @file
3 * IPRT - File I/O, common NT helpers.
4 */
5
6/*
7 * Copyright (C) 2006-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/nt/nt.h>
32#include "internal/iprt.h"
33
34#include <iprt/errcore.h>
35#include "internal/file.h"
36
37
38
39/**
40 * Helper for converting RTFILE_O_XXX to the various NtCreateFile flags.
41 *
42 * @returns IPRT status code
43 * @param fOpen The RTFILE_O_XXX flags to convert.
44 * @param pfDesiredAccess Where to return the desired access mask.
45 * @param pfObjAttribs Where to return the NT object attributes.
46 * @param pfFileAttribs Where to return the file attributes (create).
47 * @param pfShareAccess Where to return the file sharing access mask.
48 * @param pfCreateDisposition Where to return the file create disposition.
49 * @param pfCreateOptions Where to return the file open/create options.
50 */
51DECLHIDDEN(int) rtFileNtValidateAndConvertFlags(uint64_t fOpen, uint32_t *pfDesiredAccess, uint32_t *pfObjAttribs,
52 uint32_t *pfFileAttribs, uint32_t *pfShareAccess, uint32_t *pfCreateDisposition,
53 uint32_t *pfCreateOptions)
54{
55 /*
56 * Merge forced open flags and validate them.
57 */
58 int rc = rtFileRecalcAndValidateFlags(&fOpen);
59 if (RT_FAILURE(rc))
60 return rc;
61
62 /*
63 * Determine disposition, access, share mode, creation flags, and security attributes
64 * for the CreateFile API call.
65 */
66 ULONG fCreateDisposition;
67 switch (fOpen & RTFILE_O_ACTION_MASK)
68 {
69 case RTFILE_O_OPEN:
70 fCreateDisposition = fOpen & RTFILE_O_TRUNCATE ? FILE_OVERWRITE : FILE_OPEN;
71 break;
72 case RTFILE_O_OPEN_CREATE:
73 fCreateDisposition = FILE_OPEN_IF;
74 break;
75 case RTFILE_O_CREATE:
76 fCreateDisposition = FILE_CREATE;
77 break;
78 case RTFILE_O_CREATE_REPLACE:
79 fCreateDisposition = FILE_SUPERSEDE;
80 break;
81 default:
82 AssertMsgFailed(("Impossible fOpen=%#llx\n", fOpen));
83 return VERR_INVALID_PARAMETER;
84 }
85
86 ACCESS_MASK fDesiredAccess;
87 switch (fOpen & RTFILE_O_ACCESS_MASK)
88 {
89 case RTFILE_O_READ:
90 fDesiredAccess = FILE_GENERIC_READ; /* RTFILE_O_APPEND is ignored. */
91 break;
92 case RTFILE_O_WRITE:
93 fDesiredAccess = fOpen & RTFILE_O_APPEND
94 ? FILE_GENERIC_WRITE & ~FILE_WRITE_DATA
95 : FILE_GENERIC_WRITE;
96 break;
97 case RTFILE_O_READWRITE:
98 fDesiredAccess = fOpen & RTFILE_O_APPEND
99 ? FILE_GENERIC_READ | (FILE_GENERIC_WRITE & ~FILE_WRITE_DATA)
100 : FILE_GENERIC_READ | FILE_GENERIC_WRITE;
101 break;
102 case RTFILE_O_ATTR_ONLY:
103 if (fOpen & RTFILE_O_ACCESS_ATTR_MASK)
104 {
105 fDesiredAccess = 0;
106 break;
107 }
108 RT_FALL_THRU();
109 default:
110 AssertMsgFailed(("Impossible fOpen=%#llx\n", fOpen));
111 return VERR_INVALID_PARAMETER;
112 }
113 if (fCreateDisposition == FILE_OVERWRITE)
114 /* Required for truncating the file (see MSDN), it is *NOT* part of FILE_GENERIC_WRITE. */
115 fDesiredAccess |= GENERIC_WRITE;
116
117 /* RTFileSetMode needs following rights as well. */
118 switch (fOpen & RTFILE_O_ACCESS_ATTR_MASK)
119 {
120 case RTFILE_O_ACCESS_ATTR_READ: fDesiredAccess |= FILE_READ_ATTRIBUTES | SYNCHRONIZE; break;
121 case RTFILE_O_ACCESS_ATTR_WRITE: fDesiredAccess |= FILE_WRITE_ATTRIBUTES | SYNCHRONIZE; break;
122 case RTFILE_O_ACCESS_ATTR_READWRITE: fDesiredAccess |= FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE; break;
123 default:
124 /* Attributes access is the same as the file access. */
125 switch (fOpen & RTFILE_O_ACCESS_MASK)
126 {
127 case RTFILE_O_READ: fDesiredAccess |= FILE_READ_ATTRIBUTES | SYNCHRONIZE; break;
128 case RTFILE_O_WRITE: fDesiredAccess |= FILE_WRITE_ATTRIBUTES | SYNCHRONIZE; break;
129 case RTFILE_O_READWRITE: fDesiredAccess |= FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE; break;
130 default:
131 AssertMsgFailed(("Impossible fOpen=%#llx\n", fOpen));
132 return VERR_INVALID_PARAMETER;
133 }
134 }
135
136 ULONG fShareAccess;
137 switch (fOpen & RTFILE_O_DENY_MASK)
138 {
139 case RTFILE_O_DENY_NONE: fShareAccess = FILE_SHARE_READ | FILE_SHARE_WRITE; break;
140 case RTFILE_O_DENY_READ: fShareAccess = FILE_SHARE_WRITE; break;
141 case RTFILE_O_DENY_WRITE: fShareAccess = FILE_SHARE_READ; break;
142 case RTFILE_O_DENY_READWRITE: fShareAccess = 0; break;
143
144 case RTFILE_O_DENY_NOT_DELETE: fShareAccess = FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE; break;
145 case RTFILE_O_DENY_NOT_DELETE | RTFILE_O_DENY_READ: fShareAccess = FILE_SHARE_DELETE | FILE_SHARE_WRITE; break;
146 case RTFILE_O_DENY_NOT_DELETE | RTFILE_O_DENY_WRITE: fShareAccess = FILE_SHARE_DELETE | FILE_SHARE_READ; break;
147 case RTFILE_O_DENY_NOT_DELETE | RTFILE_O_DENY_READWRITE:fShareAccess = FILE_SHARE_DELETE; break;
148 default:
149 AssertMsgFailed(("Impossible fOpen=%#llx\n", fOpen));
150 return VERR_INVALID_PARAMETER;
151 }
152
153 ULONG fObjAttribs = 0;
154 if (fOpen & RTFILE_O_INHERIT)
155 fObjAttribs = OBJ_INHERIT;
156
157 ULONG fCreateOptions = FILE_NON_DIRECTORY_FILE;
158 if (fOpen & RTFILE_O_WRITE_THROUGH)
159 fCreateOptions |= FILE_WRITE_THROUGH;
160 if (!(fOpen & RTFILE_O_ASYNC_IO))
161 fCreateOptions |= FILE_SYNCHRONOUS_IO_NONALERT;
162 if (fOpen & RTFILE_O_NO_CACHE)
163 {
164 fCreateOptions |= FILE_NO_INTERMEDIATE_BUFFERING;
165 fDesiredAccess &= ~FILE_APPEND_DATA;
166 }
167
168 /*
169 * Done.
170 */
171 *pfDesiredAccess = fDesiredAccess;
172 *pfObjAttribs = fObjAttribs;
173 *pfFileAttribs = FILE_ATTRIBUTE_NORMAL;
174 *pfShareAccess = fShareAccess;
175 *pfCreateDisposition = fCreateDisposition;
176 *pfCreateOptions = fCreateOptions;
177 return VINF_SUCCESS;
178}
179
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette