/* **++ ** ** Copyright (c) 2000-2002 Microsoft Corporation ** ** ** Module Name: ** ** sec.cpp ** ** ** Abstract: ** ** Security Test program for VSS ** ** Author: ** ** Adi Oltean [aoltean] 02/12/2002 ** ** ** Revision History: ** **-- */ /////////////////////////////////////////////////////////////////////////////// // Includes #include "sec.h" #include #include #include #include #include "vswriter.h" #include "vsbackup.h" #include "vs_reg.hxx" #include "ntddsnap.h" #include "vs_clus.hxx" /////////////////////////////////////////////////////////////////////////////// // Static data CRITICAL_SECTION CVssSecurityTest::m_csTest; volatile LONG CVssSecurityTest::m_lTestCounter = 0; /////////////////////////////////////////////////////////////////////////////// // Processing functions // Run the tests void CVssSecurityTest::Run() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::Run"); ft.Msg(L"\n--------------- %s ------------\n", GetCurrentComment()); // Execute selected routine BS_ASSERT(GetCurrentRoutine()); (this->*GetCurrentRoutine())(); ft.Msg(L"\n-------------------------------------------------\n"); } // Lookup name void CVssSecurityTest::TestLookupName() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::TestLookupName"); BYTE pbSid[SECURITY_MAX_SID_SIZE]; PSID pSid = (PSID)pbSid; WCHAR wszDomainName[MAX_TEXT_BUFFER]; SID_NAME_USE snUse; DWORD cbSid = 0; DWORD dwDomainNameSize = 0; LookupAccountName( NULL, GetStringParam(L""), pSid, &cbSid, wszDomainName, &dwDomainNameSize, &snUse); ft.Msg( L"* cbSid = %ld, cbDomain = %ld, error = %ld\n", cbSid, dwDomainNameSize, GetLastError() ); cbSid = SECURITY_MAX_SID_SIZE; dwDomainNameSize = MAX_TEXT_BUFFER; CHECK_WIN32( LookupAccountName( NULL, GetStringParam(L""), pSid, &cbSid, wszDomainName, &dwDomainNameSize, &snUse), ; ); LPWSTR pwszStringSid = NULL; CHECK_WIN32( ConvertSidToStringSid( pSid, &pwszStringSid), ;); ft.Msg( L"* Sid: %s, Domain Name: %s, SidUse: %d\n", pwszStringSid, wszDomainName, snUse ); // Now go back and recompute the name WCHAR wszName[MAX_TEXT_BUFFER]; DWORD dwNameSize = MAX_TEXT_BUFFER; dwDomainNameSize = MAX_TEXT_BUFFER; CHECK_WIN32( LookupAccountSid( NULL, pSid, wszName, &dwNameSize, wszDomainName, &dwDomainNameSize, &snUse), LocalFree(pwszStringSid); ); ft.Msg( L"* Name: %s, Domain Name: %s, SidUse: %d\n", wszName, wszDomainName, snUse ); LocalFree(pwszStringSid); } // Lookup SID void CVssSecurityTest::TestLookupSid() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::TestLookupSid"); PSID pSid = NULL; CHECK_WIN32( ConvertStringSidToSid( GetStringParam(L""), &pSid) , ;); WCHAR wszName[MAX_TEXT_BUFFER]; DWORD dwNameSize = MAX_TEXT_BUFFER; WCHAR wszDomainName[MAX_TEXT_BUFFER]; DWORD dwDomainNameSize = MAX_TEXT_BUFFER; SID_NAME_USE snUse; CHECK_WIN32( LookupAccountSid( NULL, pSid, wszName, &dwNameSize, wszDomainName, &dwDomainNameSize, &snUse), LocalFree(pSid); ); ft.Msg( L"* Name: %s, Domain Name: %s, SidUse: %d\n", wszName, wszDomainName, snUse ); LocalFree(pSid); } // Lookup Names void CVssSecurityTest::TestLookupPrimaryDomainName() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::TestLookupPrimaryDomainName"); // Also get the computer domain WCHAR wszDomainName[MAX_TEXT_BUFFER]; DWORD dwDomainNameLen = MAX_TEXT_BUFFER; CHECK_WIN32( GetComputerNameExW( ComputerNamePhysicalDnsDomain, // ComputerNameDnsDomain, wszDomainName, &dwDomainNameLen), ;); ft.Msg( L"* Domain DNS Name for the local computer: %s\n", wszDomainName ); BYTE pbSid[SECURITY_MAX_SID_SIZE]; DWORD dwSidSize = SECURITY_MAX_SID_SIZE; PSID pSid = (PSID)pbSid; WCHAR wszReturnedDomainName[MAX_TEXT_BUFFER]; DWORD dwReturnedDomainNameSize = MAX_TEXT_BUFFER; SID_NAME_USE snUse; CHECK_WIN32( LookupAccountName( NULL, wszDomainName, pSid, &dwSidSize, wszReturnedDomainName, &dwReturnedDomainNameSize, &snUse), ; ); ft.Msg( L"* LookupAccountName returns Domain Name: %s, SidInuse: %d\n", wszReturnedDomainName, snUse ); LPWSTR pwszAccountName = NULL; CHECK_WIN32( ConvertSidToStringSid( pSid, &pwszAccountName) , ;); ft.Msg( L"* ConvertSidToSidString returns %s\n", pwszAccountName ); LocalFree( pwszAccountName ); BYTE pbByte2[SECURITY_MAX_SID_SIZE]; PSID pSid2 = (PSID)pbByte2; DWORD dwSid2Length = SECURITY_MAX_SID_SIZE; CHECK_WIN32( CreateWellKnownSid( WinAccountComputersSid, pSid, pSid2, &dwSid2Length ), ; ); LPWSTR pwszAccountName2 = NULL; CHECK_WIN32( ConvertSidToStringSid( pSid2, &pwszAccountName2) , ;); ft.Msg( L"* ConvertSidToSidString returns %s\n", pwszAccountName2 ); LocalFree( pwszAccountName2 ); } // Lookup Names for all trusted domains void CVssSecurityTest::TestLookupTrustedName() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::TestLookupTrustedName"); PDOMAIN_CONTROLLER_INFO pDomainInfo = NULL; CHECK_WIN32( DsGetDcName( NULL, NULL, NULL, NULL, 0, &pDomainInfo), ; ); PDS_DOMAIN_TRUSTS pDomains = NULL; ULONG ulDomainCount = 0; CHECK_WIN32( DsEnumerateDomainTrusts( pDomainInfo->DomainControllerName, DS_DOMAIN_IN_FOREST, &pDomains, &ulDomainCount), NetApiBufferFree(pDomainInfo); ); NetApiBufferFree(pDomainInfo); for (ULONG ulIndex = 0; ulIndex < ulDomainCount; ulIndex++) { ft.Msg( L"* Domain: %s, ", pDomains[ulIndex].DnsDomainName ); LPWSTR pwszSidName = NULL; CHECK_WIN32( ConvertSidToStringSid( pDomains[ulIndex].DomainSid, &pwszSidName), NetApiBufferFree(pDomains); ); ft.Msg( L"SID: %s, ", pwszSidName ); LocalFree( pwszSidName ); BYTE pbByte2[SECURITY_MAX_SID_SIZE]; PSID pSid2 = (PSID)pbByte2; DWORD dwSid2Length = SECURITY_MAX_SID_SIZE; CHECK_WIN32( CreateWellKnownSid( WinAccountComputersSid, pDomains[ulIndex].DomainSid, pSid2, &dwSid2Length ), NetApiBufferFree(pDomains); ); CHECK_WIN32( ConvertSidToStringSid( pSid2, &pwszSidName), NetApiBufferFree(pDomains); ); ft.Msg( L"DM SID: %s\n", pwszSidName ); LocalFree( pwszSidName ); } NetApiBufferFree(pDomains); } // Lookup Names for all trusted domains void CVssSecurityTest::TestLookupGroupMembers() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::TestLookupGroupMembers"); // get list of local group members CVssAutoNetApiPtr apBuffer; DWORD_PTR ResumeHandle = NULL; DWORD cEntriesRead = 0, cEntriesTotal = 0; NET_API_STATUS status = 0; CHECK_WIN32_FUNC(status, status == NERR_Success, NetLocalGroupGetMembers( NULL, GetStringParam(L""), 1, apBuffer.ResetAndGetAddress(), MAX_PREFERRED_LENGTH, &cEntriesRead, &cEntriesTotal, &ResumeHandle ), ; ); // loop through member list to see if any sids mach the sid of the owner // of the subscription LOCALGROUP_MEMBERS_INFO_1 *rgMembers = (LOCALGROUP_MEMBERS_INFO_1 *) apBuffer.Get(); for(DWORD iEntry = 0; iEntry < cEntriesRead; iEntry++) { CVssAutoLocalPtr pwszStringSid; CHECK_WIN32( ConvertSidToStringSid( rgMembers[iEntry].lgrmi1_sid, pwszStringSid.ResetAndGetAddress()), ;); ft.Msg(L"* Name = %s, Use = %ld, Sid = %s\n", rgMembers[iEntry].lgrmi1_name, (LONG)rgMembers[iEntry].lgrmi1_sidusage, pwszStringSid.Get() ); } } // Lookup Names for all trusted domains void CVssSecurityTest::IsAllowedToFire() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::IsAllowedToFire"); try { CVssSidCollection sidColl; sidColl.Initialize(); BYTE pbSid[SECURITY_MAX_SID_SIZE]; PSID pSid = (PSID)pbSid; WCHAR wszDomainName[MAX_TEXT_BUFFER]; SID_NAME_USE snUse; DWORD cbSid = 0; DWORD dwDomainNameSize = 0; LookupAccountName( NULL, GetStringParam(L""), pSid, &cbSid, wszDomainName, &dwDomainNameSize, &snUse); ft.Msg( L"* cbSid = %ld, cbDomain = %ld, error = %ld\n", cbSid, dwDomainNameSize, GetLastError() ); cbSid = SECURITY_MAX_SID_SIZE; dwDomainNameSize = MAX_TEXT_BUFFER; CHECK_WIN32( LookupAccountName( NULL, GetStringParam(L""), pSid, &cbSid, wszDomainName, &dwDomainNameSize, &snUse), ; ); CVssAutoLocalPtr pwszStringSid; CHECK_WIN32( ConvertSidToStringSid( pSid, pwszStringSid.ResetAndGetAddress()), ;); ft.Msg( L"* Sid: %s, Domain Name: %s, SidUse: %d\n", pwszStringSid.Get(), wszDomainName, snUse ); bool bAllowed = sidColl.IsSidAllowedToFire(pSid); ft.Msg( L"* IsAllowed: %s\n", bAllowed? L"TRUE": L"FALSE" ); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // Lookup Names for all trusted domains void CVssSecurityTest::WriteRegistry() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::WriteRegistry"); #if 0 try { CVssDiag test; test.Initialize(L"TEST"); INT nCount = GetIntParam(L""); GUID guidSnapshotSetID = GUID_NULL; for(INT nIterations = 0; nIterations < nCount; nIterations++) { for(INT nIndex = VSS_IN_IDENTIFY; nIndex < VSS_IN_COUNT; nIndex++) { test.RecordWriterEvent((VSS_OPERATION)nIndex, 0, 0, S_OK, guidSnapshotSetID); } } } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); #endif } void CVssSecurityTest::DoQuerySnapshots() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::DoQuerySnapshots"); try { QuerySnapshots(); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } void CVssSecurityTest::DoQueryProviders() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::DoQueryProviders"); try { QueryProviders(); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } #include "sample.cpp" void CVssSecurityTest::DoFsctlDismount() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::DoFsctlDismount"); try { // Open the snapshot with no access rights for perf reasons (bug #537974) LPWSTR pwszDevice = GetStringParam(L""); HANDLE hDevice; CHECK_WIN32_FUNC( hDevice, hDevice != INVALID_HANDLE_VALUE, CreateFile(pwszDevice, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, INVALID_HANDLE_VALUE), ; ); CHECK_WIN32( DeviceIoControl(hDevice, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, NULL, NULL), CloseHandle(hDevice); ); CloseHandle(hDevice); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } void CVssSecurityTest::DisplayMessage() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::DisplayMessage"); try { DWORD dwMessageID = GetIntParam(L""); HMODULE hModule = NULL; // default to system source LPWSTR pwszMessageBuffer; DWORD dwBufferLength; DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM ; // Load the file hModule = LoadLibraryExW( GetStringParam(L""), NULL, LOAD_LIBRARY_AS_DATAFILE ); if(hModule != NULL) dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE; dwBufferLength = FormatMessageW( dwFormatFlags, hModule, // module to get message from (NULL == system) dwMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language (LPWSTR) &pwszMessageBuffer, 0, NULL ); if (dwBufferLength) { ft.Msg(L"Message: %s for ID\n", pwszMessageBuffer); // // Free the buffer allocated by the system. // LocalFree(pwszMessageBuffer); } // // If we loaded a message source, unload it. // if(hModule != NULL) FreeLibrary(hModule); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // add cluster dependency void CVssSecurityTest::AddDependency() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::AddDependency"); try { CVssClusterAPI clus; if (!clus.Initialize()) { ft.Msg( L"Cluster initialization failed\n" ); ft.Throw( VSSDBG_VSSTEST, S_FALSE, L"Cluster initialization failed\n" ); } clus.AddDependency(GetStringParam(L""), GetStringParam(L"")); ft.Msg( L"* Depoendency was sucesfully added!" ); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // remove cluster dependency void CVssSecurityTest::RemoveDependency() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::RemoveDependency"); try { CVssClusterAPI clus; if (!clus.Initialize()) { ft.Msg( L"Cluster initialization failed\n" ); ft.Throw( VSSDBG_VSSTEST, S_FALSE, L"Cluster initialization failed\n" ); } clus.RemoveDependency(GetStringParam(L""), GetStringParam(L"")); ft.Msg( L"* Dependency was sucesfully removed!" ); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // add registry key void CVssSecurityTest::AddRegKey() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::AddRegKey"); try { CVssClusterAPI clus; if (!clus.Initialize()) { ft.Msg( L"Cluster initialization failed\n" ); ft.Throw( VSSDBG_VSSTEST, S_FALSE, L"Cluster initialization failed\n" ); } clus.AddRegistryKey(GetStringParam(L""), GetStringParam(L"")); ft.Msg( L"* Reg key was sucesfully added!" ); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // remove registry key void CVssSecurityTest::RemoveRegKey() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::RemoveRegKey"); try { CVssClusterAPI clus; if (!clus.Initialize()) { ft.Msg( L"Cluster initialization failed\n" ); ft.Throw( VSSDBG_VSSTEST, S_FALSE, L"Cluster initialization failed\n" ); } clus.RemoveRegistryKey(GetStringParam(L""), GetStringParam(L"")); ft.Msg( L"* Reg key was sucesfully removed!" ); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // add scheduled task void CVssSecurityTest::AddTask() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::AddTask"); try { CVssClusterAPI clus; if (!clus.Initialize()) { ft.Msg( L"Cluster initialization failed\n" ); ft.Throw( VSSDBG_VSSTEST, S_FALSE, L"Cluster initialization failed\n" ); } SYSTEMTIME st = {0}; GetSystemTime(&st); WORD wStartHours = 7; TASK_TRIGGER Trigger; ZeroMemory(&Trigger, sizeof(TASK_TRIGGER)); Trigger.wBeginDay =st.wDay; Trigger.wBeginMonth =st.wMonth; Trigger.wBeginYear =st.wYear; Trigger.cbTriggerSize = sizeof(TASK_TRIGGER); Trigger.wStartHour = wStartHours; Trigger.TriggerType = TASK_TIME_TRIGGER_WEEKLY; Trigger.Type.Weekly.WeeksInterval = 1; Trigger.Type.Weekly.rgfDaysOfTheWeek = TASK_MONDAY | TASK_TUESDAY | TASK_WEDNESDAY | TASK_THURSDAY | TASK_FRIDAY; ft.Msg( L"Adding a %d TASK_TRIGGER structure...", sizeof(TASK_TRIGGER)); CVssAutoPWSZ awszResource; bool bRet = clus.CreateTaskSchedulerResource( GetStringParam(L""), GetStringParam(L""), GetStringParam(L""), 1, &Trigger, GetStringParam(L"") ); ft.Msg( L"* Task was sucesfully created! [Return code:%s Resource:%s]", bRet? L"TRUE": L"FALSE", GetStringParam(L"") ); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // Update scheduled task void CVssSecurityTest::UpdateTask() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::UpdateTask"); try { CVssClusterAPI clus; if (!clus.Initialize()) { ft.Msg( L"Cluster initialization failed\n" ); ft.Throw( VSSDBG_VSSTEST, S_FALSE, L"Cluster initialization failed\n" ); } SYSTEMTIME st = {0}; GetSystemTime(&st); WORD wStartHours = 12; TASK_TRIGGER Trigger; ZeroMemory(&Trigger, sizeof(TASK_TRIGGER)); Trigger.wBeginDay =st.wDay; Trigger.wBeginMonth =st.wMonth; Trigger.wBeginYear =st.wYear; Trigger.cbTriggerSize = sizeof(TASK_TRIGGER); Trigger.wStartHour = wStartHours; Trigger.TriggerType = TASK_TIME_TRIGGER_WEEKLY; Trigger.Type.Weekly.WeeksInterval = 1; Trigger.Type.Weekly.rgfDaysOfTheWeek = TASK_MONDAY | TASK_TUESDAY | TASK_WEDNESDAY | TASK_THURSDAY | TASK_FRIDAY; ft.Msg( L"Upgrading a %d TASK_TRIGGER structure...", sizeof(TASK_TRIGGER)); bool bRet = clus.UpdateTaskSchedulerResource( GetStringParam(L""), 1, &Trigger ); ft.Msg( L"* Task was sucesfully updated! [Return code:%s]", bRet? L"TRUE": L"FALSE"); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // Update scheduled task void CVssSecurityTest::RemoveTask() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::RemoveTask"); try { CVssClusterAPI clus; if (!clus.Initialize()) { ft.Msg( L"Cluster initialization failed\n" ); ft.Throw( VSSDBG_VSSTEST, S_FALSE, L"Cluster initialization failed\n" ); } bool bRet = clus.DeleteTaskSchedulerResource( GetStringParam(L"") ); ft.Msg( L"* Task was sucesfully deleted! [Return code:%s]", bRet? L"TRUE": L"FALSE"); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // Display a COM security descriptor void CVssSecurityTest::DisplaySD() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::DisplaySD"); try { CVssSidCollection scoll; scoll.Initialize(); PSECURITY_DESCRIPTOR pSD = scoll.GetSecurityDescriptor(); CVssAutoLocalString szSD; CHECK_WIN32(ConvertSecurityDescriptorToStringSecurityDescriptor( pSD, SDDL_REVISION_1, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, szSD.ResetAndGetAddress(), NULL), ); ft.Msg( L" Security descriptor:\n%s\n", szSD.Get() ); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } void CVssSecurityTest::GetVolumePath() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::DisplaySD"); try { WCHAR wszVolume[MAX_PATH + 1]; CHECK_WIN32(GetVolumePathNameW( GetStringParam(L""), STRING_CCH_PARAM(wszVolume)), ) ft.Msg( L"Returned volume: %s\n", wszVolume); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // Display quorum volume void CVssSecurityTest::DisplayQuorumVolume() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::DisplayQuorumVolume"); try { INT nIterations = GetIntParam(L""); for (INT nIndex = 0; nIndex < nIterations; nIndex++) { CVssClusterAPI clus; if (!clus.Initialize()) { ft.Msg( L"Cluster initialization failed\n" ); ft.Throw( VSSDBG_VSSTEST, S_FALSE, L"Cluster initialization failed\n" ); } CComBSTR szVolumeName; clus.GetQuorumPath(szVolumeName); ft.Msg( L"* Quorum volume: %s", (LPWSTR)szVolumeName); } } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // Get a volume name void CVssSecurityTest::GetVolumeName() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::GetVolumeName"); try { LPWSTR pwszVolume = GetStringParam(L""); WCHAR wszVolumeName[MAX_PATH]; CHECK_WIN32(GetVolumeNameForVolumeMountPointW( pwszVolume, STRING_CCH_PARAM(wszVolumeName)), ); ft.Msg(L"* Volume Name: %s\n", wszVolumeName); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); } // Create a object with a given CLSID void CVssSecurityTest::CoCreateInstance() { CVssFunctionTracer ft(VSSDBG_VSSTEST, L"CVssSecurityTest::CoCreateInstance"); try { LPWSTR pwszGuid = GetStringParam(L""); CVssID clsid; clsid.Initialize(ft, pwszGuid); CComPtr ptrUnk; CHECK_COM(::CoGetClassObject(clsid, CLSCTX_ALL, NULL, IID_IClassFactory, (void**)&ptrUnk), ); ft.Msg(L"* Instance created.\n"); } VSS_STANDARD_CATCH(ft) if (ft.HrFailed()) ft.Msg(L"Error catched 0x%08lx\n", ft.hr); }