windows-nt/Source/XPSP1/NT/net/diagnostics/netwatch/update.cpp
2020-09-26 16:20:57 +08:00

147 lines
2.7 KiB
C++

// update.cpp
//
// Copyright 2000 Microsoft Corporation, all rights reserved
//
// Created 2-00 - anbrad
//
#include "update.h"
#include "main.h"
#include <shlwapi.h>
#include "resource.h"
const TCHAR c_szNetwatch[] = TEXT("\\\\scratch\\scratch\\anbrad\\netwatch.exe");
bool WaitForOrigProcess()
{
DWORD dw;
LPCTSTR szCmd = GetCommandLine();
LPCTSTR szSpace;
szSpace = szCmd;
while (*szSpace)
{
if (*szSpace == ' ')
break;
++szSpace;
}
if (*szSpace)
{
++szSpace;
dw = atol(szSpace);
WaitForSingleObject ((HANDLE)dw, INFINITE);
return true;
}
return false;
}
bool CheckForUpdate()
{
bool rt;
bool bDel;
FILETIME ftCurrent;
FILETIME ftScratch;
WIN32_FIND_DATA ffd;
HANDLE h = INVALID_HANDLE_VALUE;
HANDLE hDel = INVALID_HANDLE_VALUE;
HANDLE hOurProcess = NULL;
TCHAR szModule[MAX_PATH];
TCHAR szDeleteModule[MAX_PATH];
TCHAR szCommand[128];
bDel = WaitForOrigProcess();
h = FindFirstFile(c_szNetwatch, &ffd);
if (INVALID_HANDLE_VALUE == h)
{
rt = true;
goto Exit;
}
ftScratch = ffd.ftLastWriteTime;
GetModuleFileName(g_hInst, szModule, sizeof(szModule)/sizeof(TCHAR));
FindClose(h);
h = FindFirstFile(szModule, &ffd);
if (INVALID_HANDLE_VALUE == h)
{
rt = true;
goto Exit;
}
// netwatch1.exe
_tcscpy (szDeleteModule, szModule);
PathRemoveExtension(szDeleteModule);
_tcscat(szDeleteModule, "1");
PathAddExtension(szDeleteModule, ".exe");
if (bDel)
DeleteFile(szDeleteModule);
ftCurrent = ffd.ftLastWriteTime;
if ((ftCurrent.dwHighDateTime > ftScratch.dwHighDateTime) ||
((ftCurrent.dwHighDateTime == ftScratch.dwHighDateTime) &&
(ftCurrent.dwLowDateTime >= ftScratch.dwLowDateTime)))
{
rt = true;
goto Exit;
}
// If we get here then we need to UPDATE
//
// Rename current file
//
if (!MoveFile(szModule, szDeleteModule))
{
rt = true;
goto Exit;
}
if (!CopyFile(c_szNetwatch, szModule, TRUE))
{
rt = true;
goto Exit;
}
hOurProcess = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());
wsprintf(szCommand, "%s %d", szModule, hOurProcess);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCommand, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
rt = false;
Exit:
if (INVALID_HANDLE_VALUE != h)
FindClose(h);
if (hOurProcess)
CloseHandle(hOurProcess);
return rt; // keep going
}