info.c revision 0a410c0cede1078ba1d54c6f78fce0a9fab0a800
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync/** @file
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * VirtualBox Windows Guest Shared Folders
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * File System Driver query and set information routines
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync/*
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Copyright (C) 2012 Oracle Corporation
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * available from http://www.virtualbox.org. This file is free software;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * you can redistribute it and/or modify it under the terms of the GNU
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * General Public License (GPL) as published by the Free Software
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync#include "vbsf.h"
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync/** Macro for copying a SHFLSTRING file name into a FILE_DIRECTORY_INFORMATION structure. */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync#define INIT_FILE_NAME(obj, str) \
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync do { \
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync ULONG cbLength = (str).u16Length; \
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync (obj)->FileNameLength = cbLength; \
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlCopyMemory((obj)->FileName, &(str).String.ucs2[0], cbLength + 2); \
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync } while (0)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncNTSTATUS VBoxMRxQueryDirectory(IN OUT PRX_CONTEXT RxContext)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync NTSTATUS Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RxCaptureFobx;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RxCaptureFcb;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = VBoxMRxGetDeviceExtension(RxContext);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension = VBoxMRxGetNetRootExtension(capFcb->pNetRoot);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_VBOX_FOBX pVBoxFobx = VBoxMRxGetFileObjectExtension(capFobx);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PUNICODE_STRING DirectoryName = GET_ALREADY_PREFIXED_NAME_FROM_CONTEXT(RxContext);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PUNICODE_STRING Template = &capFobx->UnicodeQueryTemplate;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync FILE_INFORMATION_CLASS FileInformationClass = RxContext->Info.FileInformationClass;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PCHAR pInfoBuffer = (PCHAR)RxContext->Info.Buffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync LONG cbMaxSize = RxContext->Info.Length;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync LONG *pLengthRemaining = (LONG *)&RxContext->Info.LengthRemaining;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync LONG cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int vboxRC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint8_t *pHGCMBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t index, fSFFlags, cFiles, u32BufSize;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync LONG cbHGCMBuffer;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync PSHFLDIRINFO pDirEntry;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG *pNextOffset = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PSHFLSTRING ParsedPath = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
acca7ab818eb8c2832aa27e27ce53133fba927dbvboxsync Log(("VBOXSF: MrxQueryDirectory: FileInformationClass %d, pVBoxFobx %p, hFile %RX64, pInfoBuffer %p\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync FileInformationClass, pVBoxFobx, pVBoxFobx->hFile, pInfoBuffer));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync if (NULL == pVBoxFobx)
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync Log(("VBOXSF: MrxQueryDirectory: pVBoxFobx is invalid!\n"));
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync return STATUS_INVALID_PARAMETER;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync }
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync if (NULL == DirectoryName)
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync {
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync return STATUS_INVALID_PARAMETER;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync }
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync if (DirectoryName->Length == 0)
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync Log(("VBOXSF: MrxQueryDirectory: DirectoryName = \\ (null string)\n"));
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync }
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync else
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync Log(("VBOXSF: MrxQueryDirectory: DirectoryName = %.*ls\n",
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync DirectoryName->Length / sizeof(WCHAR), DirectoryName->Buffer));
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync }
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync if (NULL == Template)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync return STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (Template->Length == 0)
5eb36887f6970e0033f63fa135f3bb8fbfd6059bvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Template = \\ (null string)\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Template = %.*ls\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Template->Length / sizeof(WCHAR), Template->Buffer));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbHGCMBuffer = RT_MAX(cbMaxSize, PAGE_SIZE);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Allocating cbHGCMBuffer = %d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbHGCMBuffer));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pHGCMBuffer = (uint8_t *)vbsfAllocNonPagedMem(cbHGCMBuffer);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pHGCMBuffer == NULL)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertFailed();
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return STATUS_INSUFFICIENT_RESOURCES;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Assume start from the beginning. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync index = 0;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync if (RxContext->QueryDirectory.IndexSpecified == TRUE)
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync {
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync Log(("VBOXSF: MrxQueryDirectory: Index specified %d\n",
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync index));
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync index = RxContext->QueryDirectory.FileIndex;
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync }
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync fSFFlags = SHFL_LIST_NONE;
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync if (RxContext->QueryDirectory.ReturnSingleEntry == TRUE)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Query single entry\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync fSFFlags |= SHFL_LIST_RETURN_ONE;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (Template->Length)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG ParsedPathSize, len;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Calculate length required for parsed path. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ParsedPathSize = sizeof(*ParsedPath) + (DirectoryName->Length + Template->Length + 3 * sizeof(WCHAR));
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync Log(("VBOXSF: MrxQueryDirectory: ParsedPathSize = %d\n",
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync ParsedPathSize));
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ParsedPath = (PSHFLSTRING)vbsfAllocNonPagedMem(ParsedPathSize);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync if (!ParsedPath)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync Status = STATUS_INSUFFICIENT_RESOURCES;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync goto end;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlZeroMemory(ParsedPath, ParsedPathSize);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ShflStringInitBuffer(ParsedPath, ParsedPathSize - sizeof(SHFLSTRING));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync ParsedPath->u16Size = DirectoryName->Length + Template->Length + sizeof(WCHAR);
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync ParsedPath->u16Length = ParsedPath->u16Size - sizeof(WCHAR); /* Without terminating null. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync len = 0;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync if (DirectoryName->Length)
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync /* Copy directory name into ParsedPath. */
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync RtlCopyMemory(ParsedPath->String.ucs2, DirectoryName->Buffer, DirectoryName->Length);
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync len = DirectoryName->Length / sizeof(WCHAR);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Add terminating backslash. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ParsedPath->String.ucs2[len] = L'\\';
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync len++;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ParsedPath->u16Length += sizeof(WCHAR);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ParsedPath->u16Size += sizeof(WCHAR);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlCopyMemory (&ParsedPath->String.ucs2[len], Template->Buffer, Template->Length);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: ParsedPath = %.*ls\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ParsedPath->u16Length / sizeof(WCHAR), ParsedPath->String.ucs2));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cFiles = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* vboxCallDirInfo requires a pointer to uint32_t. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync u32BufSize = cbHGCMBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: CallDirInfo: File = 0x%08x, Flags = 0x%08x, Index = %d, u32BufSize = %d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pVBoxFobx->hFile, fSFFlags, index, u32BufSize));
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync vboxRC = vboxCallDirInfo(&pDeviceExtension->hgcmClient, &pNetRootExtension->map, pVBoxFobx->hFile,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ParsedPath, fSFFlags, index, &u32BufSize, (PSHFLDIRINFO)pHGCMBuffer, &cFiles);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: u32BufSize after CallDirInfo = %d, rc = %Rrc\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync u32BufSize, vboxRC));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync switch (vboxRC)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case VINF_SUCCESS:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Nothing to do here. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case VERR_NO_TRANSLATION:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Host could not translate entry!\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case VERR_NO_MORE_FILES:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cFiles <= 0) /* VERR_NO_MORE_FILES appears at the first lookup when just returning the current dir ".".
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * So we also have to check for the cFiles counter. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Not an error, but we have to handle the return value. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Host reported no more files!\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (RxContext->QueryDirectory.InitialQuery)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* First call. MSDN on FindFirstFile: "If the function fails because no matching files
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * can be found, the GetLastError function returns ERROR_FILE_NOT_FOUND."
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync * So map this rc to file not found.
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_NO_SUCH_FILE;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Search continued. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_NO_MORE_FILES;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case VERR_FILE_NOT_FOUND:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_NO_SUCH_FILE;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: no such file!\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync default:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = VBoxErrorToNTStatus(vboxRC);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Error %Rrc from CallDirInfo (cFiles=%d)!\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync vboxRC, cFiles));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (Status != STATUS_SUCCESS)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync goto end;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Verify that the returned buffer length is not greater than the original one. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (u32BufSize > (uint32_t)cbHGCMBuffer)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: returned buffer size (%u) is invalid!!!\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync u32BufSize));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_NETWORK_RESPONSE;
7755c0a4b7b215f612d9d27848c2584ffafe7a66vboxsync goto end;
7755c0a4b7b215f612d9d27848c2584ffafe7a66vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* How many bytes remain in the buffer. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbHGCMBuffer = u32BufSize;
316572fd6bf59ec1038f0476f6536fc10163beebvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry = (PSHFLDIRINFO)pHGCMBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: cFiles=%d, Length=%d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cFiles, cbHGCMBuffer));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync while ((*pLengthRemaining) && (cFiles > 0) && (pDirEntry != NULL))
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync {
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync int cbEntry = RT_OFFSETOF(SHFLDIRINFO, name.String) + pDirEntry->name.u16Size;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync if (cbEntry > cbHGCMBuffer)
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync {
602e0e27740395dba64bee2e0a8aef023ebd7650vboxsync Log(("VBOXSF: MrxQueryDirectory: Entry size (%d) exceeds the buffer size (%d)!!!\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbEntry, cbHGCMBuffer));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_NETWORK_RESPONSE;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync goto end;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync switch (FileInformationClass)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileDirectoryInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_DIRECTORY_INFORMATION pInfo = (PFILE_DIRECTORY_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileDirectoryInformation\n"));
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync cbToCopy = sizeof(FILE_DIRECTORY_INFORMATION);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /* Struct already contains one char for null terminator. */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync cbToCopy += pDirEntry->name.u16Size;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync if (*pLengthRemaining >= cbToCopy)
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync RtlZeroMemory(pInfo, cbToCopy);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->CreationTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.BirthTime); /* ridiculous name */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->LastAccessTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.AccessTime);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->LastWriteTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.ModificationTime);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->ChangeTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.ChangeTime);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->AllocationSize.QuadPart = pDirEntry->Info.cbAllocated;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->EndOfFile.QuadPart = pDirEntry->Info.cbObject;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->FileIndex = index;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->FileAttributes = VBoxToNTFileAttributes(pDirEntry->Info.Attr.fMode);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync INIT_FILE_NAME(pInfo, pDirEntry->name);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Align to 8 byte boundary */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = RT_ALIGN(cbToCopy, sizeof(LONGLONG));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = cbToCopy;
78df65edff21c11c537f38e736707ea434ab5623vboxsync pNextOffset = &pInfo->NextEntryOffset;
78df65edff21c11c537f38e736707ea434ab5623vboxsync }
78df65edff21c11c537f38e736707ea434ab5623vboxsync else
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync {
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync pInfo->NextEntryOffset = 0; /* last item */
78df65edff21c11c537f38e736707ea434ab5623vboxsync Status = STATUS_BUFFER_OVERFLOW;
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync }
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync break;
489fcf2b60b2dfc27a2fcb590aad04ad2c4f9b75vboxsync }
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case FileFullDirectoryInformation:
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync PFILE_FULL_DIR_INFORMATION pInfo = (PFILE_FULL_DIR_INFORMATION)pInfoBuffer;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync Log(("VBOXSF: MrxQueryDirectory: FileFullDirectoryInformation\n"));
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync cbToCopy = sizeof(FILE_FULL_DIR_INFORMATION);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync /* Struct already contains one char for null terminator. */
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync cbToCopy += pDirEntry->name.u16Size;
78df65edff21c11c537f38e736707ea434ab5623vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync if (*pLengthRemaining >= cbToCopy)
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync {
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync RtlZeroMemory(pInfo, cbToCopy);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
78df65edff21c11c537f38e736707ea434ab5623vboxsync pInfo->CreationTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.BirthTime); /* ridiculous name */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastAccessTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.AccessTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastWriteTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.ModificationTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->ChangeTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.ChangeTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->AllocationSize.QuadPart = pDirEntry->Info.cbAllocated;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->EndOfFile.QuadPart = pDirEntry->Info.cbObject;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->EaSize = 0;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->FileIndex = index;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->FileAttributes = VBoxToNTFileAttributes(pDirEntry->Info.Attr.fMode);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync INIT_FILE_NAME(pInfo, pDirEntry->name);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync /* Align to 8 byte boundary */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = RT_ALIGN(cbToCopy, sizeof(LONGLONG));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pNextOffset = &pInfo->NextEntryOffset;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = 0; /* last item */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_OVERFLOW;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileBothDirectoryInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_BOTH_DIR_INFORMATION pInfo = (PFILE_BOTH_DIR_INFORMATION)pInfoBuffer;
78df65edff21c11c537f38e736707ea434ab5623vboxsync Log(("VBOXSF: MrxQueryDirectory: FileBothDirectoryInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_BOTH_DIR_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* struct already contains one char for null terminator */
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync cbToCopy += pDirEntry->name.u16Size;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync if (*pLengthRemaining >= cbToCopy)
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync {
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync RtlZeroMemory(pInfo, cbToCopy);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->CreationTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.BirthTime); /* ridiculous name */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->LastAccessTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.AccessTime);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->LastWriteTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.ModificationTime);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->ChangeTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.ChangeTime);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->AllocationSize.QuadPart = pDirEntry->Info.cbAllocated;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->EndOfFile.QuadPart = pDirEntry->Info.cbObject;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->EaSize = 0;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->ShortNameLength = 0; /* @todo ? */
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->FileIndex = index;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileAttributes = VBoxToNTFileAttributes(pDirEntry->Info.Attr.fMode);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync INIT_FILE_NAME(pInfo, pDirEntry->name);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileBothDirectoryInformation cbAlloc = %x cbObject = %x\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->Info.cbAllocated, pDirEntry->Info.cbObject));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileBothDirectoryInformation cbToCopy = %d, name size=%d name len=%d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy, pDirEntry->name.u16Size, pDirEntry->name.u16Length));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileBothDirectoryInformation File name %.*ls (DirInfo)\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileNameLength / sizeof(WCHAR), pInfo->FileName));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileBothDirectoryInformation File name %.*ls (DirEntry)\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->name.u16Size / sizeof(WCHAR), pDirEntry->name.String.ucs2));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Align to 8 byte boundary. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = RT_ALIGN(cbToCopy, sizeof(LONGLONG));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pNextOffset = &pInfo->NextEntryOffset;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = 0; /* Last item. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_OVERFLOW;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileIdBothDirectoryInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_ID_BOTH_DIR_INFORMATION pInfo = (PFILE_ID_BOTH_DIR_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileIdBothDirectoryInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_ID_BOTH_DIR_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* struct already contains one char for null terminator */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy += pDirEntry->name.u16Size;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlZeroMemory(pInfo, cbToCopy);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->CreationTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.BirthTime); /* ridiculous name */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastAccessTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.AccessTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastWriteTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.ModificationTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->ChangeTime.QuadPart = RTTimeSpecGetNtTime(&pDirEntry->Info.ChangeTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->AllocationSize.QuadPart = pDirEntry->Info.cbAllocated;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->EndOfFile.QuadPart = pDirEntry->Info.cbObject;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync pInfo->EaSize = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->ShortNameLength = 0; /* @todo ? */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->EaSize = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileId.QuadPart = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileAttributes = VBoxToNTFileAttributes(pDirEntry->Info.Attr.fMode);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync INIT_FILE_NAME(pInfo, pDirEntry->name);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileIdBothDirectoryInformation cbAlloc = 0x%RX64 cbObject = 0x%RX64\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->Info.cbAllocated, pDirEntry->Info.cbObject));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileIdBothDirectoryInformation cbToCopy = %d, name size=%d name len=%d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy, pDirEntry->name.u16Size, pDirEntry->name.u16Length));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileIdBothDirectoryInformation File name %.*ls (DirInfo)\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileNameLength / sizeof(WCHAR), pInfo->FileName));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileIdBothDirectoryInformation File name %.*ls (DirEntry)\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pDirEntry->name.u16Size / sizeof(WCHAR), pDirEntry->name.String.ucs2));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Align to 8 byte boundary. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = RT_ALIGN(cbToCopy, sizeof(LONGLONG));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pNextOffset = &pInfo->NextEntryOffset;
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = 0; /* Last item. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_OVERFLOW;
48807baed22246206b9855f41d1fd106f0679b3avboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileNamesInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_NAMES_INFORMATION pInfo = (PFILE_NAMES_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileNamesInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_NAMES_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Struct already contains one char for null terminator. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy += pDirEntry->name.u16Size;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlZeroMemory(pInfo, cbToCopy);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileIndex = index;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync INIT_FILE_NAME(pInfo, pDirEntry->name);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: FileNamesInformation: File name [%.*ls]\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileNameLength / sizeof(WCHAR), pInfo->FileName));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* Align to 8 byte boundary. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = RT_ALIGN(cbToCopy, sizeof(LONGLONG));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pNextOffset = &pInfo->NextEntryOffset;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NextEntryOffset = 0; /* Last item. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_OVERFLOW;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync }
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync default:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Not supported FileInformationClass %d!\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync FileInformationClass));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync goto end;
090c459b9e90ca46e2ce2b8c81533ade3b23f3e9vboxsync }
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync cbHGCMBuffer -= cbEntry;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync pDirEntry = (PSHFLDIRINFO)((uintptr_t)pDirEntry + cbEntry);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync Log(("VBOXSF: MrxQueryDirectory: %d bytes left in HGCM buffer\n",
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync cbHGCMBuffer));
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync if (*pLengthRemaining >= cbToCopy)
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync {
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync pInfoBuffer += cbToCopy;
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync *pLengthRemaining -= cbToCopy;
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync }
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync else
7fee49908ea4b9f6cb4f9cc745633c4969ed6318vboxsync {
090c459b9e90ca46e2ce2b8c81533ade3b23f3e9vboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (RxContext->QueryDirectory.ReturnSingleEntry)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
090c459b9e90ca46e2ce2b8c81533ade3b23f3e9vboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* More left? */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbHGCMBuffer <= 0)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync index++; /* File Index. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cFiles--;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pNextOffset)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *pNextOffset = 0; /* Last pInfo->NextEntryOffset should be set to zero! */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncend:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pHGCMBuffer)
fb9145a2ea23bd8e078c88167ebdcb9c83ee3ee0vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync vbsfFreeNonPagedMem(pHGCMBuffer);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (ParsedPath)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync vbsfFreeNonPagedMem(ParsedPath);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryDirectory: Returned 0x%08X\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return Status;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync}
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncNTSTATUS VBoxMRxQueryVolumeInfo(IN OUT PRX_CONTEXT RxContext)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync{
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync NTSTATUS Status;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RxCaptureFcb;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RxCaptureFobx;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = VBoxMRxGetDeviceExtension(RxContext);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension = VBoxMRxGetNetRootExtension(capFcb->pNetRoot);
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync PMRX_VBOX_FOBX pVBoxFobx = VBoxMRxGetFileObjectExtension(capFobx);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync FS_INFORMATION_CLASS FsInformationClass = RxContext->Info.FsInformationClass;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PVOID pInfoBuffer = RxContext->Info.Buffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG cbInfoBuffer = RxContext->Info.LengthRemaining;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG cbToCopy = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG cbString = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: pInfoBuffer = %p, cbInfoBuffer = %d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RxContext->Info.Buffer, RxContext->Info.LengthRemaining));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: vboxFobx = %p, Handle = 0x%RX64\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pVBoxFobx, pVBoxFobx? pVBoxFobx->hFile: 0));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync switch (FsInformationClass)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileFsVolumeInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_FS_VOLUME_INFORMATION pInfo = (PFILE_FS_VOLUME_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_NET_ROOT pNetRoot = capFcb->pNetRoot;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_SRV_CALL pSrvCall = pNetRoot->pSrvCall;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PWCHAR pRootName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG cbRootName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PSHFLVOLINFO pShflVolInfo;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t cbHGCMBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint8_t *pHGCMBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int vboxRC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsVolumeInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pVBoxFobx == NULL)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: pVBoxFobx is NULL!\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbRootName = pNetRoot->pNetRootName->Length - pSrvCall->pSrvCallName->Length;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbRootName -= sizeof(WCHAR); /* Remove the leading backslash. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pRootName = pNetRoot->pNetRootName->Buffer + (pSrvCall->pSrvCallName->Length / sizeof(WCHAR));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pRootName++; /* Remove the leading backslash. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsVolumeInformation: Root name = %.*ls, %d bytes\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbRootName / sizeof(WCHAR), pRootName, cbRootName));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbString = VBOX_VOLNAME_PREFIX_SIZE;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbString += cbRootName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbString += sizeof(WCHAR);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsVolumeInformation: cbToCopy %d, cbString %d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy, cbString));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync if (cbInfoBuffer < cbToCopy)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync Status = STATUS_BUFFER_TOO_SMALL;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync break;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RtlZeroMemory(pInfo, cbToCopy);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync /* Query serial number. */
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbHGCMBuffer = sizeof(SHFLVOLINFO);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pHGCMBuffer = (uint8_t *)vbsfAllocNonPagedMem(cbHGCMBuffer);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync if (pHGCMBuffer == NULL)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync Status = STATUS_INSUFFICIENT_RESOURCES;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync break;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync vboxRC = vboxCallFSInfo(&pDeviceExtension->hgcmClient, &pNetRootExtension->map, pVBoxFobx->hFile,
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync SHFL_INFO_GET | SHFL_INFO_VOLUME, &cbHGCMBuffer, (PSHFLDIRINFO)pHGCMBuffer);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync if (vboxRC != VINF_SUCCESS)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync Status = VBoxErrorToNTStatus(vboxRC);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync vbsfFreeNonPagedMem(pHGCMBuffer);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync break;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pShflVolInfo = (PSHFLVOLINFO)pHGCMBuffer;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pInfo->VolumeSerialNumber = pShflVolInfo->ulSerial;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync vbsfFreeNonPagedMem(pHGCMBuffer);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pInfo->VolumeCreationTime.QuadPart = 0;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pInfo->SupportsObjects = FALSE;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync if (cbInfoBuffer >= cbToCopy + cbString)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RtlCopyMemory(&pInfo->VolumeLabel[0],
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync VBOX_VOLNAME_PREFIX,
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync VBOX_VOLNAME_PREFIX_SIZE);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)],
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pRootName,
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbRootName);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pInfo->VolumeLabel[cbString / sizeof(WCHAR) - 1] = 0;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbString = cbInfoBuffer - cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlCopyMemory(&pInfo->VolumeLabel[0],
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync VBOX_VOLNAME_PREFIX,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RT_MIN(cbString, VBOX_VOLNAME_PREFIX_SIZE));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbString > VBOX_VOLNAME_PREFIX_SIZE)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)],
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pRootName,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbString - VBOX_VOLNAME_PREFIX_SIZE);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->VolumeLabelLength = cbString;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy += cbString;
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsVolumeInformation: VolumeLabelLength %d\n",
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync pInfo->VolumeLabelLength));
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileFsLabelInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_FS_LABEL_INFORMATION pInfo = (PFILE_FS_LABEL_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_NET_ROOT pNetRoot = capFcb->pNetRoot;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PMRX_SRV_CALL pSrvCall = pNetRoot->pSrvCall;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PWCHAR pRootName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG cbRootName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsLabelInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbRootName = pNetRoot->pNetRootName->Length - pSrvCall->pSrvCallName->Length;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbRootName -= sizeof(WCHAR); /* Remove the leading backslash. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pRootName = pNetRoot->pNetRootName->Buffer + (pSrvCall->pSrvCallName->Length / sizeof(WCHAR));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pRootName++; /* Remove the leading backslash. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsLabelInformation: Root name = %.*ls, %d bytes\n",
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbRootName / sizeof(WCHAR), pRootName, cbRootName));
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = FIELD_OFFSET(FILE_FS_LABEL_INFORMATION, VolumeLabel);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbString = VBOX_VOLNAME_PREFIX_SIZE;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbString += cbRootName;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbString += sizeof(WCHAR);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbInfoBuffer < cbToCopy)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync Status = STATUS_BUFFER_TOO_SMALL;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync break;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RtlZeroMemory(pInfo, cbToCopy);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync if (cbInfoBuffer >= cbToCopy + cbString)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RtlCopyMemory(&pInfo->VolumeLabel[0],
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync VBOX_VOLNAME_PREFIX,
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync VBOX_VOLNAME_PREFIX_SIZE);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)],
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pRootName,
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbRootName);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pInfo->VolumeLabel[cbString / sizeof(WCHAR) - 1] = 0;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync else
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbString = cbInfoBuffer - cbToCopy;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RtlCopyMemory(&pInfo->VolumeLabel[0],
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync VBOX_VOLNAME_PREFIX,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RT_MIN(cbString, VBOX_VOLNAME_PREFIX_SIZE));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbString > VBOX_VOLNAME_PREFIX_SIZE)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlCopyMemory(&pInfo->VolumeLabel[VBOX_VOLNAME_PREFIX_SIZE / sizeof(WCHAR)],
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pRootName,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbString - VBOX_VOLNAME_PREFIX_SIZE);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->VolumeLabelLength = cbString;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy += cbString;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsLabelInformation: VolumeLabelLength %d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->VolumeLabelLength));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileFsFullSizeInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileFsSizeInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_FS_FULL_SIZE_INFORMATION pFullSizeInfo = (PFILE_FS_FULL_SIZE_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_FS_SIZE_INFORMATION pSizeInfo = (PFILE_FS_SIZE_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint32_t cbHGCMBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync uint8_t *pHGCMBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync int vboxRC;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PSHFLVOLINFO pShflVolInfo;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync LARGE_INTEGER TotalAllocationUnits;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync LARGE_INTEGER AvailableAllocationUnits;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG SectorsPerAllocationUnit;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync ULONG BytesPerSector;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (FsInformationClass == FileFsFullSizeInformation)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsFullSizeInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_FS_FULL_SIZE_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsSizeInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_FS_SIZE_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pVBoxFobx == NULL)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
ae5fc6ddd3d2ccdb941b1aacd23f6791fecc3354vboxsync Log(("VBOXSF: MrxQueryVolumeInfo: pVBoxFobx is NULL!\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync break;
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbInfoBuffer < cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlZeroMemory(pInfoBuffer, cbToCopy);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbHGCMBuffer = sizeof(SHFLVOLINFO);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pHGCMBuffer = (uint8_t *)vbsfAllocNonPagedMem(cbHGCMBuffer);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pHGCMBuffer == NULL)
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INSUFFICIENT_RESOURCES;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync vboxRC = vboxCallFSInfo(&pDeviceExtension->hgcmClient, &pNetRootExtension->map, pVBoxFobx->hFile,
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync SHFL_INFO_GET | SHFL_INFO_VOLUME, &cbHGCMBuffer, (PSHFLDIRINFO)pHGCMBuffer);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (vboxRC != VINF_SUCCESS)
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = VBoxErrorToNTStatus(vboxRC);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync vbsfFreeNonPagedMem(pHGCMBuffer);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync }
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync pShflVolInfo = (PSHFLVOLINFO)pHGCMBuffer;
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync TotalAllocationUnits.QuadPart = pShflVolInfo->ullTotalAllocationBytes / pShflVolInfo->ulBytesPerAllocationUnit;
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync AvailableAllocationUnits.QuadPart = pShflVolInfo->ullAvailableAllocationBytes / pShflVolInfo->ulBytesPerAllocationUnit;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync SectorsPerAllocationUnit = pShflVolInfo->ulBytesPerAllocationUnit / pShflVolInfo->ulBytesPerSector;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync BytesPerSector = pShflVolInfo->ulBytesPerSector;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: TotalAllocationUnits 0x%RX64\n", TotalAllocationUnits.QuadPart));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: AvailableAllocationUnits 0x%RX64\n", AvailableAllocationUnits.QuadPart));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: SectorsPerAllocationUnit 0x%X\n", SectorsPerAllocationUnit));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: BytesPerSector 0x%X\n", BytesPerSector));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (FsInformationClass == FileFsFullSizeInformation)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pFullSizeInfo->TotalAllocationUnits = TotalAllocationUnits;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pFullSizeInfo->CallerAvailableAllocationUnits = AvailableAllocationUnits;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pFullSizeInfo->ActualAvailableAllocationUnits = AvailableAllocationUnits;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pFullSizeInfo->SectorsPerAllocationUnit = SectorsPerAllocationUnit;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pFullSizeInfo->BytesPerSector = BytesPerSector;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pSizeInfo->TotalAllocationUnits = TotalAllocationUnits;
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync pSizeInfo->AvailableAllocationUnits = AvailableAllocationUnits;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pSizeInfo->SectorsPerAllocationUnit = SectorsPerAllocationUnit;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pSizeInfo->BytesPerSector = BytesPerSector;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync vbsfFreeNonPagedMem(pHGCMBuffer);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileFsDeviceInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_FS_DEVICE_INFORMATION pInfo = (PFILE_FS_DEVICE_INFORMATION)pInfoBuffer;
29a65fa8b740a860f86812328cf900b8d68d93bevboxsync PMRX_NET_ROOT NetRoot = capFcb->pNetRoot;
37a7e3e6f9ce5f6cabeb3f734044e9e8ca9cb1bfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsDeviceInformation: Type = %d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync NetRoot->DeviceType));
29a65fa8b740a860f86812328cf900b8d68d93bevboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_FS_DEVICE_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbInfoBuffer < cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->DeviceType = NetRoot->DeviceType;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync pInfo->Characteristics = FILE_REMOTE_DEVICE;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileFsAttributeInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_FS_ATTRIBUTE_INFORMATION pInfo = (PFILE_FS_ATTRIBUTE_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsAttributeInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbString = sizeof(MRX_VBOX_FILESYS_NAME_U);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbInfoBuffer < cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileSystemAttributes = 0; /** @todo set unicode, case sensitive etc? */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->MaximumComponentNameLength = 255; /** @todo should query from the host */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (cbInfoBuffer >= cbToCopy + cbString)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlCopyMemory(pInfo->FileSystemName,
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync MRX_VBOX_FILESYS_NAME_U,
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync sizeof(MRX_VBOX_FILESYS_NAME_U));
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync }
af0a09edb4c1431b606fe207d4138da008f67f13vboxsync else
af0a09edb4c1431b606fe207d4138da008f67f13vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbString = cbInfoBuffer - cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlCopyMemory(pInfo->FileSystemName,
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync MRX_VBOX_FILESYS_NAME_U,
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync RT_MIN(cbString, sizeof(MRX_VBOX_FILESYS_NAME_U)));
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync }
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
602e0e27740395dba64bee2e0a8aef023ebd7650vboxsync pInfo->FileSystemNameLength = cbString;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync cbToCopy += cbString;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsAttributeInformation: FileSystemNameLength %d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileSystemNameLength));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileFsControlInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsControlInformation: not supported\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileFsObjectIdInformation:
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsObjectIdInformation: not supported\n"));
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync Status = STATUS_INVALID_PARAMETER;
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync break;
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync case FileFsMaximumInformation:
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync Log(("VBOXSF: MrxQueryVolumeInfo: FileFsMaximumInformation: not supported\n"));
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync Status = STATUS_INVALID_PARAMETER;
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync default:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: Not supported FsInformationClass %d!\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync FsInformationClass));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (Status == STATUS_SUCCESS)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RxContext->Info.LengthRemaining = cbInfoBuffer - cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else if (Status == STATUS_BUFFER_TOO_SMALL)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryVolumeInfo: Insufficient buffer size %d, required %d\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbInfoBuffer, cbToCopy));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RxContext->InformationToReturn = cbToCopy;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync }
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync Log(("VBOXSF: MrxQueryVolumeInfo: cbToCopy = %d, LengthRemaining = %d, Status = 0x%08X\n",
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync cbToCopy, RxContext->Info.LengthRemaining, Status));
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync return Status;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync}
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsyncNTSTATUS VBoxMRxQueryFileInfo(IN PRX_CONTEXT RxContext)
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync{
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync NTSTATUS Status = STATUS_SUCCESS;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync RxCaptureFcb;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync RxCaptureFobx;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync
dbed7f90d58f22958c5c9deb0479a8388838e3b1vboxsync PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = VBoxMRxGetDeviceExtension(RxContext);
dbed7f90d58f22958c5c9deb0479a8388838e3b1vboxsync PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension = VBoxMRxGetNetRootExtension(capFcb->pNetRoot);
dbed7f90d58f22958c5c9deb0479a8388838e3b1vboxsync PMRX_VBOX_FOBX pVBoxFobx = VBoxMRxGetFileObjectExtension(capFobx);
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync PUNICODE_STRING FileName = GET_ALREADY_PREFIXED_NAME_FROM_CONTEXT(RxContext);
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync FILE_INFORMATION_CLASS FunctionalityRequested = RxContext->Info.FileInformationClass;
dbed7f90d58f22958c5c9deb0479a8388838e3b1vboxsync PCHAR pInfoBuffer = (PCHAR)RxContext->Info.Buffer;
dbed7f90d58f22958c5c9deb0479a8388838e3b1vboxsync uint32_t cbInfoBuffer = RxContext->Info.Length;
dbed7f90d58f22958c5c9deb0479a8388838e3b1vboxsync ULONG *pLengthRemaining = (PULONG) & RxContext->Info.LengthRemaining;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync int vboxRC = 0;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync ULONG cbToCopy = 0;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync uint8_t *pHGCMBuffer = 0;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync uint32_t cbHGCMBuffer;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync PSHFLFSOBJINFO pFileEntry = NULL;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync if (NULL == pLengthRemaining)
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync {
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync Log(("VBOXSF: MrxQueryFileInfo: length pointer is NULL!\n"));
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync return STATUS_INVALID_PARAMETER;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync }
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync Log(("VBOXSF: MrxQueryFileInfo: InfoBuffer = %p, Size = %d bytes, LenRemain = %d bytes\n",
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync pInfoBuffer, cbInfoBuffer, *pLengthRemaining));
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync if (NULL == pVBoxFobx)
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync {
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync Log(("VBOXSF: MrxQueryFileInfo: pVBoxFobx is NULL!\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (NULL == pInfoBuffer)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: pInfoBuffer is NULL!\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync return STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pVBoxFobx->FileStandardInfo.Directory == TRUE)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: Directory -> Copy info retrieved during the create call\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync switch (FunctionalityRequested)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync case FileBasicInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_BASIC_INFORMATION pInfo = (PFILE_BASIC_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileBasicInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_BASIC_INFORMATION);
8d7d8eab781262b9db094374b166806c03786fa2vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *pInfo = pVBoxFobx->FileBasicInfo;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileBasicInformation: File attributes: 0x%x\n",
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync pInfo->FileAttributes));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileStandardInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
bc5c5b5cd56ce8e64ada076691018f1dff17b2c2vboxsync PFILE_STANDARD_INFORMATION pInfo = (PFILE_STANDARD_INFORMATION)pInfoBuffer;
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileStandardInformation\n"));
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync cbToCopy = sizeof(FILE_STANDARD_INFORMATION);
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *pInfo = pVBoxFobx->FileStandardInfo;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
6abae205eac4f4a16f6ad5a2a71ed1f36d6a57b0vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileNamesInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_NAMES_INFORMATION pInfo = (PFILE_NAMES_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileNamesInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_NAMES_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* And size in bytes of the WCHAR name. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy += FileName->Length;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlZeroMemory(pInfo, cbToCopy);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileNameLength = FileName->Length;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlCopyMemory(pInfo->FileName, FileName->Buffer, FileName->Length);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->FileName[FileName->Length] = 0; /* FILE_NAMES_INFORMATION had space for the nul. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
6dc780c3e9adb5f3a0ef93c8f34ba38ac2213776vboxsync else
6dc780c3e9adb5f3a0ef93c8f34ba38ac2213776vboxsync {
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync }
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync case FileInternalInformation:
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync {
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync PFILE_INTERNAL_INFORMATION pInfo = (PFILE_INTERNAL_INFORMATION)pInfoBuffer;
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileInternalInformation\n"));
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync cbToCopy = sizeof(FILE_INTERNAL_INFORMATION);
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync if (*pLengthRemaining >= cbToCopy)
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync {
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync /* A 8-byte file reference number for the file. */
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync pInfo->IndexNumber.QuadPart = (ULONG_PTR)capFcb;
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync }
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync else
cbfe19957042925c835c6aee6722a0e7af852783vboxsync {
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync Status = STATUS_BUFFER_TOO_SMALL;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync }
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync break;
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync }
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync case FileEaInformation:
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync {
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync PFILE_EA_INFORMATION pInfo = (PFILE_EA_INFORMATION)pInfoBuffer;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileEaInformation\n"));
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync cbToCopy = sizeof(FILE_EA_INFORMATION);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync if (*pLengthRemaining >= cbToCopy)
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync {
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync pInfo->EaSize = 0;
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync }
db07105a44f53e9e2377ade02cd3dbe482647cb9vboxsync else
db07105a44f53e9e2377ade02cd3dbe482647cb9vboxsync {
db07105a44f53e9e2377ade02cd3dbe482647cb9vboxsync Status = STATUS_BUFFER_TOO_SMALL;
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync }
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync break;
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync }
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync case FileNetworkOpenInformation:
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync {
04b02ffb8824a60fd37777bc1f7d2f35104a274cvboxsync PFILE_NETWORK_OPEN_INFORMATION pInfo = (PFILE_NETWORK_OPEN_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileNetworkOpenInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_NETWORK_OPEN_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->CreationTime = pVBoxFobx->FileBasicInfo.CreationTime;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastAccessTime = pVBoxFobx->FileBasicInfo.LastAccessTime;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastWriteTime = pVBoxFobx->FileBasicInfo.LastWriteTime;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->ChangeTime = pVBoxFobx->FileBasicInfo.ChangeTime;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->AllocationSize.QuadPart = 0;
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync pInfo->EndOfFile.QuadPart = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileAttributes = pVBoxFobx->FileBasicInfo.FileAttributes;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
f45123ab6638fb0a030ffbfa96598635efd24a01vboxsync }
f45123ab6638fb0a030ffbfa96598635efd24a01vboxsync break;
f45123ab6638fb0a030ffbfa96598635efd24a01vboxsync }
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync case FileStreamInformation:
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileStreamInformation: not supported\n"));
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync Status = STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync goto end;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync default:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: Not supported FunctionalityRequested %d!\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync FunctionalityRequested));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync goto end;
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else /* Entry is a file. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbHGCMBuffer = RT_MAX(cbInfoBuffer, PAGE_SIZE);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pHGCMBuffer = (uint8_t *)vbsfAllocNonPagedMem(cbHGCMBuffer);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
78df65edff21c11c537f38e736707ea434ab5623vboxsync if (pHGCMBuffer == NULL)
78df65edff21c11c537f38e736707ea434ab5623vboxsync {
78df65edff21c11c537f38e736707ea434ab5623vboxsync return STATUS_INSUFFICIENT_RESOURCES;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
78df65edff21c11c537f38e736707ea434ab5623vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Assert(pVBoxFobx && pNetRootExtension && pDeviceExtension);
78df65edff21c11c537f38e736707ea434ab5623vboxsync vboxRC = vboxCallFSInfo(&pDeviceExtension->hgcmClient, &pNetRootExtension->map, pVBoxFobx->hFile,
78df65edff21c11c537f38e736707ea434ab5623vboxsync SHFL_INFO_GET | SHFL_INFO_FILE, &cbHGCMBuffer, (PSHFLDIRINFO)pHGCMBuffer);
78df65edff21c11c537f38e736707ea434ab5623vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (vboxRC != VINF_SUCCESS)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = VBoxErrorToNTStatus(vboxRC);
78df65edff21c11c537f38e736707ea434ab5623vboxsync goto end;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pFileEntry = (PSHFLFSOBJINFO)pHGCMBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_SUCCESS;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync switch (FunctionalityRequested)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileBasicInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync PFILE_BASIC_INFORMATION pInfo = (PFILE_BASIC_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileBasicInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_BASIC_INFORMATION);
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
5d6df5999c0e844db1af3c6def0a9abac5120d3bvboxsync if (*pLengthRemaining >= cbToCopy)
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->CreationTime.QuadPart = RTTimeSpecGetNtTime(&pFileEntry->BirthTime); /* Ridiculous name. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastAccessTime.QuadPart = RTTimeSpecGetNtTime(&pFileEntry->AccessTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastWriteTime.QuadPart = RTTimeSpecGetNtTime(&pFileEntry->ModificationTime);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pInfo->ChangeTime.QuadPart = RTTimeSpecGetNtTime(&pFileEntry->ChangeTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileAttributes = VBoxToNTFileAttributes(pFileEntry->Attr.fMode);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileBasicInformation: File attributes = 0x%x\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileAttributes));
37a7e3e6f9ce5f6cabeb3f734044e9e8ca9cb1bfvboxsync }
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync Status = STATUS_BUFFER_TOO_SMALL;
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync }
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync break;
740011a32913a7f759d5b747def605a2b820c3fcvboxsync }
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync
740011a32913a7f759d5b747def605a2b820c3fcvboxsync case FileStandardInformation:
740011a32913a7f759d5b747def605a2b820c3fcvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_STANDARD_INFORMATION pInfo = (PFILE_STANDARD_INFORMATION)pInfoBuffer;
6dc780c3e9adb5f3a0ef93c8f34ba38ac2213776vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileStandardInformation\n"));
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
01283af355575e02820380d73a30a474f425fd3dvboxsync cbToCopy = sizeof(FILE_STANDARD_INFORMATION);
01283af355575e02820380d73a30a474f425fd3dvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->AllocationSize.QuadPart = pFileEntry->cbAllocated;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->EndOfFile.QuadPart = pFileEntry->cbObject;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->NumberOfLinks = 1; /* @todo 0? */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->DeletePending = FALSE;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (pFileEntry->Attr.fMode & RTFS_DOS_DIRECTORY)
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync {
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync pInfo->Directory = TRUE;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->Directory = FALSE;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
6dc780c3e9adb5f3a0ef93c8f34ba38ac2213776vboxsync break;
37a7e3e6f9ce5f6cabeb3f734044e9e8ca9cb1bfvboxsync }
0433783a793d5ced0dc7f9dcf102143b66e1cd2cvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileNamesInformation:
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
ed82223f8f7be1435bf9b203a0ee4fbdfc856dc8vboxsync PFILE_NAMES_INFORMATION pInfo = (PFILE_NAMES_INFORMATION)pInfoBuffer;
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync Log(("VBOXSF: MrxQueryFileInfo: FileNamesInformation\n"));
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync
97b90aeef96fa866c0f65fabe0c70822a386cc56vboxsync cbToCopy = sizeof(FILE_NAMES_INFORMATION);
97b90aeef96fa866c0f65fabe0c70822a386cc56vboxsync /* And size in bytes of the WCHAR name. */
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync cbToCopy += FileName->Length;
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync
63a3c5be7ac89d0d5b3386988f8c2f78df0cacf6vboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RtlZeroMemory(pInfo, cbToCopy);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pInfo->FileNameLength = FileName->Length;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync RtlCopyMemory(pInfo->FileName, FileName->Buffer, FileName->Length);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileName[FileName->Length] = 0; /* FILE_NAMES_INFORMATION had space for the nul. */
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync }
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync else
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync Status = STATUS_BUFFER_TOO_SMALL;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync }
6dc780c3e9adb5f3a0ef93c8f34ba38ac2213776vboxsync break;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync }
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileInternalInformation:
be302cc3dbc037aaebbadbf9057662a88b3b23a8vboxsync {
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync PFILE_INTERNAL_INFORMATION pInfo = (PFILE_INTERNAL_INFORMATION)pInfoBuffer;
be302cc3dbc037aaebbadbf9057662a88b3b23a8vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileInternalInformation\n"));
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync cbToCopy = sizeof(FILE_INTERNAL_INFORMATION);
be302cc3dbc037aaebbadbf9057662a88b3b23a8vboxsync
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync if (*pLengthRemaining >= cbToCopy)
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync {
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync /* A 8-byte file reference number for the file. */
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync pInfo->IndexNumber.QuadPart = (ULONG_PTR)capFcb;
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync }
d8707f50ca9ff2792d9acb7addb52467098d1b47vboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
be302cc3dbc037aaebbadbf9057662a88b3b23a8vboxsync Status = STATUS_BUFFER_TOO_SMALL;
be302cc3dbc037aaebbadbf9057662a88b3b23a8vboxsync }
be302cc3dbc037aaebbadbf9057662a88b3b23a8vboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileEaInformation:
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_EA_INFORMATION pInfo = (PFILE_EA_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileEaInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync cbToCopy = sizeof(FILE_EA_INFORMATION);
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync if (*pLengthRemaining >= cbToCopy)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync pInfo->EaSize = 0;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case FileAttributeTagInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync PFILE_ATTRIBUTE_TAG_INFORMATION pInfo = (PFILE_ATTRIBUTE_TAG_INFORMATION)pInfoBuffer;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileAttributeTagInformation\n"));
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync cbToCopy = sizeof(FILE_ATTRIBUTE_TAG_INFORMATION);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync if (*pLengthRemaining >= cbToCopy)
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync {
b2e90826ea719b22452d1ff7b977d4f40995b428vboxsync pInfo->FileAttributes = VBoxToNTFileAttributes(pFileEntry->Attr.fMode);
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync pInfo->ReparseTag = 0;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync }
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync else
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync Status = STATUS_BUFFER_TOO_SMALL;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync }
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync break;
8045a4f12870545f3d937c1a531307cc7f32a9a6vboxsync }
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case FileEndOfFileInformation:
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync PFILE_END_OF_FILE_INFORMATION pInfo = (PFILE_END_OF_FILE_INFORMATION)pInfoBuffer;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileEndOfFileInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_END_OF_FILE_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->EndOfFile.QuadPart = pFileEntry->cbObject;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync Status = STATUS_BUFFER_TOO_SMALL;
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync case FileAllocationInformation:
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync {
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync PFILE_ALLOCATION_INFORMATION pInfo = (PFILE_ALLOCATION_INFORMATION)pInfoBuffer;
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync Log(("VBOXSF: MrxQueryFileInfo: FileAllocationInformation\n"));
f632be0ea31134f1ce343e84c90d7984d2bf96b2vboxsync
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync cbToCopy = sizeof(FILE_ALLOCATION_INFORMATION);
e43d0b86db65e202efb63f0fc5fce1f981267a32vboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->AllocationSize.QuadPart = pFileEntry->cbAllocated;
f3abe19bdaeea1b354674327ee95707281a6ad83vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync {
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync Status = STATUS_BUFFER_TOO_SMALL;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync }
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync break;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileNetworkOpenInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_NETWORK_OPEN_INFORMATION pInfo = (PFILE_NETWORK_OPEN_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileNetworkOpenInformation\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync cbToCopy = sizeof(FILE_NETWORK_OPEN_INFORMATION);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining >= cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->CreationTime.QuadPart = RTTimeSpecGetNtTime(&pFileEntry->BirthTime); /* Ridiculous name. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastAccessTime.QuadPart = RTTimeSpecGetNtTime(&pFileEntry->AccessTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->LastWriteTime.QuadPart = RTTimeSpecGetNtTime(&pFileEntry->ModificationTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->ChangeTime.QuadPart = RTTimeSpecGetNtTime(&pFileEntry->ChangeTime);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->AllocationSize.QuadPart = pFileEntry->cbAllocated;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->EndOfFile.QuadPart = pFileEntry->cbObject;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfo->FileAttributes = VBoxToNTFileAttributes(pFileEntry->Attr.fMode);
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync break;
8e29dabca04cf55fde8755871d14abde99ef7236vboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileStreamInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: FileStreamInformation: not supported\n"));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync goto end;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync default:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: Not supported FunctionalityRequested %d!\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync FunctionalityRequested));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_INVALID_PARAMETER;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync goto end;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (Status == STATUS_SUCCESS)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (*pLengthRemaining < cbToCopy)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync /* This situation must be already taken into account by the above code. */
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync AssertMsgFailed(("VBOXSF: MrxQueryFileInfo: Length remaining is below 0! (%d - %d)!\n",
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *pLengthRemaining, cbToCopy));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Status = STATUS_BUFFER_TOO_SMALL;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync else
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync pInfoBuffer += cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync *pLengthRemaining -= cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsyncend:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync if (Status == STATUS_BUFFER_TOO_SMALL)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: Buffer too small %d, required %d!\n",
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync *pLengthRemaining, cbToCopy));
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync RxContext->InformationToReturn = cbToCopy;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync }
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync if (pHGCMBuffer)
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync vbsfFreeNonPagedMem(pHGCMBuffer);
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync }
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync if (Status == STATUS_SUCCESS)
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync {
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync Log(("VBOXSF: MrxQueryFileInfo: Remaining length = %d\n",
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync *pLengthRemaining));
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync }
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MrxQueryFileInfo: Returned 0x%08X\n",
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync Status));
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync return Status;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync}
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsyncNTSTATUS VBoxMRxSetFileInfo(IN PRX_CONTEXT RxContext)
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync{
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync NTSTATUS Status = STATUS_SUCCESS;
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync RxCaptureFcb;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync RxCaptureFobx;
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = VBoxMRxGetDeviceExtension(RxContext);
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension = VBoxMRxGetNetRootExtension(capFcb->pNetRoot);
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync PMRX_VBOX_FOBX pVBoxFobx = VBoxMRxGetFileObjectExtension(capFobx);
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync FILE_INFORMATION_CLASS FunctionalityRequested = RxContext->Info.FileInformationClass;
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync PVOID pInfoBuffer = (PVOID)RxContext->Info.Buffer;
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync int vboxRC;
47e063db54028c020dd3e85a2467d7a279e47a8avboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync uint8_t *pHGCMBuffer = NULL;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync uint32_t cbBuffer = 0;
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync Log(("VBOXSF: MrxSetFileInfo: pInfoBuffer %p\n",
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync pInfoBuffer));
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync switch (FunctionalityRequested)
b14965bee0bfb359e6ce9db6beaa4add9935fe3cvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync case FileBasicInformation:
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync {
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PFILE_BASIC_INFORMATION pInfo = (PFILE_BASIC_INFORMATION)pInfoBuffer;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync PSHFLFSOBJINFO pSHFLFileInfo;
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MRxSetFileInfo: FileBasicInformation: CreationTime %RX64\n", pInfo->CreationTime.QuadPart));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MRxSetFileInfo: FileBasicInformation: LastAccessTime %RX64\n", pInfo->LastAccessTime.QuadPart));
30a23dfc653298a09d77d3045cf873b1bd6ddecfvboxsync Log(("VBOXSF: MRxSetFileInfo: FileBasicInformation: LastWriteTime %RX64\n", pInfo->LastWriteTime.QuadPart));
Log(("VBOXSF: MRxSetFileInfo: FileBasicInformation: ChangeTime %RX64\n", pInfo->ChangeTime.QuadPart));
Log(("VBOXSF: MRxSetFileInfo: FileBasicInformation: FileAttributes %RX32\n", pInfo->FileAttributes));
/* When setting file attributes, a value of -1 indicates to the server that it MUST NOT change this attribute
* for all subsequent operations on the same file handle.
*/
if (pInfo->CreationTime.QuadPart == -1)
{
pVBoxFobx->fKeepCreationTime = TRUE;
}
if (pInfo->LastAccessTime.QuadPart == -1)
{
pVBoxFobx->fKeepLastAccessTime = TRUE;
}
if (pInfo->LastWriteTime.QuadPart == -1)
{
pVBoxFobx->fKeepLastWriteTime = TRUE;
}
if (pInfo->ChangeTime.QuadPart == -1)
{
pVBoxFobx->fKeepChangeTime = TRUE;
}
cbBuffer = sizeof(SHFLFSOBJINFO);
pHGCMBuffer = (uint8_t *)vbsfAllocNonPagedMem(cbBuffer);
if (pHGCMBuffer == NULL)
{
AssertFailed();
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlZeroMemory(pHGCMBuffer, cbBuffer);
pSHFLFileInfo = (PSHFLFSOBJINFO)pHGCMBuffer;
Log(("VBOXSF: MrxSetFileInfo: FileBasicInformation: keeps %d %d %d %d\n",
pVBoxFobx->fKeepCreationTime, pVBoxFobx->fKeepLastAccessTime, pVBoxFobx->fKeepLastWriteTime, pVBoxFobx->fKeepChangeTime));
/* The properties, that need to be changed, are set to something other than zero */
if (pInfo->CreationTime.QuadPart && !pVBoxFobx->fKeepCreationTime)
{
RTTimeSpecSetNtTime(&pSHFLFileInfo->BirthTime, pInfo->CreationTime.QuadPart);
}
if (pInfo->LastAccessTime.QuadPart && !pVBoxFobx->fKeepLastAccessTime)
{
RTTimeSpecSetNtTime(&pSHFLFileInfo->AccessTime, pInfo->LastAccessTime.QuadPart);
}
if (pInfo->LastWriteTime.QuadPart && !pVBoxFobx->fKeepLastWriteTime)
{
RTTimeSpecSetNtTime(&pSHFLFileInfo->ModificationTime, pInfo->LastWriteTime.QuadPart);
}
if (pInfo->ChangeTime.QuadPart && !pVBoxFobx->fKeepChangeTime)
{
RTTimeSpecSetNtTime(&pSHFLFileInfo->ChangeTime, pInfo->ChangeTime.QuadPart);
}
if (pInfo->FileAttributes)
{
pSHFLFileInfo->Attr.fMode = NTToVBoxFileAttributes(pInfo->FileAttributes);
}
Assert(pVBoxFobx && pNetRootExtension && pDeviceExtension);
vboxRC = vboxCallFSInfo(&pDeviceExtension->hgcmClient, &pNetRootExtension->map, pVBoxFobx->hFile,
SHFL_INFO_SET | SHFL_INFO_FILE, &cbBuffer, (PSHFLDIRINFO)pSHFLFileInfo);
if (vboxRC != VINF_SUCCESS)
{
Status = VBoxErrorToNTStatus(vboxRC);
goto end;
}
else
{
/* Update our internal copy. Ignore zero fields! */
if (pInfo->CreationTime.QuadPart && !pVBoxFobx->fKeepCreationTime)
{
pVBoxFobx->FileBasicInfo.CreationTime = pInfo->CreationTime;
}
if (pInfo->LastAccessTime.QuadPart && !pVBoxFobx->fKeepLastAccessTime)
{
pVBoxFobx->FileBasicInfo.LastAccessTime = pInfo->LastAccessTime;
}
if (pInfo->LastWriteTime.QuadPart && !pVBoxFobx->fKeepLastWriteTime)
{
pVBoxFobx->FileBasicInfo.LastWriteTime = pInfo->LastWriteTime;
}
if (pInfo->ChangeTime.QuadPart && !pVBoxFobx->fKeepChangeTime)
{
pVBoxFobx->FileBasicInfo.ChangeTime = pInfo->ChangeTime;
}
if (pInfo->FileAttributes)
{
pVBoxFobx->FileBasicInfo.FileAttributes = pInfo->FileAttributes;
}
}
break;
}
case FileDispositionInformation:
{
PFILE_DISPOSITION_INFORMATION pInfo = (PFILE_DISPOSITION_INFORMATION)pInfoBuffer;
Log(("VBOXSF: MrxSetFileInfo: FileDispositionInformation: Delete = %d\n",
pInfo->DeleteFile));
if (pInfo->DeleteFile && capFcb->OpenCount == 1)
{
Status = vbsfRemove(RxContext);
}
else
{
Status = STATUS_SUCCESS;
}
break;
}
case FilePositionInformation:
{
PFILE_POSITION_INFORMATION pInfo = (PFILE_POSITION_INFORMATION)pInfoBuffer;
Log(("VBOXSF: MrxSetFileInfo: FilePositionInformation: CurrentByteOffset = 0x%RX64. Unsupported!\n",
pInfo->CurrentByteOffset.QuadPart));
Status = STATUS_INVALID_PARAMETER;
break;
}
case FileAllocationInformation:
{
PFILE_ALLOCATION_INFORMATION pInfo = (PFILE_ALLOCATION_INFORMATION)pInfoBuffer;
Log(("VBOXSF: MrxSetFileInfo: FileAllocationInformation: new AllocSize = 0x%RX64, FileSize = 0x%RX64\n",
pInfo->AllocationSize.QuadPart, capFcb->Header.FileSize.QuadPart));
/* Check if the new allocation size changes the file size. */
if (pInfo->AllocationSize.QuadPart > capFcb->Header.FileSize.QuadPart)
{
/* Ignore this request and return success. Shared folders do not distinguish between
* AllocationSize and FileSize.
*/
Status = STATUS_SUCCESS;
}
else
{
/* Treat the request as a EndOfFile update. */
LARGE_INTEGER NewAllocationSize;
Status = vbsfSetEndOfFile(RxContext, &pInfo->AllocationSize, &NewAllocationSize);
}
break;
}
case FileEndOfFileInformation:
{
PFILE_END_OF_FILE_INFORMATION pInfo = (PFILE_END_OF_FILE_INFORMATION)pInfoBuffer;
LARGE_INTEGER NewAllocationSize;
Log(("VBOXSF: MrxSetFileInfo: FileEndOfFileInformation: new EndOfFile 0x%RX64, FileSize = 0x%RX64\n",
pInfo->EndOfFile.QuadPart, capFcb->Header.FileSize.QuadPart));
Status = vbsfSetEndOfFile(RxContext, &pInfo->EndOfFile, &NewAllocationSize);
Log(("VBOXSF: MrxSetFileInfo: FileEndOfFileInformation: AllocSize = 0x%RX64, Status 0x%08X\n",
NewAllocationSize.QuadPart, Status));
break;
}
case FileLinkInformation:
{
PFILE_LINK_INFORMATION pInfo = (PFILE_LINK_INFORMATION )pInfoBuffer;
Log(("VBOXSF: MrxSetFileInfo: FileLinkInformation: ReplaceIfExists = %d, RootDirectory = 0x%x = [%.*ls]. Not implemented!\n",
pInfo->ReplaceIfExists, pInfo->RootDirectory, pInfo->FileNameLength / sizeof(WCHAR), pInfo->FileName));
Status = STATUS_NOT_IMPLEMENTED;
break;
}
case FileRenameInformation:
{
PFILE_RENAME_INFORMATION pInfo = (PFILE_RENAME_INFORMATION)pInfoBuffer;
Log(("VBOXSF: MrxSetFileInfo: FileRenameInformation: ReplaceIfExists = %d, RootDirectory = 0x%x = [%.*ls]\n",
pInfo->ReplaceIfExists, pInfo->RootDirectory, pInfo->FileNameLength / sizeof(WCHAR), pInfo->FileName));
Status = vbsfRename(RxContext, FileRenameInformation, pInfoBuffer, RxContext->Info.Length);
break;
}
default:
Log(("VBOXSF: MrxSetFileInfo: Not supported FunctionalityRequested %d!\n",
FunctionalityRequested));
Status = STATUS_INVALID_PARAMETER;
break;
}
end:
if (pHGCMBuffer)
{
vbsfFreeNonPagedMem(pHGCMBuffer);
}
Log(("VBOXSF: MrxSetFileInfo: Returned 0x%08X\n",
Status));
return Status;
}
NTSTATUS VBoxMRxSetFileInfoAtCleanup(IN PRX_CONTEXT RxContext)
{
Log(("VBOXSF: MRxSetFileInfoAtCleanup\n"));
return STATUS_SUCCESS;
}