VirtualBox

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

Last change on this file was 98103, checked in by vboxsync, 17 months ago

Copyright year updates by scm.

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

© 2023 Oracle
ContactPrivacy policyTerms of Use