Hello,
using some examples provided by vmware, i'm able to mount a remote vmdk disk to Windows Drive Letter but i can't find a way to mount it to a Windows folder..
Tried with:
- SetVolumeMountPoint
Where can i find the GUID of vstor2-mntapi20-shared symLink device?
- DefineDosDevice
No success mounting to a folder
static void DoMntApi(VixDiskLibConnection connection, const char* disk, uint32 openFlags)
{
printf("\nCalling VixMntapi_OpenDisks...\n");
const char* diskNames[1];
diskNames[0] = static_cast<const char*>(disk);
VixDiskSetHandle diskSetHandle = NULL;
VixError err = VixMntapi_OpenDisks(connection,
diskNames,
1,
VIXDISKLIB_FLAG_OPEN_READ_ONLY,
&diskSetHandle);
if (VIX_FAILED(err)) {
throw VixDiskLibErrWrapper(err, __FILE__, __LINE__);
}
DiskSetHdl dsh(diskSetHandle, VixMntapi_CloseDiskSet);
printf("\nCalling VixMntapi_GetDiskSetInfo...\n");
VixDiskSetInfo *diskSetInfo = NULL;
err = VixMntapi_GetDiskSetInfo(diskSetHandle, &diskSetInfo);
if (VIX_FAILED(err)) {
throw VixDiskLibErrWrapper(err, __FILE__, __LINE__);
}
DiskSetInfo dsi(diskSetInfo, VixMntapi_FreeDiskSetInfo);
printf("DiskSet Info - flags %u (passed - %u), mountPoint %s.\n",
diskSetInfo->openFlags, openFlags,
diskSetInfo->mountPath);
printf("\nCalling VixMntapi_GetVolumeHandles...\n");
VixVolumeHandle *volumeHandles = NULL;
size_t numVolumes = 0;
err = VixMntapi_GetVolumeHandles(diskSetHandle,
&numVolumes,
&volumeHandles);
if (VIX_FAILED(err)) {
throw VixDiskLibErrWrapper(err, __FILE__, __LINE__);
}
VolumeHdls vh(volumeHandles, VixMntapi_FreeVolumeHandles);
printf("Num Volumes %zd\n", numVolumes);
printf("\nEnter the volume number from which to start the mounting: ");
int j = 0;
scanf("%d", &j);
vector<shared_ptr<VolumeHdl> > vhset;
vector<shared_ptr<VolumeInfo> > viset;
for (int i = j-1; i < numVolumes; ++i) {
printf("\nCalling VixMntapi_MountVolume on volume %d\n", i+1);
err = VixMntapi_MountVolume(volumeHandles[i], TRUE);
if (VIX_FAILED(err)) {
VixDiskLibErrWrapper errWrap(err, __FILE__, __LINE__);
cout << endl << "Error: " << errWrap.Description() << endl;
continue;
}
VolumeHdl*a = new VolumeHdl(volumeHandles[i], VixMntapi_DismountVolume_True);
vhset.push_back(shared_ptr<VolumeHdl>(a));
printf("\nCalling VixMntapi_GetVolumeInfo on volume %d\n", i+1);
VixVolumeInfo* volInfo = NULL;
err = VixMntapi_GetVolumeInfo(volumeHandles[i], &volInfo);
if (VIX_FAILED(err)) {
VixDiskLibErrWrapper errWrap(err, __FILE__, __LINE__);
cout << endl << "Error: " << errWrap.Description() << endl;
continue;
}
viset.push_back(shared_ptr<VolumeInfo>(new VolumeInfo(volInfo, VixMntapi_FreeVolumeInfo)));
printf("\nMounted Volume %d, Type %d, isMounted %d, symLink %s, numGuestMountPoints %zd (%s)\n\n",
i+1, volInfo->type, volInfo->isMounted,
volInfo->symbolicLink == NULL ? "<null>" : volInfo->symbolicLink,
volInfo->numGuestMountPoints,
(volInfo->numGuestMountPoints == 1) ? (volInfo->inGuestMountPoints[0]) : "<null>");
/*
*----------------------------------------------------------------------
*
* Mount Device to system unit
*
*----------------------------------------------------------------------
*/
std::wstringstream ansiSS;
ansiSS << volInfo->symbolicLink;
std::wstring sVolumeName = ansiSS.str();
sVolumeName = sVolumeName.substr(3);
sVolumeName.erase(sVolumeName.length() - 1);
sVolumeName = L"\\Device" + sVolumeName;
cout << endl << endl << "Defining MS-DOS device name \"U:\" for volume " << volInfo->symbolicLink << endl;
cout << "=====================================================================================" << endl;
/*
*
*
* MOUNT TO A FOLDER INSTEAD OF U: LETTER
*
*
*/
if (DefineDosDeviceW(DDD_RAW_TARGET_PATH, L"U:", sVolumeName.c_str())) {
HANDLE hDevice;
std::wstring wsVolume = L"\\\\.\\U:";
hDevice = CreateFileW(wsVolume.c_str(),
GENERIC_READ,
0, //FILE_SHARE_READ | FILE_SHARE_WRITE
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
printf("Error opening volume, err = %d\n", GetLastError());
}
else {
WIN32_FIND_DATAW fdFile;
std::wstring wsPath = L"U:\\*.*";
HANDLE hFind = FindFirstFileW(wsPath.c_str(), &fdFile);
std::string MountPoint = (volInfo->numGuestMountPoints == 1) ? (volInfo->inGuestMountPoints[0]) : "<null>";
cout << "=====================================================================================" << endl;
cout << "=== Dumping contents of target VM's (" << MountPoint << ") drive (Mounted at U: drive on proxy) ===" << endl;
cout << "=====================================================================================" << endl;
while (hFind != INVALID_HANDLE_VALUE) {
if (hFind != INVALID_HANDLE_VALUE) {
printf("Successfully read Object = '%S'\n", fdFile.cFileName);
}
else {
printf("Failed to read Object. Volume/NTFS filesystem is corrupt (%d)\n", GetLastError());
}
if (!FindNextFileW(hFind, &fdFile)) {
FindClose(hFind);
hFind = INVALID_HANDLE_VALUE;
}
}
::MessageBoxW(NULL, L"Volume mounted under U: drive, press OK to unmount", L"Info", NULL);
DefineDosDeviceW(DDD_RAW_TARGET_PATH |
DDD_REMOVE_DEFINITION |
DDD_EXACT_MATCH_ON_REMOVE, L"U:", sVolumeName.c_str());
}
}
}
}
Is there a way to mount the vstor2 device to a folder?
Thanks,