You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
4.3 KiB
187 lines
4.3 KiB
#include "stdafx.hxx"
|
|
#include "vss.h"
|
|
#include "vswriter.h"
|
|
#include <debug.h>
|
|
#include <cwriter.h>
|
|
|
|
CComModule _Module;
|
|
|
|
HANDLE g_hEvent = NULL;
|
|
|
|
|
|
BOOL WINAPI CtrlCHandler(DWORD type)
|
|
{
|
|
wprintf(L"Control handler called.\n");
|
|
if (g_hEvent)
|
|
SetEvent(g_hEvent);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL AssertPrivilege( LPCWSTR privName )
|
|
{
|
|
HANDLE tokenHandle;
|
|
BOOL stat = FALSE;
|
|
|
|
if ( OpenProcessToken (GetCurrentProcess(),
|
|
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
|
|
&tokenHandle))
|
|
{
|
|
LUID value;
|
|
|
|
if ( LookupPrivilegeValue( NULL, privName, &value ) )
|
|
{
|
|
TOKEN_PRIVILEGES newState;
|
|
DWORD error;
|
|
|
|
newState.PrivilegeCount = 1;
|
|
newState.Privileges[0].Luid = value;
|
|
newState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
|
|
|
|
/*
|
|
* We will always call GetLastError below, so clear
|
|
* any prior error values on this thread.
|
|
*/
|
|
SetLastError( ERROR_SUCCESS );
|
|
|
|
stat = AdjustTokenPrivileges (tokenHandle,
|
|
FALSE,
|
|
&newState,
|
|
(DWORD)0,
|
|
NULL,
|
|
NULL );
|
|
|
|
/*
|
|
* Supposedly, AdjustTokenPriveleges always returns TRUE
|
|
* (even when it fails). So, call GetLastError to be
|
|
* extra sure everything's cool.
|
|
*/
|
|
if ( (error = GetLastError()) != ERROR_SUCCESS )
|
|
{
|
|
stat = FALSE;
|
|
}
|
|
|
|
if ( !stat )
|
|
{
|
|
wprintf( L"AdjustTokenPrivileges for %s failed with %d",
|
|
privName,
|
|
error );
|
|
}
|
|
}
|
|
|
|
DWORD cbTokens;
|
|
GetTokenInformation (tokenHandle,
|
|
TokenPrivileges,
|
|
NULL,
|
|
0,
|
|
&cbTokens);
|
|
|
|
TOKEN_PRIVILEGES *pTokens = (TOKEN_PRIVILEGES *) new BYTE[cbTokens];
|
|
GetTokenInformation (tokenHandle,
|
|
TokenPrivileges,
|
|
pTokens,
|
|
cbTokens,
|
|
&cbTokens);
|
|
|
|
delete pTokens;
|
|
CloseHandle( tokenHandle );
|
|
}
|
|
|
|
|
|
return stat;
|
|
}
|
|
|
|
|
|
|
|
extern "C" __cdecl wmain(int argc, WCHAR **argv)
|
|
{
|
|
CTestVssWriter *pInstance;
|
|
bool bCreated = false;
|
|
bool bSubscribed = false;
|
|
HRESULT hr = S_OK;
|
|
SetConsoleCtrlHandler(CtrlCHandler, TRUE);
|
|
BS_ASSERT(FALSE);
|
|
|
|
try
|
|
{
|
|
CHECK_SUCCESS(CoInitializeEx(NULL, COINIT_MULTITHREADED));
|
|
|
|
if ( !AssertPrivilege( SE_BACKUP_NAME ) )
|
|
{
|
|
wprintf( L"AssertPrivilege returned error, rc:%d\n", GetLastError() );
|
|
return 2;
|
|
}
|
|
|
|
|
|
CHECK_SUCCESS
|
|
(
|
|
CoInitializeSecurity
|
|
(
|
|
NULL, // IN PSECURITY_DESCRIPTOR pSecDesc,
|
|
-1, // IN LONG cAuthSvc,
|
|
NULL, // IN SOLE_AUTHENTICATION_SERVICE *asAuthSvc,
|
|
NULL, // IN void *pReserved1,
|
|
RPC_C_AUTHN_LEVEL_CONNECT, // IN DWORD dwAuthnLevel,
|
|
RPC_C_IMP_LEVEL_IMPERSONATE, // IN DWORD dwImpLevel,
|
|
NULL, // IN void *pAuthList,
|
|
EOAC_NONE, // IN DWORD dwCapabilities,
|
|
NULL // IN void *pReserved3
|
|
)
|
|
);
|
|
|
|
|
|
pInstance = new CTestVssWriter;
|
|
if (pInstance == NULL)
|
|
{
|
|
wprintf(L"allocation failure\n");
|
|
DebugBreak();
|
|
}
|
|
|
|
bCreated = true;
|
|
pInstance->Initialize();
|
|
pInstance->Subscribe();
|
|
bSubscribed = true;
|
|
HANDLE hEventW = CreateEvent(NULL, TRUE, FALSE, L"TESTWRITEREVENT");
|
|
if (hEventW == NULL)
|
|
{
|
|
wprintf(L"CreateEvent failed with error %d.\n", GetLastError());
|
|
DebugBreak();
|
|
}
|
|
|
|
g_hEvent = hEventW;
|
|
|
|
wprintf(L"Ready to receive events.\n");
|
|
|
|
HANDLE hEventB = CreateEvent(NULL, TRUE, FALSE, L"TESTBACKUPEVENT");
|
|
if (hEventB == NULL)
|
|
{
|
|
wprintf(L"CreateEvent failed with error %d.\n", GetLastError());
|
|
DebugBreak();
|
|
}
|
|
|
|
SetEvent(hEventB);
|
|
WaitForSingleObject(hEventW, INFINITE);
|
|
}
|
|
catch(...)
|
|
{
|
|
_ASSERTE(FALSE && "Unexpected exception");
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
SetConsoleCtrlHandler(CtrlCHandler, FALSE);
|
|
if (bSubscribed)
|
|
CHECK_SUCCESS(pInstance->Unsubscribe());
|
|
|
|
if (bCreated)
|
|
delete pInstance;
|
|
|
|
if (FAILED(hr))
|
|
wprintf(L"Failed with %08x.\n", hr);
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
|
|
|