mirror of
https://github.com/vxunderground/VX-API
synced 2024-06-30 18:51:17 +00:00
Create ComVssDeleteShadowVolumeBackups.cpp
This commit is contained in:
parent
42e2d8a439
commit
fa59e3104a
125
Windows API/ComVssDeleteShadowVolumeBackups.cpp
Normal file
125
Windows API/ComVssDeleteShadowVolumeBackups.cpp
Normal file
@ -0,0 +1,125 @@
|
||||
HRESULT ComDisableGlobalSeh(VOID)
|
||||
{
|
||||
HRESULT Result = S_OK;
|
||||
IGlobalOptions* GlobalOptions;
|
||||
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 6387)
|
||||
Result = CoCreateInstance(CLSID_GlobalOptions, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&GlobalOptions));
|
||||
#pragma warning( pop )
|
||||
if (!SUCCEEDED(Result))
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
Result = GlobalOptions->Set(COMGLB_EXCEPTION_HANDLING, COMGLB_EXCEPTION_DONOT_HANDLE);
|
||||
|
||||
GlobalOptions->Release();
|
||||
|
||||
EXIT_ROUTINE:
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
DWORD InitializeComWithSecurityContextDefault(BOOL DisableSeh)
|
||||
{
|
||||
HRESULT Result = S_OK;
|
||||
|
||||
Result = CoInitializeEx(NULL, 0);
|
||||
if (!SUCCEEDED(Result))
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
Result = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
|
||||
if (!SUCCEEDED(Result))
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
if (DisableSeh)
|
||||
Result = ComDisableGlobalSeh();
|
||||
|
||||
EXIT_ROUTINE:
|
||||
|
||||
return EhWin32FromHResult(Result);
|
||||
}
|
||||
|
||||
DWORD ComVssDeleteShadowVolumeBackups(BOOL CoUninitializeAfterCompletion)
|
||||
{
|
||||
HRESULT Result = S_OK;
|
||||
IVssCoordinator* VssCoordinator = NULL;
|
||||
VSS_OBJECT_PROP* Snapshots = NULL;
|
||||
IVssEnumObject* EnumObject = NULL;
|
||||
LONG NumberOfSnapshots = 0;
|
||||
ULONG Objects = 16, Retrieved = 0;
|
||||
PWCHAR ShadowCopySetId = NULL, ShadowCopyId = NULL;
|
||||
|
||||
if (InitializeComWithSecurityContextDefault(TRUE) != ERROR_SUCCESS)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
if (!SetProcessPrivilegeToken(MW_SEBACKUP_PRIVILEGE))
|
||||
return FALSE;
|
||||
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 6387)
|
||||
if (!SUCCEEDED(Result = CoCreateInstance(CLSID_CVssCoordinator, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&VssCoordinator))))
|
||||
goto EXIT_ROUTINE;
|
||||
#pragma warning( pop )
|
||||
|
||||
if (!SUCCEEDED(Result = VssCoordinator->SetContext(-1)))
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
if (!SUCCEEDED(Result = VssCoordinator->Query(GUID_NULL, VSS_OBJECT_NONE, VSS_OBJECT_SNAPSHOT, &EnumObject)))
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
Snapshots = (VSS_OBJECT_PROP*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(VSS_OBJECT_PROP) * Objects));
|
||||
if (Snapshots == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
if (!SUCCEEDED(Result = EnumObject->Next(Objects, Snapshots, (PULONG)&NumberOfSnapshots)))
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
ShadowCopySetId = (PWCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (32 * sizeof(WCHAR)));
|
||||
if (ShadowCopySetId == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
ShadowCopyId = (PWCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (32 * sizeof(WCHAR)));
|
||||
if (ShadowCopyId == NULL)
|
||||
goto EXIT_ROUTINE;
|
||||
|
||||
while (NumberOfSnapshots--)
|
||||
{
|
||||
VSS_OBJECT_PROP Element = Snapshots[NumberOfSnapshots];
|
||||
LONG Dispose = 0;
|
||||
GUID SnapshotDipose = { 0 };
|
||||
if (Element.Type != VSS_OBJECT_SNAPSHOT)
|
||||
continue;
|
||||
|
||||
RtlZeroMemory(ShadowCopyId, (32 * sizeof(WCHAR)));
|
||||
RtlZeroMemory(ShadowCopySetId, (32 * sizeof(WCHAR)));
|
||||
|
||||
if (StringFromGUID2(Element.Obj.Snap.m_SnapshotId, ShadowCopyId, (32 * sizeof(WCHAR))) == ERROR_FAILURE_RETURN)
|
||||
continue;
|
||||
|
||||
if (StringFromGUID2(Element.Obj.Snap.m_SnapshotSetId, ShadowCopySetId, (32 * sizeof(WCHAR))) == ERROR_FAILURE_RETURN)
|
||||
continue;
|
||||
|
||||
VssCoordinator->DeleteSnapshots(Element.Obj.Snap.m_SnapshotId, VSS_OBJECT_SNAPSHOT, 1, &Dispose, &SnapshotDipose);
|
||||
}
|
||||
|
||||
|
||||
EXIT_ROUTINE:
|
||||
|
||||
if (ShadowCopyId)
|
||||
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, ShadowCopyId);
|
||||
|
||||
if (ShadowCopySetId)
|
||||
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, ShadowCopySetId);
|
||||
|
||||
if (EnumObject)
|
||||
EnumObject->Release();
|
||||
|
||||
if (VssCoordinator)
|
||||
VssCoordinator->Release();
|
||||
|
||||
if (CoUninitializeAfterCompletion)
|
||||
CoUninitialize();
|
||||
|
||||
return EhWin32FromHResult(Result);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user