Leaked source code of windows server 2003
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

#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);
}