-
-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathOperationLocate.cpp
92 lines (79 loc) · 3.37 KB
/
OperationLocate.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "OperationLocate.h"
#include "InputOutput.h"
#include "Helpers.h"
ClassFactory<OperationLocate> OperationLocate::RegisteredFactory(GetCommand());
constexpr std::wstring Q(const std::wstring & x)
{
return L"\"" + x + L"\"";
}
OperationLocate::OperationLocate(std::queue<std::wstring> & oArgList, const std::wstring & sCommand) : Operation(oArgList)
{
// exit if there are not enough arguments to parse
const std::vector<std::wstring> sReportFile = ProcessAndCheckArgs(1, oArgList, L"\\0");
const std::vector<std::wstring> sMatchAndArgs = ProcessAndCheckArgs(1, oArgList, L"\\0");
// fetch params
HANDLE hFile = CreateFile(sReportFile.at(0).c_str(), GENERIC_WRITE,
FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
// see if names could be resolved
if (hFile == INVALID_HANDLE_VALUE)
{
// complain
wprintf(L"ERROR: Could not create file '%s' specified for parameter '%s'.\n", sReportFile.at(0).c_str(), GetCommand().c_str());
std::exit(-1);
}
// register the file handle
hReportFile = RegisterFileHandle(hFile, GetCommand());
// if this is the first handle using this file, write out a header
if (hFile == hReportFile)
{
// write out the file type marker
constexpr BYTE hHeader[] = { 0xEF,0xBB,0xBF };
DWORD iBytes = 0;
if (WriteFile(hFile, &hHeader, _countof(hHeader), &iBytes, nullptr) == 0)
{
wprintf(L"ERROR: Could not write out file type marker '%s'.\n", GetCommand().c_str());
std::exit(-1);
}
// write out the header
const std::wstring sToWrite = std::wstring(L"") + Q(L"Path") + L"," + Q(L"Creation Time") + L"," +
Q(L"Modified Time") + L"," + Q(L"Size") + L"," + Q(L"Attributes") + L"," + Q(L"Object Type") + L"\r\n";
if (WriteToFile(sToWrite, hReportFile) == 0)
{
wprintf(L"ERROR: Could not write header to report file for parameter '%s'.\n", GetCommand().c_str());
std::exit(-1);
}
}
// only flag this to apply to the core object with the file name
AppliesToObject = true;
// compile the regular expression
try
{
tRegex = std::wregex(sMatchAndArgs.at(0), std::wregex::icase | std::wregex::optimize);
}
catch (const std::regex_error &)
{
wprintf(L"ERROR: Invalid regular expression '%s' specified for parameter '%s'.\n", sMatchAndArgs.at(0).c_str(), GetCommand().c_str());
std::exit(-1);
}
}
void OperationLocate::ProcessObjectAction(ObjectEntry & tObjectEntry)
{
// skip any file names that do not match the regex
const WCHAR * sFileName = tObjectEntry.Name.c_str();
if (wcsrchr(sFileName, '\\') != nullptr) sFileName = wcsrchr(sFileName, '\\') + 1;
if (!std::regex_match(sFileName, tRegex)) return;
// get common file attributes
const std::wstring sSize = FileSizeToString(tObjectEntry.FileSize);
const std::wstring sAttributes = FileAttributesToString(tObjectEntry.Attributes);
const std::wstring sModifiedTime = FileTimeToString(tObjectEntry.ModifiedTime);
const std::wstring sCreationTime = FileTimeToString(tObjectEntry.CreationTime);
const std::wstring sType = (tObjectEntry.Attributes & FILE_ATTRIBUTE_DIRECTORY) ? L"Container" : L"Leaf";
// write the string to a file
const std::wstring sToWrite = std::wstring(L"") + Q(tObjectEntry.Name) + L"," +
Q(sCreationTime) + L"," + Q(sModifiedTime) +
L"," + Q(sSize) + L"," + Q(sAttributes) + L"," + Q(sType) + L"\r\n";
if (WriteToFile(sToWrite, hReportFile) == 0)
{
InputOutput::AddError(L"Unable to write security information to report file.");
}
}