198 lines
3.4 KiB
C++
198 lines
3.4 KiB
C++
|
#include "StdAfx.h"
|
||
|
#include "MonitorThread.h"
|
||
|
|
||
|
|
||
|
namespace nsMonitorThread
|
||
|
{
|
||
|
|
||
|
_bstr_t GetLogFolder();
|
||
|
|
||
|
}
|
||
|
|
||
|
using namespace nsMonitorThread;
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// MonitorThread Class
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
// Constructor
|
||
|
|
||
|
CMonitorThread::CMonitorThread() :
|
||
|
m_hMigrationLog(NULL)
|
||
|
{
|
||
|
SYSTEMTIME st;
|
||
|
GetSystemTime(&st);
|
||
|
|
||
|
if (!SystemTimeToFileTime(&st, &m_ftMigrationLogLastWriteTime))
|
||
|
{
|
||
|
m_ftMigrationLogLastWriteTime.dwLowDateTime = 0;
|
||
|
m_ftMigrationLogLastWriteTime.dwHighDateTime = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// Destructor
|
||
|
|
||
|
CMonitorThread::~CMonitorThread()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
// Start Method
|
||
|
|
||
|
void CMonitorThread::Start()
|
||
|
{
|
||
|
CThread::StartThread();
|
||
|
}
|
||
|
|
||
|
|
||
|
// Stop Method
|
||
|
|
||
|
void CMonitorThread::Stop()
|
||
|
{
|
||
|
CThread::StopThread();
|
||
|
}
|
||
|
|
||
|
|
||
|
// Run Method
|
||
|
|
||
|
void CMonitorThread::Run()
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
_bstr_t strFolder = GetLogFolder();
|
||
|
|
||
|
if (strFolder.length() > 0)
|
||
|
{
|
||
|
m_strMigrationLog = strFolder + _T("Migration.log");
|
||
|
|
||
|
HANDLE hChange = FindFirstChangeNotification(strFolder, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);
|
||
|
|
||
|
HANDLE hHandles[2] = { StopEvent(), hChange };
|
||
|
|
||
|
while (WaitForMultipleObjects(2, hHandles, FALSE, INFINITE) == (WAIT_OBJECT_0 + 1))
|
||
|
{
|
||
|
ProcessMigrationLog();
|
||
|
|
||
|
FindNextChangeNotification(hChange);
|
||
|
}
|
||
|
|
||
|
FindCloseChangeNotification(hChange);
|
||
|
|
||
|
ProcessMigrationLog();
|
||
|
|
||
|
if (m_hMigrationLog)
|
||
|
{
|
||
|
CloseHandle(m_hMigrationLog);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch (...)
|
||
|
{
|
||
|
;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// ProcessMigrationLog Method
|
||
|
|
||
|
void CMonitorThread::ProcessMigrationLog()
|
||
|
{
|
||
|
if (m_hMigrationLog == NULL)
|
||
|
{
|
||
|
m_hMigrationLog = CreateFile(
|
||
|
m_strMigrationLog,
|
||
|
GENERIC_READ,
|
||
|
FILE_SHARE_READ|FILE_SHARE_WRITE,
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL
|
||
|
);
|
||
|
|
||
|
if (m_hMigrationLog)
|
||
|
{
|
||
|
_TCHAR ch;
|
||
|
DWORD dwBytesRead;
|
||
|
|
||
|
if (ReadFile(m_hMigrationLog, &ch, sizeof(ch), &dwBytesRead, NULL) && (dwBytesRead > 0))
|
||
|
{
|
||
|
if (ch != _T('\xFEFF'))
|
||
|
{
|
||
|
SetFilePointer(m_hMigrationLog, 0, NULL, FILE_BEGIN);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (m_hMigrationLog)
|
||
|
{
|
||
|
BY_HANDLE_FILE_INFORMATION bhfiInformation;
|
||
|
|
||
|
if (GetFileInformationByHandle(m_hMigrationLog, &bhfiInformation))
|
||
|
{
|
||
|
if (CompareFileTime(&bhfiInformation.ftLastWriteTime, &m_ftMigrationLogLastWriteTime) == 1)
|
||
|
{
|
||
|
m_ftMigrationLogLastWriteTime = bhfiInformation.ftLastWriteTime;
|
||
|
|
||
|
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
|
||
|
|
||
|
_TCHAR szBuffer[1024];
|
||
|
DWORD dwBytesRead;
|
||
|
|
||
|
while (ReadFile(m_hMigrationLog, szBuffer, sizeof(szBuffer), &dwBytesRead, NULL) && (dwBytesRead > 0))
|
||
|
{
|
||
|
DWORD dwCharsWritten;
|
||
|
|
||
|
WriteConsole(hStdOut, szBuffer, dwBytesRead / sizeof(_TCHAR), &dwCharsWritten, NULL);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
namespace nsMonitorThread
|
||
|
{
|
||
|
|
||
|
|
||
|
// GetLogFolder Method
|
||
|
|
||
|
_bstr_t GetLogFolder()
|
||
|
{
|
||
|
_bstr_t strFolder;
|
||
|
|
||
|
HKEY hKey;
|
||
|
|
||
|
DWORD dwError = RegOpenKey(HKEY_LOCAL_MACHINE, _T("Software\\Mission Critical Software\\DomainAdmin"), &hKey);
|
||
|
|
||
|
if (dwError == ERROR_SUCCESS)
|
||
|
{
|
||
|
_TCHAR szPath[_MAX_PATH];
|
||
|
DWORD cbPath = sizeof(szPath);
|
||
|
|
||
|
dwError = RegQueryValueEx(hKey, _T("Directory"), NULL, NULL, (LPBYTE)szPath, &cbPath);
|
||
|
|
||
|
if (dwError == ERROR_SUCCESS)
|
||
|
{
|
||
|
_TCHAR szDrive[_MAX_DRIVE];
|
||
|
_TCHAR szDir[_MAX_DIR];
|
||
|
|
||
|
_tsplitpath(szPath, szDrive, szDir, NULL, NULL);
|
||
|
_tcscat(szDir, _T("Logs"));
|
||
|
_tmakepath(szPath, szDrive, szDir, NULL, NULL);
|
||
|
|
||
|
strFolder = szPath;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
}
|
||
|
|
||
|
return strFolder;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|