Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

197 lines
3.4 KiB

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