@@ -234,7 +234,7 @@ static void AddComponents(ErrorSet *errset)
234
234
}
235
235
}
236
236
237
- void requester_freeze (int *num_vols, ErrorSet *errset)
237
+ void requester_freeze (int *num_vols, void *mountpoints, ErrorSet *errset)
238
238
{
239
239
COMPointer<IVssAsync> pAsync;
240
240
HANDLE volume;
@@ -246,6 +246,7 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
246
246
WCHAR short_volume_name[64 ], *display_name = short_volume_name;
247
247
DWORD wait_status;
248
248
int num_fixed_drives = 0 , i;
249
+ int num_mount_points = 0 ;
249
250
250
251
if (vss_ctx.pVssbc ) { /* already frozen */
251
252
*num_vols = 0 ;
@@ -337,39 +338,73 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
337
338
goto out;
338
339
}
339
340
340
- volume = FindFirstVolumeW (short_volume_name, sizeof (short_volume_name));
341
- if (volume == INVALID_HANDLE_VALUE) {
342
- err_set (errset, hr, " failed to find first volume" );
343
- goto out;
344
- }
345
- for (;;) {
346
- if (GetDriveTypeW (short_volume_name) == DRIVE_FIXED) {
341
+ if (mountpoints) {
342
+ PWCHAR volume_name_wchar;
343
+ for (volList *list = (volList *)mountpoints; list; list = list->next ) {
344
+ size_t len = strlen (list->value ) + 1 ;
345
+ size_t converted = 0 ;
347
346
VSS_ID pid;
348
- hr = vss_ctx.pVssbc ->AddToSnapshotSet (short_volume_name,
347
+
348
+ volume_name_wchar = new wchar_t [len];
349
+ mbstowcs_s (&converted, volume_name_wchar, len,
350
+ list->value , _TRUNCATE);
351
+
352
+ hr = vss_ctx.pVssbc ->AddToSnapshotSet (volume_name_wchar,
349
353
g_gProviderId, &pid);
350
354
if (FAILED (hr)) {
351
- WCHAR volume_path_name[PATH_MAX];
352
- if (GetVolumePathNamesForVolumeNameW (
353
- short_volume_name, volume_path_name,
354
- sizeof (volume_path_name), NULL ) && *volume_path_name) {
355
- display_name = volume_path_name;
356
- }
357
355
err_set (errset, hr, " failed to add %S to snapshot set" ,
358
- display_name );
359
- FindVolumeClose (volume) ;
356
+ volume_name_wchar );
357
+ delete volume_name_wchar ;
360
358
goto out;
361
359
}
362
- num_fixed_drives++;
360
+ num_mount_points++;
361
+
362
+ delete volume_name_wchar;
363
363
}
364
- if (! FindNextVolumeW (volume, short_volume_name,
365
- sizeof (short_volume_name)) ) {
366
- FindVolumeClose (volume);
367
- break ;
364
+
365
+ if (num_mount_points == 0 ) {
366
+ /* If there is no valid mount points, just exit. */
367
+ goto out ;
368
368
}
369
369
}
370
370
371
- if (num_fixed_drives == 0 ) {
372
- goto out; /* If there is no fixed drive, just exit. */
371
+ if (!mountpoints) {
372
+ volume = FindFirstVolumeW (short_volume_name, sizeof (short_volume_name));
373
+ if (volume == INVALID_HANDLE_VALUE) {
374
+ err_set (errset, hr, " failed to find first volume" );
375
+ goto out;
376
+ }
377
+
378
+ for (;;) {
379
+ if (GetDriveTypeW (short_volume_name) == DRIVE_FIXED) {
380
+ VSS_ID pid;
381
+ hr = vss_ctx.pVssbc ->AddToSnapshotSet (short_volume_name,
382
+ g_gProviderId, &pid);
383
+ if (FAILED (hr)) {
384
+ WCHAR volume_path_name[PATH_MAX];
385
+ if (GetVolumePathNamesForVolumeNameW (
386
+ short_volume_name, volume_path_name,
387
+ sizeof (volume_path_name), NULL ) &&
388
+ *volume_path_name) {
389
+ display_name = volume_path_name;
390
+ }
391
+ err_set (errset, hr, " failed to add %S to snapshot set" ,
392
+ display_name);
393
+ FindVolumeClose (volume);
394
+ goto out;
395
+ }
396
+ num_fixed_drives++;
397
+ }
398
+ if (!FindNextVolumeW (volume, short_volume_name,
399
+ sizeof (short_volume_name))) {
400
+ FindVolumeClose (volume);
401
+ break ;
402
+ }
403
+ }
404
+
405
+ if (num_fixed_drives == 0 ) {
406
+ goto out; /* If there is no fixed drive, just exit. */
407
+ }
373
408
}
374
409
375
410
hr = vss_ctx.pVssbc ->PrepareForBackup (pAsync.replace ());
@@ -435,7 +470,12 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
435
470
goto out;
436
471
}
437
472
438
- *num_vols = vss_ctx.cFrozenVols = num_fixed_drives;
473
+ if (mountpoints) {
474
+ *num_vols = vss_ctx.cFrozenVols = num_mount_points;
475
+ } else {
476
+ *num_vols = vss_ctx.cFrozenVols = num_fixed_drives;
477
+ }
478
+
439
479
return ;
440
480
441
481
out:
@@ -449,7 +489,7 @@ void requester_freeze(int *num_vols, ErrorSet *errset)
449
489
}
450
490
451
491
452
- void requester_thaw (int *num_vols, ErrorSet *errset)
492
+ void requester_thaw (int *num_vols, void *mountpints, ErrorSet *errset)
453
493
{
454
494
COMPointer<IVssAsync> pAsync;
455
495
0 commit comments