Sample Code

Windows Driver Samples/ FileHistory Sample/ C++/ exe/ fhsetup.cpp/

//
// File History Sample Setup Tool
// Copyright (c) Microsoft Corporation.  All Rights Reserved.
//

#include <fhsetup.h>

HRESULT ScheduleBackups()
/*++

Routine Description:

    This function starts the File History service if it is stopped
    and schedules regular backups.

Arguments:

    None

Return Value:

    S_OK if successful
    HRESULT from underlying functions

--*/
{
    HRESULT backupHr = S_OK;
    HRESULT pipeHr = S_OK;
    FH_SERVICE_PIPE_HANDLE pipe = NULL;

    pipeHr = FhServiceOpenPipe(TRUE, &pipe);
    if (SUCCEEDED(pipeHr))
    {
        backupHr = FhServiceReloadConfiguration(pipe);
        pipeHr = FhServiceClosePipe(pipe);
    }

    // The HRESULT from the backup operation is more important than
    // the HRESULT from pipe operations
    return FAILED(backupHr) ? backupHr : pipeHr;
}

HRESULT ConfigureFileHistory(
    _In_ PWSTR TargetPath
    )
/*++

Routine Description:

    This function configures a target for File History.
    It will only succeed if the user has never configured File History
    before and there is no File History data on the target.

Arguments:

    TargetPath -
        The path of the File History target

Return Value:

    S_OK if successful
    E_INVALIDARG if TargetPath is NULL
    E_FAIL if configuration failed because File History is disabled by
           group policy or the target is not valid
    HRESULT from underlying functions

--*/
{
    HRESULT hr = S_OK;
    FH_BACKUP_STATUS backupStatus;
    FH_DEVICE_VALIDATION_RESULT validationResult;
    CComPtr<IFhConfigMgr> configMgr;
    CComBSTR targetPath;
    CComBSTR targetName;

    // TargetPath must not be NULL
    if (TargetPath == NULL)
    {
        hr = E_INVALIDARG;
        goto Cleanup;
    }
    
    // Copy the target path into a local variable and set the target name
    // to an empty string to allow the config manager to set a name
    _ATLTRY
    {
        targetPath = TargetPath;
        targetName = L"";
    }
    _ATLCATCH(e)
    {
        hr = e;
        goto Cleanup;
    }

    // The configuration manager is used to create and load configuration 
    // files, get/set the backup status, validate a target, etc
    hr = configMgr.CoCreateInstance(CLSID_FhConfigMgr);
    if (FAILED(hr))
    {
        wprintf(L"Error: CoCreateInstance failed (0x%X)\n", hr);
        goto Cleanup;
    }
    
    // Create a new default configuration file - do not overwrite if one
    // already exists
    wprintf(L"Creating default configuration\n");
    hr = configMgr->CreateDefaultConfiguration(FALSE);
    if (FAILED(hr))
    {
        if (hr == FHCFG_E_CONFIG_ALREADY_EXISTS)
        {
            wprintf(L"Error: File History has previously been configured\n");
        }
        else
        {
            wprintf(L"Error: CreateDefaultConfiguration failed (0x%X)\n", hr);
        }
        goto Cleanup;
    }

    // Check the backup status
    // If File History is disabled by group policy, quit
    wprintf(L"Getting backup status\n");
    hr = configMgr->GetBackupStatus(&backupStatus);
    if (FAILED(hr))
    {
        wprintf(L"Error: GetBackupStatus failed (0x%X)\n", hr);
        goto Cleanup;
    }
    if (backupStatus == FH_STATUS_DISABLED_BY_GP)
    {
        wprintf(L"Error: File History is disabled by group policy\n");
        hr = E_FAIL;
        goto Cleanup;
    }

    // Make sure the target is valid to be used for File History
    wprintf(L"Validating target\n");
    hr = configMgr->ValidateTarget(targetPath, &validationResult);
    if (FAILED(hr))
    {
        wprintf(L"Error: ValidateTarget failed (0x%X)\n", hr);
        goto Cleanup;
    }
    if (validationResult != FH_VALID_TARGET)
    {
        // If the target is inaccessible, read-only, an invalid drive type
        // (such as a CD), already being used for File History, or part of
        // the protected namespace - don't enable File History
        wprintf(L"Error: %ws is not a valid target\n", targetPath.m_str);
        hr = E_FAIL;
        goto Cleanup;
    }

    // Provision the target to be used for File History and set
    // it as the default target
    wprintf(L"Provisioning and setting target\n");
    hr = configMgr->ProvisionAndSetNewTarget(targetPath, targetName);
    if (FAILED(hr))
    {
        wprintf(L"Error: ProvisionAndSetNewTarget failed (0x%X)\n", hr);
        goto Cleanup;
    }
    
    // Enable File History
    wprintf(L"Enabling File History\n");
    hr = configMgr->SetBackupStatus(FH_STATUS_ENABLED);
    if (FAILED(hr))
    {
        wprintf(L"Error: SetBackupStatus failed (0x%X)\n", hr);
        goto Cleanup;
    }

    // Save the configuration to disk
    wprintf(L"Saving configuration\n");
    hr = configMgr->SaveConfiguration();
    if (FAILED(hr))
    {
        wprintf(L"Error: SaveConfiguration failed (0x%X)\n", hr);
        goto Cleanup;
    }

    // Tell the File History service to schedule backups
    wprintf(L"Scheduling regular backups\n");
    hr = ScheduleBackups();
    if (FAILED(hr))
    {
        wprintf(L"Error: ScheduleBackups failed (0x%X)\n", hr);
        goto Cleanup;
    }

    // Recommend the target to other Homegroup members
    wprintf(L"Recommending target to Homegroup\n");
    HRESULT hrRecommend = configMgr->ChangeDefaultTargetRecommendation(TRUE);
    if (FAILED(hrRecommend))
    {
        wprintf(L"Warning: Failed to recommend target to Homegroup (0x%X)\n", hrRecommend);
    }

    wprintf(L"Success! File History is now enabled\n");

Cleanup:
    return hr;
}

int __cdecl wmain(
    _In_ int Argc,
    _In_reads_(Argc) PWSTR Argv[]
    )
/*++

Routine Description:

    This is the main entry point of the console application.

Arguments:

    Argc - the number of command line arguments
    Argv - command line arguments

Return Value:

    exit code

--*/
{
    HRESULT hr = S_OK;
    BOOL comInitialized = FALSE;

    wprintf(L"\nFile History Sample Setup Tool\n");
    wprintf(L"Copyright (C) Microsoft Corporation. All rights reserved.\n\n");

    // If there are fewer than 2 command-line arguments, print the correct
    // usage and exit
    if (Argc < 2)
    {
        wprintf(L"Usage: fhsetup <path>\n\n");
        wprintf(L"Examples:\n");
        wprintf(L"    fhsetup D:\\\n");
        wprintf(L"    fhsetup \\\\server\\share\\\n\n");
        goto Cleanup;
    }

    // COM is needed to use the Config Manager
    wprintf(L"Initializing COM...\n");
    hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        wprintf(L"Error: CoInitialize failed (0x%X)\n", hr);
        goto Cleanup;
    }
    comInitialized = TRUE;

    hr = ConfigureFileHistory(Argv[1]);
    if (FAILED(hr))
    {
        wprintf(L"File History configuration failed (0x%X)\n", hr);
        goto Cleanup;
    }

Cleanup:
    // If COM was initialized, make sure it is uninitialized
    if (comInitialized)
    {
        CoUninitialize();
        comInitialized = FALSE;
    }

    return 0;
}

Our Services

  • What our customers say about us?

© 2011-2024 All Rights Reserved. Joya Systems. 4425 South Mopac Building II Suite 101 Austin, TX 78735 Tel: 800-DEV-KERNEL

Privacy Policy. Terms of use. Valid XHTML & CSS