VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxSharedFolders.cpp@ 63107

Last change on this file since 63107 was 62522, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.4 KB
Line 
1/* $Id: VBoxSharedFolders.cpp 62522 2016-07-22 19:17:25Z vboxsync $ */
2/** @file
3 * VBoxSharedFolders - Handling for shared folders
4 */
5
6/*
7 * Copyright (C) 2010-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#include "VBoxSharedFolders.h"
19#include "VBoxTray.h"
20#include "VBoxHelpers.h"
21
22#include <iprt/mem.h>
23#include <VBox/VBoxGuestLib.h>
24
25#ifdef DEBUG
26# define LOG_ENABLED
27# define LOG_GROUP LOG_GROUP_DEFAULT
28#endif
29#include <VBox/log.h>
30
31
32
33int VBoxSharedFoldersAutoMount(void)
34{
35 uint32_t u32ClientId;
36 int rc = VbglR3SharedFolderConnect(&u32ClientId);
37 if (RT_SUCCESS(rc))
38 {
39 uint32_t cMappings;
40 VBGLR3SHAREDFOLDERMAPPING *paMappings;
41
42 rc = VbglR3SharedFolderGetMappings(u32ClientId, true /* Only process auto-mounted folders */,
43 &paMappings, &cMappings);
44 if (RT_SUCCESS(rc))
45 {
46#if 0
47 /* Check for a fixed/virtual auto-mount share. */
48 if (VbglR3SharedFolderExists(u32ClientId, "vbsfAutoMount"))
49 {
50 LogFlowFunc(("Hosts supports auto-mount root\n"));
51 }
52 else
53 {
54#endif
55 LogFlowFunc(("Got %u shared folder mappings\n", cMappings));
56 for (uint32_t i = 0; i < cMappings && RT_SUCCESS(rc); i++)
57 {
58 char *pszName = NULL;
59 rc = VbglR3SharedFolderGetName(u32ClientId, paMappings[i].u32Root, &pszName);
60 if ( RT_SUCCESS(rc)
61 && *pszName)
62 {
63 LogFlowFunc(("Connecting share %u (%s) ...\n", i+1, pszName));
64
65 char *pszShareName;
66 if (RTStrAPrintf(&pszShareName, "\\\\vboxsrv\\%s", pszName) >= 0)
67 {
68 char chDrive = 'D'; /* Start probing whether drive D: is free to use. */
69 do
70 {
71 char szCurDrive[3];
72 RTStrPrintf(szCurDrive, sizeof(szCurDrive), "%c:", chDrive++);
73
74 NETRESOURCE resource;
75 RT_ZERO(resource);
76 resource.dwType = RESOURCETYPE_ANY;
77 resource.lpLocalName = TEXT(szCurDrive);
78 resource.lpRemoteName = TEXT(pszShareName);
79 /* Go straight to our network provider in order to get maximum lookup speed. */
80 resource.lpProvider = TEXT("VirtualBox Shared Folders");
81
82 /** @todo Figure out how to map the drives in a block (F,G,H, ...).
83 Save the mapping for later use. */
84 DWORD dwErr = WNetAddConnection2A(&resource, NULL, NULL, 0);
85 if (dwErr == NO_ERROR)
86 {
87 LogRel(("Shared folder \"%s\" was mounted to drive \"%s\"\n", pszName, szCurDrive));
88 break;
89 }
90 else
91 {
92 LogRel(("Mounting \"%s\" to \"%s\" resulted in dwErr = %ld\n", pszName, szCurDrive, dwErr));
93
94 switch (dwErr)
95 {
96 /*
97 * The local device specified by the lpLocalName member is already
98 * connected to a network resource. Try next drive ...
99 */
100 case ERROR_ALREADY_ASSIGNED:
101 break;
102
103 default:
104 LogRel(("Error while mounting shared folder \"%s\" to \"%s\", error = %ld\n",
105 pszName, szCurDrive, dwErr));
106 break;
107 }
108 }
109 } while (chDrive <= 'Z');
110
111 if (chDrive > 'Z')
112 {
113 LogRel(("No free driver letter found to assign shared folder \"%s\", aborting\n", pszName));
114 break;
115 }
116
117 RTStrFree(pszShareName);
118 }
119 else
120 rc = VERR_NO_STR_MEMORY;
121 RTStrFree(pszName);
122 }
123 else
124 LogFlowFunc(("Error while getting the shared folder name for root node = %u, rc = %Rrc\n",
125 paMappings[i].u32Root, rc));
126 }
127#if 0
128 }
129#endif
130 VbglR3SharedFolderFreeMappings(paMappings);
131 }
132 else
133 LogFlowFunc(("Error while getting the shared folder mappings, rc = %Rrc\n", rc));
134 VbglR3SharedFolderDisconnect(u32ClientId);
135 }
136 else
137 {
138 LogFlowFunc(("Failed to connect to the shared folder service, error %Rrc\n", rc));
139 /* return success, otherwise VBoxTray will not start! */
140 rc = VINF_SUCCESS;
141 }
142 return rc;
143}
144
145int VBoxSharedFoldersAutoUnmount(void)
146{
147 uint32_t u32ClientId;
148 int rc = VbglR3SharedFolderConnect(&u32ClientId);
149 if (!RT_SUCCESS(rc))
150 LogFlowFunc(("Failed to connect to the shared folder service, error %Rrc\n", rc));
151 else
152 {
153 uint32_t cMappings;
154 VBGLR3SHAREDFOLDERMAPPING *paMappings;
155
156 rc = VbglR3SharedFolderGetMappings(u32ClientId, true /* Only process auto-mounted folders */,
157 &paMappings, &cMappings);
158 if (RT_SUCCESS(rc))
159 {
160 for (uint32_t i = 0; i < cMappings && RT_SUCCESS(rc); i++)
161 {
162 char *pszName = NULL;
163 rc = VbglR3SharedFolderGetName(u32ClientId, paMappings[i].u32Root, &pszName);
164 if ( RT_SUCCESS(rc)
165 && *pszName)
166 {
167 LogFlowFunc(("Disconnecting share %u (%s) ...\n", i+1, pszName));
168
169 char *pszShareName;
170 if (RTStrAPrintf(&pszShareName, "\\\\vboxsrv\\%s", pszName) >= 0)
171 {
172 DWORD dwErr = WNetCancelConnection2(pszShareName, 0, FALSE /* Force disconnect */);
173 if (dwErr == NO_ERROR)
174 {
175 LogRel(("Share \"%s\" was disconnected\n", pszShareName));
176 RTStrFree(pszShareName);
177 RTStrFree(pszName);
178 break;
179 }
180
181 LogRel(("Disconnecting \"%s\" failed, dwErr = %ld\n", pszShareName, dwErr));
182
183 switch (dwErr)
184 {
185 case ERROR_NOT_CONNECTED:
186 break;
187
188 default:
189 LogRel(("Error while disconnecting shared folder \"%s\", error = %ld\n",
190 pszShareName, dwErr));
191 break;
192 }
193
194 RTStrFree(pszShareName);
195 }
196 else
197 rc = VERR_NO_MEMORY;
198 RTStrFree(pszName);
199 }
200 else
201 LogFlowFunc(("Error while getting the shared folder name for root node = %u, rc = %Rrc\n",
202 paMappings[i].u32Root, rc));
203 }
204 VbglR3SharedFolderFreeMappings(paMappings);
205 }
206 else
207 LogFlowFunc(("Error while getting the shared folder mappings, rc = %Rrc\n", rc));
208 VbglR3SharedFolderDisconnect(u32ClientId);
209 }
210 return rc;
211}
212
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette