124 lines
3.2 KiB
C++
124 lines
3.2 KiB
C++
/*
|
|
Copyright (c) 2009 Microsoft Corporation
|
|
|
|
Module Name:
|
|
main.cpp
|
|
|
|
This is an implementation of a sample Writer. It should be used for reference
|
|
when building your own Writers. Please note that this Writer should not be used
|
|
in a production environment. It aims to demonstrates certain concepts that are
|
|
already documented on MSDN, making it even easier to understand them.
|
|
|
|
It is important to understand that Writers should only cover files that are
|
|
exclusively handled by the application Writer is being developed for. Since
|
|
this sample has no corresponding application, it manages common files that
|
|
can be found on the boxes: text documents, spreadsheets, images.These files
|
|
are being generated by many different applications and that may or may not be
|
|
handled by some real Writer in the future. Since Writers should only work
|
|
with files they handle exclusively, scenarios demonstrated are purely for
|
|
testing purposes.
|
|
|
|
For data safety this Writer does not alter any files on the disk. However
|
|
it is strongly encouraged to run it in a sandbox, on a designated test machine.
|
|
|
|
Files that are being backed up by this writer are *.doc, *.docx, *.xls, *.xlsx,
|
|
*.jpe, *.jpg, *.jpeg, *png, *.gif and *.bmp. Writer will search for those files
|
|
on the machine in profile directories for every existing user.
|
|
|
|
This Writer can be exercised using BeTest tool included in the Windows SDK.
|
|
|
|
*/
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "swriter.h"
|
|
|
|
|
|
HANDLE g_quitEvent = NULL;
|
|
|
|
|
|
BOOL WINAPI ConsoleControlHandler(DWORD dwParam)
|
|
{
|
|
UNREFERENCED_PARAMETER(dwParam);
|
|
|
|
// We want to quit regardless of what the control event was
|
|
::SetEvent(g_quitEvent);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
int __cdecl wmain(int argc, WCHAR *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
int iResult = 1;
|
|
|
|
UNREFERENCED_PARAMETER(argc);
|
|
UNREFERENCED_PARAMETER(argv);
|
|
|
|
hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
if (FAILED(hr))
|
|
{
|
|
wprintf(L"(!) CoInitializeEx failed");
|
|
return 1;
|
|
}
|
|
|
|
hr = ::CoInitializeSecurity(
|
|
NULL,
|
|
-1,
|
|
NULL,
|
|
NULL,
|
|
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
RPC_C_IMP_LEVEL_IDENTIFY,
|
|
NULL,
|
|
EOAC_NONE,
|
|
NULL);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
wprintf(L"(!) CoInitializeSecurity failed");
|
|
goto _exit;
|
|
}
|
|
|
|
g_quitEvent = ::CreateEventW(NULL, TRUE, FALSE, NULL);
|
|
if (g_quitEvent == NULL)
|
|
{
|
|
wprintf(L"(!) CreateEventW failed");
|
|
goto _exit;
|
|
}
|
|
|
|
// Set a control handler that allows the writer to be shut down with Ctrl+C
|
|
if (!::SetConsoleCtrlHandler(ConsoleControlHandler, TRUE))
|
|
{
|
|
wprintf(L"(!) SetConsoleSecurityHandler failed");
|
|
goto _exit;
|
|
}
|
|
|
|
// We want the writer to go out of scope before the return statement
|
|
{
|
|
SampleWriter writer;
|
|
hr = writer.Initialize();
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
wprintf(L"(!) SampleWriter::Initialize failed");
|
|
goto _exit;
|
|
}
|
|
|
|
|
|
if (::WaitForSingleObject(g_quitEvent, INFINITE) != WAIT_OBJECT_0)
|
|
{
|
|
wprintf(L"(!) WaitForSingleObject failed");
|
|
goto _exit;
|
|
}
|
|
writer.Uninitialize();
|
|
}
|
|
|
|
iResult = 0;
|
|
|
|
_exit:
|
|
return iResult;
|
|
}
|
|
|
|
|