VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/SharedFolders/driver/vbsf.h@ 78584

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

winnt/vboxsf: Use CcCoherencyFlushAndPurgeCache before writes and reads to ensure mmap coherency. This makes the FsPerf mmap tests happy, however the KPI is only available on windows 7 and later, so we'll have to skip this mmap test aspect on older systems, I fear. bugref:9172

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.5 KB
Line 
1/* $Id: vbsf.h 78584 2019-05-18 21:07:57Z vboxsync $ */
2/** @file
3 * VirtualBox Windows Guest Shared Folders - File System Driver header file
4 */
5
6/*
7 * Copyright (C) 2012-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
18#ifndef GA_INCLUDED_SRC_WINNT_SharedFolders_driver_vbsf_h
19#define GA_INCLUDED_SRC_WINNT_SharedFolders_driver_vbsf_h
20#ifndef RT_WITHOUT_PRAGMA_ONCE
21# pragma once
22#endif
23
24
25/*
26 * This must be defined before including RX headers.
27 */
28#define MINIRDR__NAME VBoxMRx
29#define ___MINIRDR_IMPORTS_NAME (VBoxMRxDeviceObject->RdbssExports)
30
31/*
32 * System and RX headers.
33 */
34#include <iprt/nt/nt.h> /* includes ntifs.h + wdm.h */
35#include <iprt/win/windef.h>
36#ifndef INVALID_HANDLE_VALUE
37# define INVALID_HANDLE_VALUE RTNT_INVALID_HANDLE_VALUE /* (The rx.h definition causes warnings for amd64) */
38#endif
39#include <iprt/nt/rx.h>
40
41/*
42 * VBox shared folders.
43 */
44#include "vbsfshared.h"
45#include <VBox/log.h>
46#include <VBox/VBoxGuestLibSharedFolders.h>
47#ifdef __cplusplus /* not for Win2kWorkarounds.c */
48# include <VBox/VBoxGuestLibSharedFoldersInline.h>
49#endif
50
51
52RT_C_DECLS_BEGIN
53
54/*
55 * Global data.
56 */
57extern PRDBSS_DEVICE_OBJECT VBoxMRxDeviceObject;
58extern uint32_t g_uSfLastFunction;
59/** Pointer to the CcCoherencyFlushAndPurgeCache API (since win 7). */
60typedef VOID (NTAPI *PFNCCCOHERENCYFLUSHANDPURGECACHE)(PSECTION_OBJECT_POINTERS, PLARGE_INTEGER, ULONG, PIO_STATUS_BLOCK,ULONG);
61extern PFNCCCOHERENCYFLUSHANDPURGECACHE g_pfnCcCoherencyFlushAndPurgeCache;
62#ifndef CC_FLUSH_AND_PURGE_NO_PURGE
63# define CC_FLUSH_AND_PURGE_NO_PURGE 1
64#endif
65
66
67/**
68 * Maximum drive letters (A - Z).
69 */
70#define _MRX_MAX_DRIVE_LETTERS 26
71
72/**
73 * The shared folders device extension.
74 */
75typedef struct _MRX_VBOX_DEVICE_EXTENSION
76{
77 /** The shared folders device object pointer. */
78 PRDBSS_DEVICE_OBJECT pDeviceObject;
79
80 /**
81 * Keep a list of local connections used.
82 * The size (_MRX_MAX_DRIVE_LETTERS = 26) of the array presents the available drive letters C: - Z: of Windows.
83 */
84 CHAR cLocalConnections[_MRX_MAX_DRIVE_LETTERS];
85 PUNICODE_STRING wszLocalConnectionName[_MRX_MAX_DRIVE_LETTERS];
86 FAST_MUTEX mtxLocalCon;
87
88 /** Saved pointer to the original IRP_MJ_DEVICE_CONTROL handler. */
89 NTSTATUS (* pfnRDBSSDeviceControl) (PDEVICE_OBJECT pDevObj, PIRP pIrp);
90 /** Saved pointer to the original IRP_MJ_CREATE handler. */
91 NTSTATUS (NTAPI * pfnRDBSSCreate)(PDEVICE_OBJECT pDevObj, PIRP pIrp);
92 /** Saved pointer to the original IRP_MJ_SET_INFORMATION handler. */
93 NTSTATUS (NTAPI * pfnRDBSSSetInformation)(PDEVICE_OBJECT pDevObj, PIRP pIrp);
94
95} MRX_VBOX_DEVICE_EXTENSION, *PMRX_VBOX_DEVICE_EXTENSION;
96
97/**
98 * The shared folders NET_ROOT extension.
99 */
100typedef struct _MRX_VBOX_NETROOT_EXTENSION
101{
102 /** The shared folder map handle of this netroot. */
103 VBGLSFMAP map;
104 /** Simple initialized (mapped folder) indicator that works better with the
105 * zero filled defaults than SHFL_ROOT_NIL. */
106 bool fInitialized;
107} MRX_VBOX_NETROOT_EXTENSION, *PMRX_VBOX_NETROOT_EXTENSION;
108
109
110/** Pointer to the VBox file object extension data. */
111typedef struct MRX_VBOX_FOBX *PMRX_VBOX_FOBX;
112
113/**
114 * VBox extension data to the file control block (FCB).
115 *
116 * @note To unix people, think of the FCB as the inode structure. This is our
117 * private addition to the inode info.
118 */
119typedef struct VBSFNTFCBEXT
120{
121 /** @name Pointers to file object extensions currently sitting on the given timestamps.
122 *
123 * The file object extensions pointed to have disabled implicit updating the
124 * respective timestamp due to a FileBasicInformation set request. Should these
125 * timestamps be modified via any other file handle, these pointers will be
126 * updated or set to NULL to reflect this. So, when the cleaning up a file
127 * object it can be more accurately determined whether to restore timestamps on
128 * non-windows host systems or not.
129 *
130 * @{ */
131 PMRX_VBOX_FOBX pFobxLastAccessTime;
132 PMRX_VBOX_FOBX pFobxLastWriteTime;
133 PMRX_VBOX_FOBX pFobxChangeTime;
134 /** @} */
135
136 /** @name Cached volume info.
137 * @{ */
138 /** The RTTimeSystemNanoTS value when VolInfo was retrieved, 0 to force update. */
139 uint64_t volatile nsVolInfoUpToDate;
140 /** Volume information. */
141 SHFLVOLINFO volatile VolInfo;
142 /** @} */
143} VBSFNTFCBEXT;
144/** Pointer to the VBox FCB extension data. */
145typedef VBSFNTFCBEXT *PVBSFNTFCBEXT;
146
147
148/** @name VBOX_FOBX_F_INFO_XXX
149 * @{ */
150#define VBOX_FOBX_F_INFO_LASTACCESS_TIME UINT8_C(0x01)
151#define VBOX_FOBX_F_INFO_LASTWRITE_TIME UINT8_C(0x02)
152#define VBOX_FOBX_F_INFO_CHANGE_TIME UINT8_C(0x04)
153/** @} */
154
155/**
156 * The shared folders file extension.
157 */
158typedef struct MRX_VBOX_FOBX
159{
160 /** The host file handle. */
161 SHFLHANDLE hFile;
162 PMRX_SRV_CALL pSrvCall;
163 /** The RTTimeSystemNanoTS value when Info was retrieved, 0 to force update. */
164 uint64_t nsUpToDate;
165 /** Cached object info.
166 * @todo Consider moving it to VBSFNTFCBEXT. Better fit than on "handle". */
167 SHFLFSOBJINFO Info;
168
169 /** VBOX_FOBX_F_INFO_XXX of timestamps which may need setting on close. */
170 uint8_t fTimestampsSetByUser;
171 /** VBOX_FOBX_F_INFO_XXX of timestamps which implicit updating is suppressed. */
172 uint8_t fTimestampsUpdatingSuppressed;
173 /** VBOX_FOBX_F_INFO_XXX of timestamps which may have implicitly update. */
174 uint8_t fTimestampsImplicitlyUpdated;
175} MRX_VBOX_FOBX;
176
177#define VBoxMRxGetDeviceExtension(RxContext) \
178 ((PMRX_VBOX_DEVICE_EXTENSION)((PBYTE)(RxContext)->RxDeviceObject + sizeof(RDBSS_DEVICE_OBJECT)))
179
180#define VBoxMRxGetNetRootExtension(pNetRoot) ((pNetRoot) != NULL ? (PMRX_VBOX_NETROOT_EXTENSION)(pNetRoot)->Context : NULL)
181
182#define VBoxMRxGetFcbExtension(pFcb) ((pFcb) != NULL ? (PVBSFNTFCBEXT)(pFcb)->Context : NULL)
183
184#define VBoxMRxGetSrvOpenExtension(pSrvOpen) ((pSrvOpen) != NULL ? (PMRX_VBOX_SRV_OPEN)(pSrvOpen)->Context : NULL)
185
186#define VBoxMRxGetFileObjectExtension(pFobx) ((pFobx) != NULL ? (PMRX_VBOX_FOBX)(pFobx)->Context : NULL)
187
188/** HACK ALERT: Special Create.ShareAccess indicating trailing slash for
189 * non-directory IRP_MJ_CREATE request.
190 * Set by VBoxHookMjCreate, used by VBoxMRxCreate. */
191#define VBOX_MJ_CREATE_SLASH_HACK UINT16_C(0x0400)
192
193/** @name Prototypes for the dispatch table routines.
194 * @{
195 */
196NTSTATUS VBoxMRxStart(IN OUT struct _RX_CONTEXT * RxContext,
197 IN OUT PRDBSS_DEVICE_OBJECT RxDeviceObject);
198NTSTATUS VBoxMRxStop(IN OUT struct _RX_CONTEXT * RxContext,
199 IN OUT PRDBSS_DEVICE_OBJECT RxDeviceObject);
200
201NTSTATUS VBoxMRxCreate(IN OUT PRX_CONTEXT RxContext);
202NTSTATUS VBoxMRxCollapseOpen(IN OUT PRX_CONTEXT RxContext);
203NTSTATUS VBoxMRxShouldTryToCollapseThisOpen(IN OUT PRX_CONTEXT RxContext);
204NTSTATUS VBoxMRxFlush(IN OUT PRX_CONTEXT RxContext);
205NTSTATUS VBoxMRxTruncate(IN OUT PRX_CONTEXT RxContext);
206NTSTATUS VBoxMRxCleanupFobx(IN OUT PRX_CONTEXT RxContext);
207NTSTATUS VBoxMRxCloseSrvOpen(IN OUT PRX_CONTEXT RxContext);
208NTSTATUS VBoxMRxDeallocateForFcb(IN OUT PMRX_FCB pFcb);
209NTSTATUS VBoxMRxDeallocateForFobx(IN OUT PMRX_FOBX pFobx);
210NTSTATUS VBoxMRxForceClosed(IN OUT PMRX_SRV_OPEN SrvOpen);
211
212NTSTATUS VBoxMRxQueryDirectory(IN OUT PRX_CONTEXT RxContext);
213NTSTATUS VBoxMRxQueryFileInfo(IN OUT PRX_CONTEXT RxContext);
214NTSTATUS VBoxMRxSetFileInfo(IN OUT PRX_CONTEXT RxContext);
215NTSTATUS VBoxMRxSetFileInfoAtCleanup(IN OUT PRX_CONTEXT RxContext);
216NTSTATUS VBoxMRxQueryEaInfo(IN OUT PRX_CONTEXT RxContext);
217NTSTATUS VBoxMRxSetEaInfo(IN OUT struct _RX_CONTEXT * RxContext);
218NTSTATUS VBoxMRxQuerySdInfo(IN OUT PRX_CONTEXT RxContext);
219NTSTATUS VBoxMRxSetSdInfo(IN OUT struct _RX_CONTEXT * RxContext);
220NTSTATUS VBoxMRxQueryVolumeInfo(IN OUT PRX_CONTEXT RxContext);
221
222NTSTATUS VBoxMRxComputeNewBufferingState(IN OUT PMRX_SRV_OPEN pSrvOpen,
223 IN PVOID pMRxContext,
224 OUT ULONG *pNewBufferingState);
225
226NTSTATUS VBoxMRxRead(IN OUT PRX_CONTEXT RxContext);
227NTSTATUS VBoxMRxWrite(IN OUT PRX_CONTEXT RxContext);
228NTSTATUS VBoxMRxLocks(IN OUT PRX_CONTEXT RxContext);
229NTSTATUS VBoxMRxFsCtl(IN OUT PRX_CONTEXT RxContext);
230NTSTATUS VBoxMRxIoCtl(IN OUT PRX_CONTEXT RxContext);
231NTSTATUS VBoxMRxNotifyChangeDirectory(IN OUT PRX_CONTEXT RxContext);
232
233ULONG NTAPI VBoxMRxExtendStub(IN OUT struct _RX_CONTEXT * RxContext,
234 IN OUT PLARGE_INTEGER pNewFileSize,
235 OUT PLARGE_INTEGER pNewAllocationSize);
236NTSTATUS VBoxMRxCompleteBufferingStateChangeRequest(IN OUT PRX_CONTEXT RxContext,
237 IN OUT PMRX_SRV_OPEN SrvOpen,
238 IN PVOID pContext);
239
240NTSTATUS VBoxMRxCreateVNetRoot(IN OUT PMRX_CREATENETROOT_CONTEXT pContext);
241NTSTATUS VBoxMRxFinalizeVNetRoot(IN OUT PMRX_V_NET_ROOT pVirtualNetRoot,
242 IN PBOOLEAN ForceDisconnect);
243NTSTATUS VBoxMRxFinalizeNetRoot(IN OUT PMRX_NET_ROOT pNetRoot,
244 IN PBOOLEAN ForceDisconnect);
245NTSTATUS VBoxMRxUpdateNetRootState(IN PMRX_NET_ROOT pNetRoot);
246VOID VBoxMRxExtractNetRootName(IN PUNICODE_STRING FilePathName,
247 IN PMRX_SRV_CALL SrvCall,
248 OUT PUNICODE_STRING NetRootName,
249 OUT PUNICODE_STRING RestOfName OPTIONAL);
250
251NTSTATUS VBoxMRxCreateSrvCall(PMRX_SRV_CALL pSrvCall,
252 PMRX_SRVCALL_CALLBACK_CONTEXT pCallbackContext);
253NTSTATUS VBoxMRxSrvCallWinnerNotify(IN OUT PMRX_SRV_CALL pSrvCall,
254 IN BOOLEAN ThisMinirdrIsTheWinner,
255 IN OUT PVOID pSrvCallContext);
256NTSTATUS VBoxMRxFinalizeSrvCall(PMRX_SRV_CALL pSrvCall,
257 BOOLEAN Force);
258
259NTSTATUS VBoxMRxDevFcbXXXControlFile(IN OUT PRX_CONTEXT RxContext);
260/** @} */
261
262/** @name Support functions and helpers
263 * @{
264 */
265NTSTATUS vbsfNtDeleteConnection(IN PRX_CONTEXT RxContext,
266 OUT PBOOLEAN PostToFsp);
267NTSTATUS vbsfNtCreateConnection(IN PRX_CONTEXT RxContext,
268 OUT PBOOLEAN PostToFsp);
269NTSTATUS vbsfNtCloseFileHandle(PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension,
270 PMRX_VBOX_FOBX pVBoxFobx,
271 PVBSFNTFCBEXT pVBoxFcbx);
272NTSTATUS vbsfNtRemove(IN PRX_CONTEXT RxContext);
273NTSTATUS vbsfNtVBoxStatusToNt(int vrc);
274PVOID vbsfNtAllocNonPagedMem(ULONG ulSize);
275void vbsfNtFreeNonPagedMem(PVOID lpMem);
276NTSTATUS vbsfNtShflStringFromUnicodeAlloc(PSHFLSTRING *ppShflString, const WCHAR *pwc, uint16_t cb);
277#if defined(DEBUG) || defined(LOG_ENABLED)
278const char *vbsfNtMajorFunctionName(UCHAR MajorFunction, LONG MinorFunction);
279#endif
280
281void vbsfNtUpdateFcbSize(PFILE_OBJECT pFileObj, PMRX_FCB pFcb, PMRX_VBOX_FOBX pVBoxFobX,
282 LONGLONG cbFileNew, LONGLONG cbFileOld, LONGLONG cbAllocated);
283int vbsfNtQueryAndUpdateFcbSize(PMRX_VBOX_NETROOT_EXTENSION pNetRootX, PFILE_OBJECT pFileObj,
284 PMRX_VBOX_FOBX pVBoxFobX, PMRX_FCB pFcb, PVBSFNTFCBEXT pVBoxFcbX);
285
286/**
287 * Converts VBox (IPRT) file mode to NT file attributes.
288 *
289 * @returns NT file attributes
290 * @param fIprtMode IPRT file mode.
291 *
292 */
293DECLINLINE(uint32_t) VBoxToNTFileAttributes(uint32_t fIprtMode)
294{
295 AssertCompile((RTFS_DOS_READONLY >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_READONLY);
296 AssertCompile((RTFS_DOS_HIDDEN >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_HIDDEN);
297 AssertCompile((RTFS_DOS_SYSTEM >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_SYSTEM);
298 AssertCompile((RTFS_DOS_DIRECTORY >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_DIRECTORY);
299 AssertCompile((RTFS_DOS_ARCHIVED >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_ARCHIVE);
300 AssertCompile((RTFS_DOS_NT_DEVICE >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_DEVICE);
301 AssertCompile((RTFS_DOS_NT_NORMAL >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_NORMAL);
302 AssertCompile((RTFS_DOS_NT_TEMPORARY >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_TEMPORARY);
303 AssertCompile((RTFS_DOS_NT_SPARSE_FILE >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_SPARSE_FILE);
304 AssertCompile((RTFS_DOS_NT_REPARSE_POINT >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_REPARSE_POINT);
305 AssertCompile((RTFS_DOS_NT_COMPRESSED >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_COMPRESSED);
306 AssertCompile((RTFS_DOS_NT_OFFLINE >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_OFFLINE);
307 AssertCompile((RTFS_DOS_NT_NOT_CONTENT_INDEXED >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_NOT_CONTENT_INDEXED);
308 AssertCompile((RTFS_DOS_NT_ENCRYPTED >> RTFS_DOS_SHIFT) == FILE_ATTRIBUTE_ENCRYPTED);
309
310 uint32_t fNtAttribs = (fIprtMode & (RTFS_DOS_MASK_NT & ~(RTFS_DOS_NT_OFFLINE | RTFS_DOS_NT_DEVICE | RTFS_DOS_NT_REPARSE_POINT)))
311 >> RTFS_DOS_SHIFT;
312 return fNtAttribs ? fNtAttribs : FILE_ATTRIBUTE_NORMAL;
313}
314
315/**
316 * Converts NT file attributes to VBox (IPRT) ones.
317 *
318 * @returns IPRT file mode
319 * @param fNtAttribs NT file attributes
320 */
321DECLINLINE(uint32_t) NTToVBoxFileAttributes(uint32_t fNtAttribs)
322{
323 uint32_t fIprtMode = (fNtAttribs << RTFS_DOS_SHIFT) & RTFS_DOS_MASK_NT;
324 fIprtMode &= ~(RTFS_DOS_NT_OFFLINE | RTFS_DOS_NT_DEVICE | RTFS_DOS_NT_REPARSE_POINT);
325 return fIprtMode ? fIprtMode : RTFS_DOS_NT_NORMAL;
326}
327
328/**
329 * Helper for converting VBox object info to NT basic file info.
330 */
331DECLINLINE(void) vbsfNtBasicInfoFromVBoxObjInfo(FILE_BASIC_INFORMATION *pNtBasicInfo, PCSHFLFSOBJINFO pVBoxInfo)
332{
333 pNtBasicInfo->CreationTime.QuadPart = RTTimeSpecGetNtTime(&pVBoxInfo->BirthTime);
334 pNtBasicInfo->LastAccessTime.QuadPart = RTTimeSpecGetNtTime(&pVBoxInfo->AccessTime);
335 pNtBasicInfo->LastWriteTime.QuadPart = RTTimeSpecGetNtTime(&pVBoxInfo->ModificationTime);
336 pNtBasicInfo->ChangeTime.QuadPart = RTTimeSpecGetNtTime(&pVBoxInfo->ChangeTime);
337 pNtBasicInfo->FileAttributes = VBoxToNTFileAttributes(pVBoxInfo->Attr.fMode);
338}
339
340
341/** @} */
342
343RT_C_DECLS_END
344
345#endif /* !GA_INCLUDED_SRC_WINNT_SharedFolders_driver_vbsf_h */
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