vbsf.c revision 2888816fbcb216a2dbc97a95fa5a50b6caa09e32
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VirtualBox Windows Guest Shared Folders.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * File System Driver initialization and generic routines
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2012 Oracle Corporation
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The current state of the driver.
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncstatic MRX_VBOX_STATE VBoxMRxState = MRX_VBOX_STARTABLE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The VBoxSF dispatch table.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The VBoxSF device object.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic NTSTATUS VBoxMRxFsdDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxFsdDispatch: major %d, minor %d: %s\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync MajorFunctionCode, MinorFunctionCode, MajorFunctionString(MajorFunctionCode, MinorFunctionCode)));
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync if (DeviceObject != (PDEVICE_OBJECT)VBoxMRxDeviceObject)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxFsdDispatch: Invalid device request detected %p %p\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DeviceObject, (PDEVICE_OBJECT)VBoxMRxDeviceObject));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Status = RxFsdDispatch((PRDBSS_DEVICE_OBJECT)VBoxMRxDeviceObject, Irp);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic void VBoxMRxUnload(IN PDRIVER_OBJECT DriverObject)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pDeviceExtension = (PMRX_VBOX_DEVICE_EXTENSION)((PBYTE)VBoxMRxDeviceObject + sizeof(RDBSS_DEVICE_OBJECT));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RxContext = RxCreateRxContext(NULL, VBoxMRxDeviceObject, RX_CONTEXT_FLAG_IN_FSP);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = RxStopMinirdr(RxContext, &RxContext->PostRequest);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync State = (MRX_VBOX_STATE)InterlockedCompareExchange((LONG *)&VBoxMRxState, MRX_VBOX_STARTABLE, MRX_VBOX_STARTED);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RtlInitUnicodeString(&UserModeDeviceName, DD_MRX_VBOX_USERMODE_SHADOW_DEV_NAME_U);
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync Status = IoDeleteSymbolicLink(&UserModeDeviceName);
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync Log(("VBOXSF: MRxUnload: IoDeleteSymbolicLink Status 0x%08X\n",
17c6e5e8177d068d1bc6af875d1610718efcfdb4vboxsync Log(("VBOXSF: MRxUnload: VBoxSF.sys driver object %p unloaded\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic void vbsfInitMRxDispatch(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ZeroAndInitializeNodeType(&VBoxMRxDispatch, RDBSS_NTC_MINIRDR_DISPATCH, sizeof(MINIRDR_DISPATCH));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxFlags = (RDBSS_MANAGE_NET_ROOT_EXTENSION | RDBSS_MANAGE_FOBX_EXTENSION);
fa92c704624def98d3c4aca86d65182effb98e04vboxsync VBoxMRxDispatch.MRxNetRootSize = sizeof(MRX_VBOX_NETROOT_EXTENSION);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxFobxSize = sizeof(MRX_VBOX_FOBX);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxCollapseOpen = VBoxMRxCollapseOpen;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxShouldTryToCollapseThisOpen = VBoxMRxShouldTryToCollapseThisOpen;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxCleanupFobx = VBoxMRxCleanupFobx;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxCloseSrvOpen = VBoxMRxCloseSrvOpen;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxDeallocateForFcb = VBoxMRxDeallocateForFcb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxDeallocateForFobx = VBoxMRxDeallocateForFobx;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxForceClosed = VBoxMRxForceClosed;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxQueryDirectory = VBoxMRxQueryDirectory;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxQueryFileInfo = VBoxMRxQueryFileInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxSetFileInfo = VBoxMRxSetFileInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxSetFileInfoAtCleanup = VBoxMRxSetFileInfoAtCleanup;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxQueryEaInfo = VBoxMRxQueryEaInfo;
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync VBoxMRxDispatch.MRxQuerySdInfo = VBoxMRxQuerySdInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxQueryVolumeInfo = VBoxMRxQueryVolumeInfo;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxComputeNewBufferingState = VBoxMRxComputeNewBufferingState;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_READ] = VBoxMRxRead;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_WRITE] = VBoxMRxWrite;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_SHAREDLOCK] = VBoxMRxLocks;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_EXCLUSIVELOCK] = VBoxMRxLocks;
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_UNLOCK] = VBoxMRxLocks;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_UNLOCK_MULTIPLE] = VBoxMRxLocks;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_FSCTL] = VBoxMRxFsCtl;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_IOCTL] = VBoxMRxIoCtl;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxMRxDispatch.MRxLowIOSubmit[LOWIO_OP_NOTIFY_CHANGE_DIRECTORY] = VBoxMRxNotifyChangeDirectory;
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync VBoxMRxDispatch.MRxExtendForCache = VBoxMRxExtendStub;
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync VBoxMRxDispatch.MRxExtendForNonCache = VBoxMRxExtendStub;
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync VBoxMRxDispatch.MRxCompleteBufferingStateChangeRequest = VBoxMRxCompleteBufferingStateChangeRequest;
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync VBoxMRxDispatch.MRxCreateVNetRoot = VBoxMRxCreateVNetRoot;
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync VBoxMRxDispatch.MRxFinalizeVNetRoot = VBoxMRxFinalizeVNetRoot;
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync VBoxMRxDispatch.MRxFinalizeNetRoot = VBoxMRxFinalizeNetRoot;
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync VBoxMRxDispatch.MRxUpdateNetRootState = VBoxMRxUpdateNetRootState;
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync VBoxMRxDispatch.MRxExtractNetRootName = VBoxMRxExtractNetRootName;
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync VBoxMRxDispatch.MRxCreateSrvCall = VBoxMRxCreateSrvCall;
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync VBoxMRxDispatch.MRxSrvCallWinnerNotify = VBoxMRxSrvCallWinnerNotify;
940dbfa4936f2e3966e9e874c4886709f0c75b44vboxsync VBoxMRxDispatch.MRxFinalizeSrvCall = VBoxMRxFinalizeSrvCall;
5eca6b757429b1f1d768e16fba65c485af34319dvboxsync VBoxMRxDispatch.MRxDevFcbXXXControlFile = VBoxMRxDevFcbXXXControlFile;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic BOOL vboxIsPrefixOK (const WCHAR *FilePathName, ULONG PathNameLength)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* The FilePathName here looks like: \vboxsrv\... */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (PathNameLength >= 8 * sizeof (WCHAR)) /* Number of bytes in '\vboxsrv' unicode string. */
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync PrefixOK &= (FilePathName[1] == L'V') || (FilePathName[1] == L'v');
ada08ea58e7613c10d4c40669fd4fb955324bfdfvboxsync PrefixOK &= (FilePathName[2] == L'B') || (FilePathName[2] == L'b');
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PrefixOK &= (FilePathName[3] == L'O') || (FilePathName[3] == L'o');
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PrefixOK &= (FilePathName[4] == L'X') || (FilePathName[4] == L'x');
5cd35366dd244ca8c8c583904fc6ff2a0c60fa0fvboxsync PrefixOK &= (FilePathName[5] == L'S') || (FilePathName[5] == L's');
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync /* Both vboxsvr & vboxsrv are now accepted */
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync if ((FilePathName[6] == L'V') || (FilePathName[6] == L'v'))
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync PrefixOK &= (FilePathName[6] == L'V') || (FilePathName[6] == L'v');
2a08e12d5dcc1bb5057a9620e87ad361d41a1c1fvboxsync PrefixOK &= (FilePathName[7] == L'R') || (FilePathName[7] == L'r');
43d3e60a2bcef646da0887a845e67c3a47759158vboxsync PrefixOK &= (FilePathName[6] == L'R') || (FilePathName[6] == L'r');
48d60b042893290a747d3abeda71a3085d9133fdvboxsync PrefixOK &= (FilePathName[7] == L'V') || (FilePathName[7] == L'v');
48d60b042893290a747d3abeda71a3085d9133fdvboxsync /* There is something after '\vboxsrv'. */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync PrefixOK &= (FilePathName[8] == L'\\') || (FilePathName[8] == 0);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncstatic NTSTATUS VBoxMRXDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* Make a local copy, it will be needed after the Irp completion. */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync ULONG IoControlCode = pStack->Parameters.DeviceIoControl.IoControlCode;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = (PMRX_VBOX_DEVICE_EXTENSION)((PBYTE)pDevObj + sizeof(RDBSS_DEVICE_OBJECT));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Log(("VBOXSF: MRXDeviceControl: pDevObj %p, pDeviceExtension %p, code %x\n",
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync pDevObj, pDevObj->DeviceExtension, IoControlCode));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* This IOCTL is intercepted for 2 reasons:
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * 1) Claim the vboxsvr and vboxsrv prefixes. All name-based operations for them
5cd35366dd244ca8c8c583904fc6ff2a0c60fa0fvboxsync * will be routed to the VBox provider automatically without any prefix resolution
43d3e60a2bcef646da0887a845e67c3a47759158vboxsync * since the prefix is already in the prefix cache.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * 2) Reject other prefixes immediately to speed up the UNC path resolution a bit,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * because RDBSS will not be involved then.
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync /* MSDN: Network redirectors should only honor kernel-mode senders of this IOCTL, by verifying
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync * that RequestorMode member of the IRP structure is KernelMode.
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync Log(("VBOXSF: MRxDeviceControl: IOCTL_REDIR_QUERY_PATH(_EX): not kernel mode!!!\n",
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync pStack->Parameters.DeviceIoControl.InputBufferLength));
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync /* Continue to RDBSS. */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync Log(("VBOXSF: MRxDeviceControl: IOCTL_REDIR_QUERY_PATH: Called (pid %x).\n", IoGetCurrentProcess()));
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync if (pStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(QUERY_PATH_REQUEST))
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync Log(("VBOXSF: MRxDeviceControl: IOCTL_REDIR_QUERY_PATH: short input buffer %d.\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pStack->Parameters.DeviceIoControl.InputBufferLength));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Continue to RDBSS. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pReq = (QUERY_PATH_REQUEST *)pStack->Parameters.DeviceIoControl.Type3InputBuffer;
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync Log(("VBOXSF: MRxDeviceControl: PathNameLength = %d.\n", pReq->PathNameLength));
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync Log(("VBOXSF: MRxDeviceControl: SecurityContext = %p.\n", pReq->SecurityContext));
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync Log(("VBOXSF: MRxDeviceControl: FilePathName = %.*ls.\n", pReq->PathNameLength / sizeof (WCHAR), pReq->FilePathName));
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync Log(("VBOXSF: MRxDeviceControl: IOCTL_REDIR_QUERY_PATH_EX: Called.\n"));
447f830b91e4e0a6702f578f2c0babfd812a5d74vboxsync if (pStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(QUERY_PATH_REQUEST_EX))
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync Log(("VBOXSF: MRxDeviceControl: IOCTL_REDIR_QUERY_PATH_EX: short input buffer %d.\n",
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync pStack->Parameters.DeviceIoControl.InputBufferLength));
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync /* Continue to RDBSS. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pReqEx = (QUERY_PATH_REQUEST_EX *)pStack->Parameters.DeviceIoControl.Type3InputBuffer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDeviceControl: pSecurityContext = %p.\n", pReqEx->pSecurityContext));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDeviceControl: EaLength = %d.\n", pReqEx->EaLength));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDeviceControl: pEaBuffer = %p.\n", pReqEx->pEaBuffer));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDeviceControl: PathNameLength = %d.\n", pReqEx->PathName.Length));
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync Log(("VBOXSF: MRxDeviceControl: FilePathName = %.*ls.\n", pReqEx->PathName.Length / sizeof (WCHAR), pReqEx->PathName.Buffer));
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync PrefixOK = vboxIsPrefixOK (FilePathName, PathNameLength);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDeviceControl PrefixOK %d\n", PrefixOK));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* Immediately fail the IOCTL with STATUS_BAD_NETWORK_NAME as recommended by MSDN.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * No need to involve RDBSS.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Log(("VBOXSF: MRxDeviceControl: returned STATUS_BAD_NETWORK_NAME\n"));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Log(("VBOXSF: MRxDeviceControl pResp %p verifying the path.\n", pResp));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* Always claim entire \vboxsrv prefix. The LengthAccepted initially is equal to entire path.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * Here it is assigned to the length of \vboxsrv prefix.
10eaaac806009b8336cc5d746fe5072f6c9f58c0vboxsync Log(("VBOXSF: MRxDeviceControl: claiming the path.\n"));
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsync /* No pResp pointer, should not happen. Just a precaution. */
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync Log(("VBOXSF: MRxDeviceControl: returned STATUS_INVALID_PARAMETER\n"));
6a2b7cefae549318ba64aee5d6f40d0aae28f1a3vboxsync /* Pass the IOCTL to RDBSS. */
1f67f03c498fb10dfaa104a3698a1e149b7e9eb5vboxsync if (pDeviceExtension && pDeviceExtension->pfnRDBSSDeviceControl)
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync Log(("VBOXSF: MRxDeviceControl calling RDBSS %p\n", pDeviceExtension->pfnRDBSSDeviceControl));
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync Status = pDeviceExtension->pfnRDBSSDeviceControl (pDevObj, pIrp);
8809400ad2407593d3471b82d5caf0c24cbcdf8avboxsync Log(("VBOXSF: MRxDeviceControl RDBSS status 0x%08X\n", Status));
960d1f2d42faa8d833309114e5adc46a6a658c27vboxsync /* No RDBSS, should not happen. Just a precaution. */
395ac8a20a012656020c61a3975493a65fee0e77vboxsync Log(("VBOXSF: MRxDeviceControl: returned STATUS_NOT_IMPLEMENTED\n"));
f20f327b65009074292a4b9ad44a02b6bfb2de8avboxsyncNTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync Log(("VBOXSF: DriverEntry: Driver object %p\n", DriverObject));
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync Log(("VBOXSF: DriverEntry: driver object is NULL.\n"));
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync /* Initialize VBox subsystem. */
09b36b509b761f9ce006fa9c25cb86d12757b937vboxsync Log(("VBOXSF: DriverEntry: ERROR while initializing VBox subsystem (%Rrc)!\n",
f20f327b65009074292a4b9ad44a02b6bfb2de8avboxsync /* Connect the HGCM client */
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsync Log(("VBOXSF: DriverEntry: ERROR while connecting to host (%Rrc)!\n",
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsync /* Init the driver object. */
b0d29fd0a868929a608ff72658aac997cc95319avboxsync for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
c50100d1513854735d4e3593b3b385c007f6d8b6vboxsync DriverObject->MajorFunction[i] = (PDRIVER_DISPATCH)VBoxMRxFsdDispatch;
b0d29fd0a868929a608ff72658aac997cc95319avboxsync /* Forward to RDBSS. */
b0d29fd0a868929a608ff72658aac997cc95319avboxsync Status = RxDriverEntry(DriverObject, RegistryPath);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: DriverEntry: RxDriverEntry failed: 0x%08X\n", Status));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: DriverEntry: RxRegisterMinirdr: calling VBoxMRxDeviceObject %p\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RtlInitUnicodeString(&VBoxMRxName, DD_MRX_VBOX_FS_DEVICE_NAME_U);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Don use RX_REGISTERMINI_FLAG_DONT_PROVIDE_UNCS or else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * UNC mappings don't work (including Windows explorer browsing).
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync Log(("VBOXSF: DriverEntry: RxRegisterMinirdr: returned 0x%08X VBoxMRxDeviceObject %p\n",
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Log(("VBOXSF: DriverEntry: RxRegisterMinirdr failed: 0x%08X\n", Status ));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* Init the device extension.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * NOTE: the device extension actually points to fields
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * in the RDBSS_DEVICE_OBJECT. Our space is past the end
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * of this struct!!
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync pDeviceExtension = (PMRX_VBOX_DEVICE_EXTENSION)((PBYTE)VBoxMRxDeviceObject + sizeof(RDBSS_DEVICE_OBJECT));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync pDeviceExtension->pDeviceObject = VBoxMRxDeviceObject;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync for (i = 0; i < RT_ELEMENTS(pDeviceExtension->cLocalConnections); i++)
2da513a7caa29822c9991d7e8615658a194c0cf8vboxsync /* Mutex for synchronizining our connection list */
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync ExInitializeFastMutex(&pDeviceExtension->mtxLocalCon);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* The device object has been created. Need to setup a symbolic
2da513a7caa29822c9991d7e8615658a194c0cf8vboxsync * link so that the device may be accessed from a Win32 user mode
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * application.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RtlInitUnicodeString(&UserModeDeviceName, DD_MRX_VBOX_USERMODE_SHADOW_DEV_NAME_U);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: DriverEntry: Calling IoCreateSymbolicLink\n"));
dee2201f96a012bfb966c8de4ab006c2c90a0eefvboxsync Status = IoCreateSymbolicLink(&UserModeDeviceName, &VBoxMRxName);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: DriverEntry: IoCreateSymbolicLink: 0x%08X\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: DriverEntry: Symbolic link created.\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Build the dispatch tables for the minirdr
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: DriverEntry: VBoxSF.sys failed to start with Status = 0x%08X\n",
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* The redirector driver must intercept the IOCTL to avoid VBOXSVR name resolution
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync * by other redirectors. These additional name resolutions cause long delays.
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Log(("VBOXSF: DriverEntry: VBoxMRxDeviceObject = %p, rdbss %p, devext %p\n",
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync VBoxMRxDeviceObject, DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL], pDeviceExtension));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync pDeviceExtension->pfnRDBSSDeviceControl = DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL];
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VBoxMRXDeviceControl;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync /* @todo start the redirector here RxStartMiniRdr. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: DriverEntry: Failure! Status = 0x%08X\n", Status));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncNTSTATUS VBoxMRxStart(PRX_CONTEXT RxContext, IN OUT PRDBSS_DEVICE_OBJECT RxDeviceObject)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CurrentState = (MRX_VBOX_STATE)InterlockedCompareExchange((PLONG)&VBoxMRxState, MRX_VBOX_STARTED, MRX_VBOX_START_IN_PROGRESS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxStart: Start in progress -> started\n"));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Log(("VBOXSF: MRxStart: Bad state! VBoxMRxState = %d\n", VBoxMRxState));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncNTSTATUS VBoxMRxStop(PRX_CONTEXT RxContext, IN OUT PRDBSS_DEVICE_OBJECT RxDeviceObject)
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync RxContext->LowIoContext.ParamsFor.FsCtl.FsControlCode));
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncNTSYSAPI NTSTATUS NTAPI ZwSetSecurityObject(IN HANDLE Handle,
e74eef731a813e4e06680c587a6759b9974b29c9vboxsyncNTSTATUS VBoxMRxDevFcbXXXControlFile(IN OUT PRX_CONTEXT RxContext)
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = VBoxMRxGetDeviceExtension(RxContext);
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext;
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Log(("VBOXSF: MRxDevFcbXXXControlFile: MajorFunction = 0x%02X\n",
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync Log(("VBOXSF: MRxDevFcbXXXControlFile: IRP_MN_USER_FS_REQUEST: 0x%08X\n",
e74eef731a813e4e06680c587a6759b9974b29c9vboxsync switch (LowIoContext->ParamsFor.IoCtl.IoControlCode)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_ADDCONN\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vbsfCreateConnection(RxContext, &RxContext->PostRequest);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_DELCONN\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Status = vbsfDeleteConnection(RxContext, &RxContext->PostRequest);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG cbOut = LowIoContext->ParamsFor.IoCtl.OutputBufferLength;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint8_t *pu8Out = (uint8_t *)LowIoContext->ParamsFor.IoCtl.pOutputBuffer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_GETLIST\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ((cbOut >= _MRX_MAX_DRIVE_LETTERS) && (NULL != pu8Out))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_GETLIST: Copying local connections\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fLocked = ExTryToAcquireFastMutex(&pDeviceExtension->mtxLocalCon);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RtlCopyMemory(pu8Out, pDeviceExtension->cLocalConnections, _MRX_MAX_DRIVE_LETTERS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ExReleaseFastMutex(&pDeviceExtension->mtxLocalCon);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RxContext->InformationToReturn = _MRX_MAX_DRIVE_LETTERS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_GETLIST: cbOut is too small %d bytes\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Returns the root IDs of shared folder mappings.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG cbOut = LowIoContext->ParamsFor.IoCtl.OutputBufferLength;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint8_t *pu8Out = (uint8_t *)LowIoContext->ParamsFor.IoCtl.pOutputBuffer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_GETGLOBALLIST\n"));
38b70b2dcb1783801f7580cba797a0c8af4b5326vboxsync if ((cbOut >= _MRX_MAX_DRIVE_LETTERS) && (NULL != pu8Out))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int vboxRC = vboxCallQueryMappings(&pDeviceExtension->hgcmClient, mappings, &cMappings);
uint32_t i;
Status));
case IOCTL_MRX_VBOX_GETCONN:
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_GETCONN: ConnectName = %.*ls, Len = %d, RemoteName = 0x%p, Len = %d\n",
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_GETCONN: Looking up connection name and connections\n"));
RtlCopyMemory(pwcRemoteName, pDeviceExtension->wszLocalConnectionName[idx]->Buffer, cbLocalConnectionName);
int vboxRC;
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_GETGLOBALCONN: Connection ID = %d, RemoteName = 0x%x, Len = %d\n",
if (!pString)
cbString);
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_GETGLOBALCONN: Returned name = %.*ls, Len = %d\n",
case IOCTL_MRX_VBOX_START:
capFobx));
switch (VBoxMRxState)
case MRX_VBOX_STARTABLE:
if (capFobx)
Log(("VBOXSF: MRxDevFcbXXXControlFile: MRX_VBOX_START_IN_PROGRESS RxStartMiniRdr Status 0x%08X, post %d\n",
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_START: MRX_VBOX_START_IN_PROGRESS: RtlCreateSecurityDescriptor failed with 0x%08X!\n",
Status));
return Status;
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_START: MRX_VBOX_START_IN_PROGRESS: ZwOpenFile %ls failed with 0x%08X!\n",
return Status;
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_START: MRX_VBOX_START_IN_PROGRESS: ZwSetSecurityObject failed with 0x%08X!\n",
Status));
return Status;
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_START: MRX_VBOX_START_IN_PROGRESS: ZwClose failed with 0x%08X\n",
Status));
return Status;
case MRX_VBOX_STARTED:
Log(("VBOXSF: MRxDevFcbXXXControlFile: IOCTL_MRX_VBOX_START: MRX_VBOX_STARTED: Already started\n"));
VBoxMRxState));
Status));
case IOCTL_MRX_VBOX_STOP:
capFobx));
if (capFobx)
CurrentState = (MRX_VBOX_STATE)InterlockedCompareExchange((PLONG) & VBoxMRxState, MRX_VBOX_STARTABLE, MRX_VBOX_STARTED);
Status));
return Status;
NULL,
NULL);
NULL,
NULL,
Status));
return Handle;
return STATUS_PENDING;
return STATUS_INVALID_PARAMETER;
return STATUS_INVALID_PARAMETER;
ULONG i;
pwc++;
idx));
idx));
pDeviceExtension->wszLocalConnectionName[idx] = (PUNICODE_STRING)vbsfAllocNonPagedMem(sizeof(UNICODE_STRING) + cbConnectName);
idx));
return Status;
return STATUS_PENDING;
Status));
ULONG i;
pwc++;
pwc--;
idx));
return Status;
return STATUS_SUCCESS;
return STATUS_NOT_IMPLEMENTED;
return STATUS_INVALID_DEVICE_REQUEST;
return STATUS_NOT_IMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
return STATUS_WMI_GUID_NOT_FOUND;
return STATUS_SUCCESS;