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