09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync/** @file
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * VirtualBox Windows Guest Shared Folders
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * Network provider dll
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync/*
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * Copyright (C) 2012 Oracle Corporation
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * available from http://www.virtualbox.org. This file is free software;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * you can redistribute it and/or modify it under the terms of the GNU
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * General Public License (GPL) as published by the Free Software
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <windows.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <windef.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <winbase.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <winsvc.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <winnetwk.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <npapi.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <devioctl.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <stdio.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include "..\driver\vbsfshared.h"
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <iprt/alloc.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <iprt/initterm.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <iprt/string.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <iprt/log.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <VBox/version.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <VBox/VMMDev.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <VBox/VBoxGuestLib.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#include <VBox/Log.h>
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#define MRX_VBOX_SERVER_NAME_U L"VBOXSVR"
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#define MRX_VBOX_SERVER_NAME_ALT_U L"VBOXSRV"
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync#define WNNC_DRIVER(major, minor) (major * 0x00010000 + minor)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncstatic WCHAR vboxToUpper(WCHAR wc)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* The CharUpper parameter is a pointer to a null-terminated string,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * or specifies a single character. If the high-order word of this
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * parameter is zero, the low-order word must contain a single character to be converted.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return (WCHAR)CharUpper((LPTSTR)wc);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncstatic DWORD vbsfIOCTL(ULONG IoctlCode,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync PVOID InputDataBuf,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG InputDataLen,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync PVOID OutputDataBuf,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync PULONG pOutputDataLen)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG cbOut = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (!pOutputDataLen)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pOutputDataLen = &cbOut;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG dwStatus = WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync HANDLE DeviceHandle = CreateFile(DD_MRX_VBOX_USERMODE_DEV_NAME_U,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync GENERIC_READ | GENERIC_WRITE,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync FILE_SHARE_READ | FILE_SHARE_WRITE,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync (LPSECURITY_ATTRIBUTES)NULL,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync OPEN_EXISTING,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync 0,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync (HANDLE)NULL);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (INVALID_HANDLE_VALUE != DeviceHandle)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BOOL fSuccess = DeviceIoControl(DeviceHandle,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync IoctlCode,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync InputDataBuf,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync InputDataLen,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync OutputDataBuf,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pOutputDataLen,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pOutputDataLen,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (!fSuccess)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = GetLastError();
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: vbsfIOCTL: DeviceIoctl last error = %d\n", dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CloseHandle(DeviceHandle);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = GetLastError();
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync static int sLogged = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (!sLogged)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LogRel(("VBOXNP: vbsfIOCTL: Error opening device, last error = %d\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync sLogged++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPGetCaps(DWORD nIndex)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD rc = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: GetNetCaps: Index = 0x%x\n", nIndex));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync switch (nIndex)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_SPEC_VERSION:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync rc = WNNC_SPEC_VERSION51;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync } break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_NET_TYPE:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync rc = WNNC_NET_RDR2SAMPLE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync } break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_DRIVER_VERSION:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync rc = WNNC_DRIVER(1, 0);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync } break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_CONNECTION:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync vbsfIOCTL(IOCTL_MRX_VBOX_START, NULL, 0, NULL, NULL);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync rc = WNNC_CON_GETCONNECTIONS |
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WNNC_CON_CANCELCONNECTION |
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WNNC_CON_ADDCONNECTION |
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WNNC_CON_ADDCONNECTION3;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync } break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_ENUMERATION:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync rc = WNNC_ENUM_LOCAL |
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WNNC_ENUM_GLOBAL |
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WNNC_ENUM_SHAREABLE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync } break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_START:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync rc = WNNC_WAIT_FOR_START;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_DIALOG:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync rc = WNNC_DLG_GETRESOURCEPARENT |
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WNNC_DLG_GETRESOURCEINFORMATION;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync } break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_USER:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case WNNC_ADMIN:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync default:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync rc = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync } break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return rc;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPLogonNotify(PLUID lpLogonId,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPCWSTR lpAuthentInfoType,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpAuthentInfo,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPCWSTR lpPreviousAuthentInfoType,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpPreviousAuthentInfo,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR lpStationName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID StationHandle,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR *lpLogonScript)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPLogonNotify\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpLogonScript = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPPasswordChangeNotify(LPCWSTR lpAuthentInfoType,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpAuthentInfo,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPCWSTR lpPreviousAuthentInfoType,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpPreviousAuthentInfo,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR lpStationName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID StationHandle,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwChangeInfo)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPPasswordChangeNotify\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync SetLastError(WN_NOT_SUPPORTED);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_NOT_SUPPORTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPAddConnection(LPNETRESOURCE lpNetResource,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR lpPassword,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR lpUserName)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPAddConnection\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return NPAddConnection3(NULL, lpNetResource, lpPassword, lpUserName, 0);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPAddConnection3(HWND hwndOwner,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPNETRESOURCE lpNetResource,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR lpPassword,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR lpUserName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwFlags)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwStatus = WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR ConnectionName[256];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR LocalName[3];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BOOLEAN fLocalName = TRUE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPAddConnection3: dwFlags = 0x%x\n", dwFlags));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPAddConnection3: Local Name: %ls\n", lpNetResource->lpLocalName ));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPAddConnection3: Remote Name: %ls\n", lpNetResource->lpRemoteName ));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpNetResource->dwType != RESOURCETYPE_DISK
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && lpNetResource->dwType != RESOURCETYPE_ANY)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPAddConnection3: Incorrect net resource type %d\n", lpNetResource->dwType));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Build connection name: \Device\VBoxMiniRdr\;%DriveLetter%:\vboxsvr\share */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcpy(ConnectionName, DD_MRX_VBOX_FS_DEVICE_NAME_U);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcat(ConnectionName, L"\\;");
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpNetResource->lpLocalName == NULL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[0] = L'\0';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync fLocalName = FALSE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpNetResource->lpLocalName[0]
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && lpNetResource->lpLocalName[1] == L':')
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[0] = vboxToUpper(lpNetResource->lpLocalName[0]);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[1] = L':';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[2] = L'\0';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcat(ConnectionName, LocalName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_BAD_LOCALNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
2888816fbcb216a2dbc97a95fa5a50b6caa09e32vboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus == WN_SUCCESS)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Append the remote name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpNetResource->lpRemoteName
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && lpNetResource->lpRemoteName[0] == L'\\'
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && lpNetResource->lpRemoteName[1] == L'\\' )
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* No need for (lstrlen + 1), because 'lpNetResource->lpRemoteName' leading \ is not copied. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lstrlen(ConnectionName) + lstrlen(lpNetResource->lpRemoteName) <= sizeof(ConnectionName) / sizeof(WCHAR))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcat(ConnectionName, &lpNetResource->lpRemoteName[1]);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPAddConnection3: ConnectionName: [%ls], len %d, dwStatus 0x%08X\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionName, (lstrlen(ConnectionName) + 1) * sizeof(WCHAR), dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus == WN_SUCCESS)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR wszTmp[128];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync SetLastError(NO_ERROR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( fLocalName
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && QueryDosDevice(LocalName, wszTmp, sizeof(wszTmp) / sizeof(WCHAR)))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPAddConnection3: Connection [%ls] already connected.\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_ALREADY_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( !fLocalName
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || GetLastError() == ERROR_FILE_NOT_FOUND)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_ADDCONN,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync (lstrlen(ConnectionName) + 1) * sizeof(WCHAR),
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus == WN_SUCCESS)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( fLocalName
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && !DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_NO_BROADCAST_SYSTEM,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpNetResource->lpLocalName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionName))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = GetLastError();
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_ALREADY_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPAddConnection3: Returned 0x%08X\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPCancelConnection(LPWSTR lpName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BOOL fForce)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwStatus = WN_NOT_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPCancelConnection: Name = %ls\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpName && lpName[0] != 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR ConnectionName[256];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpName[1] == L':')
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR RemoteName[128];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR LocalName[3];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[0] = vboxToUpper(lpName[0]);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[1] = L':';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[2] = L'\0';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG cbOut = sizeof(RemoteName) - sizeof(WCHAR); /* Trailing NULL. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_GETCONN,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync sizeof(LocalName),
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync (PVOID)RemoteName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync &cbOut);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( dwStatus == WN_SUCCESS
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && cbOut > 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteName[cbOut / sizeof(WCHAR)] = L'\0';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lstrlen(DD_MRX_VBOX_FS_DEVICE_NAME_U) + 2 + lstrlen(LocalName) + lstrlen(RemoteName) + 1 > sizeof(ConnectionName) / sizeof(WCHAR))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcpy(ConnectionName, DD_MRX_VBOX_FS_DEVICE_NAME_U);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcat(ConnectionName, L"\\;");
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcat(ConnectionName, LocalName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcat(ConnectionName, RemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_DELCONN,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync (lstrlen(ConnectionName) + 1) * sizeof(WCHAR),
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus == WN_SUCCESS)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (!DefineDosDevice(DDD_REMOVE_DEFINITION | DDD_RAW_TARGET_PATH | DDD_EXACT_MATCH_ON_REMOVE,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionName))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = GetLastError();
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NOT_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BOOLEAN Verifier;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier = ( lpName[0] == L'\\' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[1] == L'V' ) || ( lpName[1] == L'v' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[2] == L'B' ) || ( lpName[2] == L'b' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[3] == L'O' ) || ( lpName[3] == L'o' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[4] == L'X' ) || ( lpName[4] == L'x' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[5] == L'S' ) || ( lpName[5] == L's' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Both vboxsvr & vboxsrv are now accepted */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (( lpName[6] == L'V' ) || ( lpName[6] == L'v'))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[6] == L'V' ) || ( lpName[6] == L'v' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[7] == L'R' ) || ( lpName[7] == L'r' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[6] == L'R' ) || ( lpName[6] == L'r' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[7] == L'V' ) || ( lpName[7] == L'v' );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Verifier &= ( lpName[8] == L'\\') || ( lpName[8] == 0 );
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (Verifier)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Full remote path */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lstrlen(DD_MRX_VBOX_FS_DEVICE_NAME_U) + 2 + lstrlen(lpName) + 1 > sizeof(ConnectionName) / sizeof(WCHAR))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcpy(ConnectionName, DD_MRX_VBOX_FS_DEVICE_NAME_U);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcat(ConnectionName, L"\\;");
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcat(ConnectionName, lpName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_DELCONN,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync (lstrlen(ConnectionName) + 1) * sizeof(WCHAR),
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NOT_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPCancelConnection: Returned 0x%08X\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPGetConnection(LPWSTR lpLocalName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR lpRemoteName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPDWORD lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwStatus = WN_NOT_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR RemoteName[128];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG cbOut = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetConnection: lpLocalName = %ls\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpLocalName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpLocalName && lpLocalName[0] != 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpLocalName[1] == L':')
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR LocalName[3];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbOut = sizeof(RemoteName) - sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteName[cbOut / sizeof(WCHAR)] = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[0] = vboxToUpper(lpLocalName[0]);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[1] = L':';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[2] = L'\0';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_GETCONN,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync sizeof(LocalName),
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync (PVOID)RemoteName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync &cbOut);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus != NO_ERROR)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* The device specified by lpLocalName is not redirected by this provider. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NOT_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteName[cbOut / sizeof(WCHAR)] = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cbOut == 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NO_NETWORK;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus == WN_SUCCESS)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG cbRemoteName = (lstrlen(RemoteName) + 1) * sizeof (WCHAR); /* Including the trailing 0. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync Log(("VBOXNP: NPGetConnection: RemoteName: %ls, cb %d\n",
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync RemoteName, cbRemoteName));
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD len = sizeof(WCHAR) + cbRemoteName; /* Including the leading '\'. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*lpBufferSize >= len)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpRemoteName[0] = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(&lpRemoteName[1], RemoteName, cbRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetConnection: returning lpRemoteName: %ls\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpRemoteName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*lpBufferSize != 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Log only real errors. Do not log a 0 bytes try. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetConnection: Buffer overflow: *lpBufferSize = %d, len = %d\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize, len));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_MORE_DATA;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize = len;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ((dwStatus != WN_SUCCESS) &&
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync (dwStatus != WN_MORE_DATA))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetConnection: Returned error 0x%08X\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncstatic const WCHAR *vboxSkipServerPrefix(const WCHAR *lpRemoteName, const WCHAR *lpPrefix)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync while (*lpPrefix)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (vboxToUpper(*lpPrefix) != vboxToUpper(*lpRemoteName))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Not a prefix */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpPrefix++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpRemoteName++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return lpRemoteName;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncstatic const WCHAR *vboxSkipServerName(const WCHAR *lpRemoteName)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync int cLeadingBackslashes = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync while (*lpRemoteName == L'\\')
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpRemoteName++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cLeadingBackslashes++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cLeadingBackslashes == 0 || cLeadingBackslashes == 2)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync const WCHAR *lpAfterPrefix = vboxSkipServerPrefix(lpRemoteName, MRX_VBOX_SERVER_NAME_U);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (!lpAfterPrefix)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpAfterPrefix = vboxSkipServerPrefix(lpRemoteName, MRX_VBOX_SERVER_NAME_ALT_U);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return lpAfterPrefix;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync/* Enumerate shared folders as hierarchy:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * VBOXSVR(container)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * +--------------------+
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * | \
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * Folder1(connectable) FolderN(connectable)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsynctypedef struct _NPENUMCTX
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG index; /* Index of last entry returned. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwScope;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwOriginalScope;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwType;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwUsage;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync bool fRoot;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync} NPENUMCTX;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPOpenEnum(DWORD dwScope,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwType,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwUsage,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPNETRESOURCE lpNetResource,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPHANDLE lphEnum)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPOpenEnum: dwScope 0x%08X, dwType 0x%08X, dwUsage 0x%08X, lpNetResource %p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwScope, dwType, dwUsage, lpNetResource));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwUsage == 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* The bitmask may be zero to match all of the flags. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwUsage = RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lphEnum = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Allocate the context structure. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NPENUMCTX *pCtx = (NPENUMCTX *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NPENUMCTX));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pCtx == NULL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_OUT_OF_MEMORY;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpNetResource && lpNetResource->lpRemoteName)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPOpenEnum: lpRemoteName %ls\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpNetResource->lpRemoteName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync switch (dwScope)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case 6: /* Advertised as WNNC_ENUM_SHAREABLE. This returns C$ system shares.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * NpEnumResource will return NO_MORE_ENTRIES.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpNetResource == NULL || lpNetResource->lpRemoteName == NULL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* If it is NULL or if the lpRemoteName field of the NETRESOURCE is NULL,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * the provider should enumerate the top level of its network.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * But system shares can't be on top level.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NOT_CONTAINER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync const WCHAR *lpAfterName = vboxSkipServerName(lpNetResource->lpRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpAfterName == NULL
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || (*lpAfterName != L'\\' && *lpAfterName != 0))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NOT_CONTAINER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Valid server name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->index = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwScope = 6;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwOriginalScope = dwScope;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwType = dwType;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwUsage = dwUsage;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case RESOURCE_GLOBALNET: /* All resources on the network. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpNetResource == NULL || lpNetResource->lpRemoteName == NULL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* If it is NULL or if the lpRemoteName field of the NETRESOURCE is NULL,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * the provider should enumerate the top level of its network.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->fRoot = true;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Enumerate lpNetResource->lpRemoteName container, which can be only the VBOXSVR container. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync const WCHAR *lpAfterName = vboxSkipServerName(lpNetResource->lpRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpAfterName == NULL
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || (*lpAfterName != L'\\' && *lpAfterName != 0))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NOT_CONTAINER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Valid server name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->fRoot = false;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->index = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwScope = RESOURCE_GLOBALNET;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwOriginalScope = dwScope;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwType = dwType;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwUsage = dwUsage;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case RESOURCE_CONNECTED: /* All currently connected resources. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case RESOURCE_CONTEXT: /* The interpretation of this is left to the provider. Treat this as RESOURCE_GLOBALNET. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->index = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwScope = RESOURCE_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwOriginalScope = dwScope;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwType = dwType;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwUsage = dwUsage;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->fRoot = false; /* Actually ignored for RESOURCE_CONNECTED. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync default:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPOpenEnum: unsupported scope 0x%lx\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwScope));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NOT_SUPPORTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus != WN_SUCCESS)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
2888816fbcb216a2dbc97a95fa5a50b6caa09e32vboxsync Log(("VBOXNP: NPOpenEnum: Returned error 0x%08X\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pCtx)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync HeapFree(GetProcessHeap(), 0, pCtx);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPOpenEnum: pCtx %p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lphEnum = pCtx;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPEnumResource(HANDLE hEnum,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPDWORD lpcCount,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpBuffer,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPDWORD lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwStatus = WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NPENUMCTX *pCtx = (NPENUMCTX *)hEnum;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BYTE ConnectionList[26];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG cbOut;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR LocalName[3];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR RemoteName[128];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync int cbRemoteName;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG cbEntry = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: hEnum %p, lpcCount %p, lpBuffer %p, lpBufferSize %p.\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync hEnum, lpcCount, lpBuffer, lpBufferSize));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pCtx == NULL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: WN_BAD_HANDLE\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_HANDLE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpcCount == NULL || lpBuffer == NULL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: WN_BAD_VALUE\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_VALUE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: *lpcCount 0x%x, *lpBufferSize 0x%x, pCtx->index %d\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpcCount, *lpBufferSize, pCtx->index));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPNETRESOURCE pNetResource = (LPNETRESOURCE)lpBuffer;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG cbRemaining = *lpBufferSize;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ULONG cEntriesCopied = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync PWCHAR pStrings = (PWCHAR)((PBYTE)lpBuffer + *lpBufferSize);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync PWCHAR pDst;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pCtx->dwScope == RESOURCE_CONNECTED)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: RESOURCE_CONNECTED\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(ConnectionList, 0, sizeof(ConnectionList));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbOut = sizeof(ConnectionList);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_GETLIST,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL, 0,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionList,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync &cbOut);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus == WN_SUCCESS && cbOut > 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync while (cEntriesCopied < *lpcCount && pCtx->index < RTL_NUMBER_OF(ConnectionList))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (ConnectionList[pCtx->index])
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[0] = L'A' + (WCHAR)pCtx->index;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[1] = L':';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName[2] = L'\0';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(RemoteName, 0, sizeof(RemoteName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbOut = sizeof(RemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_GETCONN,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync sizeof(LocalName),
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync &cbOut);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus != WN_SUCCESS || cbOut == 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NO_MORE_ENTRIES;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* How many bytes is needed for the current NETRESOURCE data. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbRemoteName = (lstrlen(RemoteName) + 1) * sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry = sizeof(NETRESOURCE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(LocalName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(WCHAR) + cbRemoteName; /* Leading \. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(MRX_VBOX_PROVIDER_NAME_U);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cbEntry > cbRemaining)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbRemaining -= cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(pNetResource, 0, sizeof (*pNetResource));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwScope = RESOURCE_CONNECTED;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwType = RESOURCETYPE_DISK;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwUsage = RESOURCEUSAGE_CONNECTABLE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Reserve the space in the string area. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings = (PWCHAR)((PBYTE)pStrings - (cbEntry - sizeof(NETRESOURCE)));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pDst = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpLocalName = pDst;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L'A' + (WCHAR)pCtx->index;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L':';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L'\0';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName = pDst;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pDst, RemoteName, cbRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pDst += cbRemoteName / sizeof(WCHAR);
2888816fbcb216a2dbc97a95fa5a50b6caa09e32vboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpComment = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpProvider = pDst;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pDst, MRX_VBOX_PROVIDER_NAME_U, sizeof(MRX_VBOX_PROVIDER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: lpRemoteName: %ls\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cEntriesCopied++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->index++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NO_MORE_ENTRIES;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else if (pCtx->dwScope == RESOURCE_GLOBALNET)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: RESOURCE_GLOBALNET: root %d\n", pCtx->fRoot));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pCtx->fRoot)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* VBOXSVR container. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pCtx->index > 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NO_MORE_ENTRIES;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Return VBOXSVR server.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * Determine the space needed for this entry.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry = sizeof(NETRESOURCE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += 2 * sizeof(WCHAR) + sizeof(MRX_VBOX_SERVER_NAME_U); /* \\ + the server name */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(MRX_VBOX_PROVIDER_NAME_U);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cbEntry > cbRemaining)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Do nothing. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbRemaining -= cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(pNetResource, 0, sizeof (*pNetResource));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwScope = RESOURCE_GLOBALNET;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwType = RESOURCETYPE_ANY;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_SERVER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwUsage = RESOURCEUSAGE_CONTAINER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings = (PWCHAR)((PBYTE)pStrings - (cbEntry - sizeof(NETRESOURCE)));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pDst = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpLocalName = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName = pDst;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pDst, MRX_VBOX_SERVER_NAME_U, sizeof(MRX_VBOX_SERVER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pDst += sizeof(MRX_VBOX_SERVER_NAME_U) / sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpComment = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpProvider = pDst;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pDst, MRX_VBOX_PROVIDER_NAME_U, sizeof(MRX_VBOX_PROVIDER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cEntriesCopied++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->index++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Shares of VBOXSVR. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(ConnectionList, 0, sizeof (ConnectionList));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbOut = sizeof(ConnectionList);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_GETGLOBALLIST,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NULL,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync 0,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync ConnectionList,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync &cbOut);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus == WN_SUCCESS && cbOut > 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync while (cEntriesCopied < *lpcCount && pCtx->index < RTL_NUMBER_OF(ConnectionList))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (ConnectionList[pCtx->index])
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(RemoteName, 0, sizeof(RemoteName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbOut = sizeof(RemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = vbsfIOCTL(IOCTL_MRX_VBOX_GETGLOBALCONN,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync &ConnectionList[pCtx->index],
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync sizeof(ConnectionList[pCtx->index]),
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteName,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync &cbOut);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus != WN_SUCCESS || cbOut == 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NO_MORE_ENTRIES;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* How many bytes is needed for the current NETRESOURCE data. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbRemoteName = (lstrlen(RemoteName) + 1) * sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry = sizeof(NETRESOURCE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Remote name: \\ + vboxsvr + \ + name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += 2 * sizeof(WCHAR) + sizeof(MRX_VBOX_SERVER_NAME_U) + cbRemoteName;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(MRX_VBOX_PROVIDER_NAME_U);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cbEntry > cbRemaining)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbRemaining -= cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(pNetResource, 0, sizeof (*pNetResource));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwScope = pCtx->dwOriginalScope;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwType = RESOURCETYPE_DISK;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwUsage = RESOURCEUSAGE_CONNECTABLE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings = (PWCHAR)((PBYTE)pStrings - (cbEntry - sizeof(NETRESOURCE)));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pDst = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpLocalName = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName = pDst;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pDst, MRX_VBOX_SERVER_NAME_U, sizeof(MRX_VBOX_SERVER_NAME_U) - sizeof(WCHAR));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pDst += sizeof(MRX_VBOX_SERVER_NAME_U) / sizeof(WCHAR) - 1;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pDst++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pDst, RemoteName, cbRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pDst += cbRemoteName / sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpComment = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpProvider = pDst;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pDst, MRX_VBOX_PROVIDER_NAME_U, sizeof(MRX_VBOX_PROVIDER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: lpRemoteName: %ls\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cEntriesCopied++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->index++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NO_MORE_ENTRIES;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else if (pCtx->dwScope == 6)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: dwScope 6\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NO_MORE_ENTRIES;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: invalid dwScope 0x%x\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pCtx->dwScope));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_HANDLE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpcCount = cEntriesCopied;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cEntriesCopied == 0 && dwStatus == WN_SUCCESS)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pCtx->index >= RTL_NUMBER_OF(ConnectionList))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_NO_MORE_ENTRIES;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: More Data Needed - %d\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize = cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_MORE_DATA;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPEnumResource: Entries returned %d, dwStatus 0x%08X\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cEntriesCopied, dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPCloseEnum(HANDLE hEnum)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwStatus = WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NPENUMCTX *pCtx = (NPENUMCTX *)hEnum;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPCloseEnum: hEnum %p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync hEnum));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pCtx)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync HeapFree(GetProcessHeap(), 0, pCtx);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPCloseEnum: returns\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPGetResourceParent(LPNETRESOURCE lpNetResource,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpBuffer,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPDWORD lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceParent: lpNetResource %p, lpBuffer %p, lpBufferSize %p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpNetResource, lpBuffer, lpBufferSize));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Construct a new NETRESOURCE which is syntactically a parent of lpNetResource,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * then call NPGetResourceInformation to actually fill the buffer.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (!lpNetResource || !lpNetResource->lpRemoteName || !lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync const WCHAR *lpAfterName = vboxSkipServerName(lpNetResource->lpRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpAfterName == NULL
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || (*lpAfterName != L'\\' && *lpAfterName != 0))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceParent: WN_BAD_NETNAME\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD RemoteNameLength = lstrlen(lpNetResource->lpRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD cbEntry = sizeof (NETRESOURCE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += (RemoteNameLength + 1) * sizeof (WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NETRESOURCE *pParent = (NETRESOURCE *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbEntry);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (!pParent)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_OUT_OF_MEMORY;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pParent->lpRemoteName = (WCHAR *)((PBYTE)pParent + sizeof (NETRESOURCE));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcpy(pParent->lpRemoteName, lpNetResource->lpRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Remove last path component of the pParent->lpRemoteName. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR *pLastSlash = pParent->lpRemoteName + RemoteNameLength;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*pLastSlash == L'\\')
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* \\server\share\path\, skip last slash immediately. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pLastSlash--;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync while (pLastSlash != pParent->lpRemoteName)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*pLastSlash == L'\\')
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pLastSlash--;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwStatus = WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( pLastSlash == pParent->lpRemoteName
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || pLastSlash == pParent->lpRemoteName + 1)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* It is a leading backslash. Construct "no parent" NETRESOURCE. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NETRESOURCE *pNetResource = (NETRESOURCE *)lpBuffer;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry = sizeof(NETRESOURCE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(MRX_VBOX_PROVIDER_NAME_U); /* remote name */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(MRX_VBOX_PROVIDER_NAME_U); /* provider name */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cbEntry > *lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceParent: WN_MORE_DATA 0x%x\n", cbEntry));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize = cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = WN_MORE_DATA;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset (pNetResource, 0, sizeof (*pNetResource));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwType = RESOURCETYPE_ANY;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_NETWORK;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwUsage = RESOURCEUSAGE_CONTAINER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR *pStrings = (WCHAR *)((PBYTE)lpBuffer + *lpBufferSize);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings = (PWCHAR)((PBYTE)pStrings - (cbEntry - sizeof(NETRESOURCE)));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory (pStrings, MRX_VBOX_PROVIDER_NAME_U, sizeof(MRX_VBOX_PROVIDER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += sizeof(MRX_VBOX_PROVIDER_NAME_U) / sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpProvider = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory (pStrings, MRX_VBOX_PROVIDER_NAME_U, sizeof(MRX_VBOX_PROVIDER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += sizeof(MRX_VBOX_PROVIDER_NAME_U) / sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceParent: no parent, strings %p/%p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings, (PBYTE)lpBuffer + *lpBufferSize));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Make the parent remote name and get its information. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pLastSlash = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR lpSystem = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = NPGetResourceInformation (pParent, lpBuffer, lpBufferSize, &lpSystem);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (pParent)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync HeapFree(GetProcessHeap(), 0, pParent);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPGetResourceInformation(LPNETRESOURCE lpNetResource,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpBuffer,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPDWORD lpBufferSize,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPWSTR *lplpSystem)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: lpNetResource %p, lpBuffer %p, lpBufferSize %p, lplpSystem %p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpNetResource, lpBuffer, lpBufferSize, lplpSystem));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpNetResource == NULL
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || lpNetResource->lpRemoteName == NULL
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || lpBufferSize == NULL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: WN_BAD_VALUE\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_VALUE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: lpRemoteName %ls, *lpBufferSize 0x%x\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpNetResource->lpRemoteName, *lpBufferSize));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync const WCHAR *lpAfterName = vboxSkipServerName(lpNetResource->lpRemoteName);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpAfterName == NULL
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || (*lpAfterName != L'\\' && *lpAfterName != 0))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: WN_BAD_NETNAME\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_NETNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpNetResource->dwType != 0 && lpNetResource->dwType != RESOURCETYPE_DISK)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* The caller passed in a nonzero dwType that does not match
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * the actual type of the network resource.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_DEV_TYPE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /*
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * If the input remote resource name was "\\server\share\dir1\dir2",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * then the output NETRESOURCE contains information about the resource "\\server\share".
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * The lpRemoteName, lpProvider, dwType, dwDisplayType, and dwUsage fields are returned
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * containing values, all other fields being set to NULL.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR *pStrings = (WCHAR *)((PBYTE)lpBuffer + *lpBufferSize);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync NETRESOURCE *pNetResource = (NETRESOURCE *)lpBuffer;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Check what kind of the resource is that by parsing path components.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * lpAfterName points to first WCHAR after a valid server name.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lpAfterName[0] == 0 || lpAfterName[1] == 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* "\\VBOXSVR" or "\\VBOXSVR\" */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry = sizeof(NETRESOURCE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += 2 * sizeof(WCHAR) + sizeof(MRX_VBOX_SERVER_NAME_U); /* \\ + server name */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(MRX_VBOX_PROVIDER_NAME_U); /* provider name */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cbEntry > *lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: WN_MORE_DATA 0x%x\n", cbEntry));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize = cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_MORE_DATA;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(pNetResource, 0, sizeof (*pNetResource));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwType = RESOURCETYPE_ANY;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_SERVER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwUsage = RESOURCEUSAGE_CONTAINER;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings = (PWCHAR)((PBYTE)pStrings - (cbEntry - sizeof(NETRESOURCE)));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pStrings++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pStrings++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory (pStrings, MRX_VBOX_SERVER_NAME_U, sizeof(MRX_VBOX_SERVER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += sizeof(MRX_VBOX_SERVER_NAME_U) / sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpProvider = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory (pStrings, MRX_VBOX_PROVIDER_NAME_U, sizeof(MRX_VBOX_PROVIDER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += sizeof(MRX_VBOX_PROVIDER_NAME_U) / sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: lpRemoteName: %ls, strings %p/%p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName, pStrings, (PBYTE)lpBuffer + *lpBufferSize));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lplpSystem)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lplpSystem = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* *lpAfterName == L'\\', could be share or share + path.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync * Check if there are more path components after the share name.
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync const WCHAR *lp = lpAfterName + 1;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync while (*lp && *lp != L'\\')
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lp++;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*lp == 0)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* It is a share only: \\vboxsvr\share */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry = sizeof(NETRESOURCE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += 2 * sizeof(WCHAR) + sizeof(MRX_VBOX_SERVER_NAME_U); /* \\ + server name with trailing nul */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += (DWORD)((lp - lpAfterName) * sizeof(WCHAR)); /* The share name with leading \\ */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(MRX_VBOX_PROVIDER_NAME_U); /* provider name */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cbEntry > *lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: WN_MORE_DATA 0x%x\n", cbEntry));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize = cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_MORE_DATA;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(pNetResource, 0, sizeof (*pNetResource));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwType = RESOURCETYPE_DISK;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwUsage = RESOURCEUSAGE_CONNECTABLE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings = (PWCHAR)((PBYTE)pStrings - (cbEntry - sizeof(NETRESOURCE)));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pStrings++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pStrings++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pStrings, MRX_VBOX_SERVER_NAME_U, sizeof(MRX_VBOX_SERVER_NAME_U) - sizeof (WCHAR));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += sizeof(MRX_VBOX_SERVER_NAME_U) / sizeof(WCHAR) - 1;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory (pStrings, lpAfterName, (lp - lpAfterName + 1) * sizeof(WCHAR));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += lp - lpAfterName + 1;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpProvider = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pStrings, MRX_VBOX_PROVIDER_NAME_U, sizeof(MRX_VBOX_PROVIDER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += sizeof(MRX_VBOX_PROVIDER_NAME_U) / sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: lpRemoteName: %ls, strings %p/%p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName, pStrings, (PBYTE)lpBuffer + *lpBufferSize));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lplpSystem)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lplpSystem = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* \\vboxsvr\share\path */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry = sizeof(NETRESOURCE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += 2 * sizeof(WCHAR) + sizeof(MRX_VBOX_SERVER_NAME_U); /* \\ + server name with trailing nul */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += (DWORD)((lp - lpAfterName) * sizeof(WCHAR)); /* The share name with leading \\ */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += sizeof(MRX_VBOX_PROVIDER_NAME_U); /* provider name */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync cbEntry += (lstrlen(lp) + 1) * sizeof (WCHAR); /* path string for lplpSystem */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (cbEntry > *lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: WN_MORE_DATA 0x%x\n", cbEntry));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize = cbEntry;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_MORE_DATA;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync memset(pNetResource, 0, sizeof (*pNetResource));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwType = RESOURCETYPE_DISK;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->dwUsage = RESOURCEUSAGE_CONNECTABLE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings = (PWCHAR)((PBYTE)pStrings - (cbEntry - sizeof(NETRESOURCE)));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* The server + share. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pStrings++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pStrings++ = L'\\';
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory (pStrings, MRX_VBOX_SERVER_NAME_U, sizeof(MRX_VBOX_SERVER_NAME_U) - sizeof (WCHAR));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += sizeof(MRX_VBOX_SERVER_NAME_U) / sizeof(WCHAR) - 1;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pStrings, lpAfterName, (lp - lpAfterName) * sizeof(WCHAR));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += lp - lpAfterName;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *pStrings++ = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpProvider = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(pStrings, MRX_VBOX_PROVIDER_NAME_U, sizeof(MRX_VBOX_PROVIDER_NAME_U));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += sizeof(MRX_VBOX_PROVIDER_NAME_U) / sizeof(WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (lplpSystem)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lplpSystem = pStrings;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lstrcpy(pStrings, lp);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pStrings += lstrlen(lp) + 1;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: lpRemoteName: %ls, strings %p/%p\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pNetResource->lpRemoteName, pStrings, (PBYTE)lpBuffer + *lpBufferSize));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetResourceInformation: *lplpSystem: %ls\n", *lplpSystem));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncDWORD APIENTRY NPGetUniversalName(LPCWSTR lpLocalPath,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwInfoLevel,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpBuffer,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPDWORD lpBufferSize)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD BufferRequired = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD RemoteNameLength = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD RemainingPathLength = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR LocalDrive[3];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync const WCHAR *lpRemainingPath;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR *lpString;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: lpLocalPath = %ls, InfoLevel = %d, *lpBufferSize = %d\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpLocalPath, dwInfoLevel, *lpBufferSize));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Check is input parameter is OK. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( dwInfoLevel != UNIVERSAL_NAME_INFO_LEVEL
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && dwInfoLevel != REMOTE_NAME_INFO_LEVEL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: Bad dwInfoLevel value: %d\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwInfoLevel));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_LEVEL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* The 'lpLocalPath' is "X:\something". Extract the "X:" to pass to NPGetConnection. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( lpLocalPath == NULL
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || lpLocalPath[0] == 0
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync || lpLocalPath[1] != L':')
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: Bad lpLocalPath.\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_BAD_LOCALNAME;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalDrive[0] = lpLocalPath[0];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalDrive[1] = lpLocalPath[1];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LocalDrive[2] = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Length of the original path without the driver letter, including trailing NULL. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpRemainingPath = &lpLocalPath[2];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemainingPathLength = (DWORD)((wcslen(lpRemainingPath) + 1) * sizeof(WCHAR));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Build the required structure in place of the supplied buffer. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwInfoLevel == UNIVERSAL_NAME_INFO_LEVEL)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPUNIVERSAL_NAME_INFOW pUniversalNameInfo = (LPUNIVERSAL_NAME_INFOW)lpBuffer;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired = sizeof (UNIVERSAL_NAME_INFOW);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*lpBufferSize >= BufferRequired)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Enough place for the structure. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pUniversalNameInfo->lpUniversalName = (PWCHAR)((PBYTE)lpBuffer + sizeof(UNIVERSAL_NAME_INFOW));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* At least so many bytes are available for obtaining the remote name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteNameLength = *lpBufferSize - BufferRequired;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteNameLength = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Put the remote name directly to the buffer if possible and get the name length. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = NPGetConnection(LocalDrive,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteNameLength? pUniversalNameInfo->lpUniversalName: NULL,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync &RemoteNameLength);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( dwStatus != WN_SUCCESS
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && dwStatus != WN_MORE_DATA)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus != WN_NOT_CONNECTED)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: NPGetConnection returned error 0x%lx\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (RemoteNameLength < sizeof (WCHAR))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: Remote name is empty.\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_NO_NETWORK;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Adjust for actual remote name length. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired += RemoteNameLength;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* And for required place for remaining path. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired += RemainingPathLength;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*lpBufferSize < BufferRequired)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: WN_MORE_DATA BufferRequired: %d\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize = BufferRequired;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_MORE_DATA;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Enough memory in the buffer. Add '\' and remaining path to the remote name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpString = &pUniversalNameInfo->lpUniversalName[RemoteNameLength / sizeof (WCHAR)];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpString--; /* Trailing NULL */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory(lpString, lpRemainingPath, RemainingPathLength);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPREMOTE_NAME_INFOW pRemoteNameInfo = (LPREMOTE_NAME_INFOW)lpBuffer;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync WCHAR *lpDelimiter;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired = sizeof (REMOTE_NAME_INFOW);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*lpBufferSize >= BufferRequired)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Enough place for the structure. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pRemoteNameInfo->lpUniversalName = (PWCHAR)((PBYTE)lpBuffer + sizeof(REMOTE_NAME_INFOW));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pRemoteNameInfo->lpConnectionName = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pRemoteNameInfo->lpRemainingPath = NULL;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* At least so many bytes are available for obtaining the remote name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteNameLength = *lpBufferSize - BufferRequired;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync else
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync RemoteNameLength = 0;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Put the remote name directly to the buffer if possible and get the name length. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync dwStatus = NPGetConnection(LocalDrive, RemoteNameLength? pRemoteNameInfo->lpUniversalName: NULL, &RemoteNameLength);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if ( dwStatus != WN_SUCCESS
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync && dwStatus != WN_MORE_DATA)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (dwStatus != WN_NOT_CONNECTED)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: NPGetConnection returned error 0x%lx\n", dwStatus));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return dwStatus;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (RemoteNameLength < sizeof (WCHAR))
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: Remote name is empty.\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_NO_NETWORK;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync /* Adjust for actual remote name length as a part of the universal name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired += RemoteNameLength;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync /* And for required place for remaining path as a part of the universal name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired += RemainingPathLength;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* lpConnectionName, which is the remote name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired += RemoteNameLength;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* lpRemainingPath. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired += RemainingPathLength;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync if (*lpBufferSize < BufferRequired)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: WN_MORE_DATA BufferRequired: %d\n",
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BufferRequired));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync *lpBufferSize = BufferRequired;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_MORE_DATA;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /* Enough memory in the buffer. Add \ and remaining path to the remote name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpString = &pRemoteNameInfo->lpUniversalName[RemoteNameLength / sizeof (WCHAR)];
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpString--; /* Trailing NULL */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync lpDelimiter = lpString; /* Delimiter between the remote name and the remaining path.
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync * May be 0 if the remaining path is empty.
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory( lpString, lpRemainingPath, RemainingPathLength);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpString += RemainingPathLength / sizeof (WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync *lpDelimiter = 0; /* Keep NULL terminated remote name. */
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pRemoteNameInfo->lpConnectionName = lpString;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory( lpString, pRemoteNameInfo->lpUniversalName, RemoteNameLength);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync lpString += RemoteNameLength / sizeof (WCHAR);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync pRemoteNameInfo->lpRemainingPath = lpString;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync CopyMemory( lpString, lpRemainingPath, RemainingPathLength);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync /* If remaining path was not empty, restore the delimiter in the universal name. */
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync if (RemainingPathLength > sizeof(WCHAR))
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync {
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync *lpDelimiter = L'\\';
23844f754fdbba6b0bd5dbf579d765e2f0f3bdc7vboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync Log(("VBOXNP: NPGetUniversalName: WN_SUCCESS\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return WN_SUCCESS;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsyncBOOL WINAPI DllMain(HINSTANCE hDLLInst,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync DWORD fdwReason,
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LPVOID lpvReserved)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync{
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync BOOL fReturn = TRUE;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync switch (fdwReason)
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync {
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case DLL_PROCESS_ATTACH:
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync RTR3InitDll(RTR3INIT_FLAGS_UNOBTRUSIVE);
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync VbglR3Init();
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LogRel(("VBOXNP: DLL loaded.\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case DLL_PROCESS_DETACH:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync LogRel(("VBOXNP: DLL unloaded.\n"));
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync VbglR3Term();
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync /// @todo RTR3Term();
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case DLL_THREAD_ATTACH:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync case DLL_THREAD_DETACH:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync default:
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync break;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync }
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync return fReturn;
09c9a430ad2caac61753f90b04a4989c6d54d13avboxsync}