|
@@ -0,0 +1,439 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#include "stdafx.h"
|
|
|
+#include "rename.h"
|
|
|
+#include <Shlwapi.h>
|
|
|
+#include <io.h>
|
|
|
+#include "PARAMETERS.h"
|
|
|
+
|
|
|
+#ifdef _DEBUG
|
|
|
+#define new DEBUG_NEW
|
|
|
+#endif
|
|
|
+
|
|
|
+HMODULE g_hCurModule = NULL;
|
|
|
+TCHAR g_szCurModulePath[MAX_PATH] = {0};
|
|
|
+TCHAR g_szFna[MAX_PATH] = {0};
|
|
|
+
|
|
|
+BOOL GetDebugPriv();
|
|
|
+void WriteTextLog(const TCHAR *format, ...);
|
|
|
+string GetFileVersion(const string &strFilePath);
|
|
|
+bool GetFileVersion(IN const TCHAR *fname, IN HMODULE hModule, OUT WORD *pBuffer);
|
|
|
+bool GetProductVersion(IN const TCHAR *fname, IN HMODULE hModule, OUT WORD *pBuffer);
|
|
|
+void getopt(PARAMETERS & params, int argc, char ** argv);
|
|
|
+
|
|
|
+
|
|
|
+CWinApp theApp;
|
|
|
+
|
|
|
+using namespace std;
|
|
|
+
|
|
|
+int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
|
|
|
+{
|
|
|
+ int nRetCode = 0;
|
|
|
+ TCHAR szDrive[_MAX_DRIVE] = { 0 };
|
|
|
+ TCHAR szDir[_MAX_DIR] = { 0 };
|
|
|
+ TCHAR szFna[_MAX_DIR] = { 0 };
|
|
|
+ TCHAR szExt[_MAX_DIR] = { 0 };
|
|
|
+ ::GetModuleFileName(NULL, g_szCurModulePath, sizeof(g_szCurModulePath) / sizeof(TCHAR));
|
|
|
+ _tsplitpath_s(g_szCurModulePath, szDrive, szDir, g_szFna, szExt);
|
|
|
+ _tcscpy_s(g_szCurModulePath, szDrive);
|
|
|
+ _tcscat_s(g_szCurModulePath, szDir);
|
|
|
+
|
|
|
+ GetDebugPriv();
|
|
|
+
|
|
|
+ if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
|
|
|
+ {
|
|
|
+
|
|
|
+ _tprintf(_T("错误: MFC 初始化失败\n"));
|
|
|
+ nRetCode = 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ PARAMETERS params;
|
|
|
+ getopt(params, argc, argv);
|
|
|
+#ifdef _DEBUG
|
|
|
+ WriteTextLog(_T("%ld, %ld,%s,%s"),params.dwProcId, params.killproc, params.NewVerPath.c_str(), params.OldVerPath.c_str());
|
|
|
+#endif
|
|
|
+ if ( params.dwProcId != 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ DWORD dwTargetProId = 0;
|
|
|
+ HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, params.dwProcId);
|
|
|
+ if ( hProc != NULL)
|
|
|
+ {
|
|
|
+ if ( params.killproc )
|
|
|
+ {
|
|
|
+ TerminateProcess(hProc, 0);
|
|
|
+ Sleep(500);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ WaitForSingleObject(hProc, INFINITE);
|
|
|
+ CloseHandle(hProc);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!PathFileExists(params.NewVerPath.c_str()))
|
|
|
+ {
|
|
|
+ exit(0);
|
|
|
+ }
|
|
|
+#if 0
|
|
|
+
|
|
|
+ DeleteFile(params.OldVerPath.c_str());
|
|
|
+
|
|
|
+ MoveFile(params.NewVerPath.c_str(), params.OldVerPath.c_str());
|
|
|
+
|
|
|
+ if ( params.killproc )
|
|
|
+ {
|
|
|
+
|
|
|
+ CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
|
|
|
+ SHELLEXECUTEINFO stuExecInfo = { 0 };
|
|
|
+ DWORD dwExitCode = STILL_ACTIVE;
|
|
|
+ stuExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
|
+ stuExecInfo.lpFile = params.OldVerPath.c_str();
|
|
|
+ stuExecInfo.nShow = SW_SHOW;
|
|
|
+ stuExecInfo.lpVerb = _T("open");
|
|
|
+ stuExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
|
|
|
+
|
|
|
+ if (!ShellExecuteEx(&stuExecInfo))
|
|
|
+ {
|
|
|
+ DWORD dwError = GetLastError();
|
|
|
+ WriteTextLog(_T("ShellExecuteEx Error=%ld"), dwError);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ HANDLE hProcess = stuExecInfo.hProcess;
|
|
|
+ if ( hProcess != NULL )
|
|
|
+ {
|
|
|
+
|
|
|
+ CloseHandle(hProcess);
|
|
|
+ }
|
|
|
+ }
|
|
|
+#else
|
|
|
+ if ( params.killproc )
|
|
|
+ {
|
|
|
+
|
|
|
+ CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
|
|
|
+ SHELLEXECUTEINFO stuExecInfo = { 0 };
|
|
|
+ DWORD dwExitCode = STILL_ACTIVE;
|
|
|
+ CString strParameters = _T("/S");
|
|
|
+ stuExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
|
+ stuExecInfo.lpFile = params.NewVerPath.c_str();
|
|
|
+ stuExecInfo.nShow = SW_SHOW;
|
|
|
+
|
|
|
+ stuExecInfo.lpVerb = _T("open");
|
|
|
+ stuExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
|
|
|
+
|
|
|
+ if (!ShellExecuteEx(&stuExecInfo))
|
|
|
+ {
|
|
|
+ DWORD dwError = GetLastError();
|
|
|
+ WriteTextLog(_T("ShellExecuteEx Error=%ld"), dwError);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ HANDLE hProcess = stuExecInfo.hProcess;
|
|
|
+ if ( hProcess != NULL )
|
|
|
+ {
|
|
|
+ CloseHandle(hProcess);
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return nRetCode;
|
|
|
+}
|
|
|
+
|
|
|
+void getopt(PARAMETERS & params, int argc, char ** argv)
|
|
|
+{
|
|
|
+ std::string cmd = "";
|
|
|
+ for ( argc > 0; argc--; argv++ )
|
|
|
+ {
|
|
|
+ if ( _tcsicmp(*argv, _T("--pid")) == 0)
|
|
|
+ {
|
|
|
+ cmd = _T("--pid");
|
|
|
+ }
|
|
|
+ else if (_tcsicmp(*argv, _T("--oldpath")) == 0)
|
|
|
+ {
|
|
|
+ cmd = _T("--oldpath");
|
|
|
+ }
|
|
|
+ else if (_tcsicmp(*argv, _T("--newpath")) == 0)
|
|
|
+ {
|
|
|
+ cmd = _T("--newpath");
|
|
|
+ }
|
|
|
+ else if (_tcsicmp(*argv, _T("--killproc")) == 0)
|
|
|
+ {
|
|
|
+ cmd = _T("--killproc");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if ( _tcsicmp(cmd.c_str(), _T("--pid")) == 0)
|
|
|
+ {
|
|
|
+ params.dwProcId = atoi(*argv);
|
|
|
+ }
|
|
|
+ else if (_tcsicmp(cmd.c_str(), _T("--oldpath")) == 0)
|
|
|
+ {
|
|
|
+ params.OldVerPath = *argv;
|
|
|
+ }
|
|
|
+ else if (_tcsicmp(cmd.c_str(), _T("--newpath")) == 0)
|
|
|
+ {
|
|
|
+ params.NewVerPath = *argv;
|
|
|
+ }
|
|
|
+ else if (_tcsicmp(cmd.c_str(), _T("--killproc")) == 0)
|
|
|
+ {
|
|
|
+ params.killproc = atoi(*argv);
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd = "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+string GetFileVersion(const string &strFilePath)
|
|
|
+{
|
|
|
+ DWORD dwSize;
|
|
|
+ DWORD dwRtn;
|
|
|
+ string szVersion;
|
|
|
+
|
|
|
+ dwSize = GetFileVersionInfoSize(strFilePath.c_str(),NULL);
|
|
|
+ DWORD dwErr = GetLastError();
|
|
|
+ if (dwSize == 0)
|
|
|
+ {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ char *pBuf;
|
|
|
+ pBuf= new char[dwSize + 1];
|
|
|
+ if(pBuf == NULL)
|
|
|
+ return "";
|
|
|
+ memset(pBuf, 0, dwSize + 1);
|
|
|
+
|
|
|
+ dwRtn = GetFileVersionInfo(strFilePath.c_str(),NULL, dwSize, pBuf);
|
|
|
+ if(dwRtn == 0)
|
|
|
+ {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ LPVOID lpBuffer = NULL;
|
|
|
+ UINT uLen = 0;
|
|
|
+
|
|
|
+ dwRtn = VerQueryValue(pBuf,
|
|
|
+ TEXT("\\StringFileInfo\\080404b0\\FileVersion"),
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ CompanyName
|
|
|
+ FileDescription
|
|
|
+ FileVersion
|
|
|
+ InternalName
|
|
|
+ LegalCopyright
|
|
|
+ OriginalFilename
|
|
|
+ ProductName
|
|
|
+ ProductVersion
|
|
|
+ Comments
|
|
|
+ LegalTrademarks
|
|
|
+ PrivateBuild
|
|
|
+ SpecialBuild
|
|
|
+ */
|
|
|
+ &lpBuffer,
|
|
|
+ &uLen);
|
|
|
+ if(dwRtn == 0)
|
|
|
+ {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ szVersion = (char*)lpBuffer;
|
|
|
+ delete pBuf;
|
|
|
+ return szVersion;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+bool GetFileVersion(IN const TCHAR *fname, IN HMODULE hModule, OUT WORD *pBuffer)
|
|
|
+{
|
|
|
+
|
|
|
+ VS_FIXEDFILEINFO *pVi = NULL;
|
|
|
+ DWORD dwHandle = 0;
|
|
|
+ string str;
|
|
|
+
|
|
|
+
|
|
|
+ int size = GetFileVersionInfoSize(fname, &dwHandle);
|
|
|
+
|
|
|
+ if (size > 0)
|
|
|
+ {
|
|
|
+ BYTE *buffer = new BYTE[size];
|
|
|
+ memset(buffer,0,size);
|
|
|
+
|
|
|
+ if (GetFileVersionInfo(fname, dwHandle, size, buffer))
|
|
|
+ {
|
|
|
+ if (VerQueryValue(buffer, _T("\\"), (LPVOID *)&pVi, (PUINT)&size))
|
|
|
+ {
|
|
|
+ pBuffer[0] = HIWORD(pVi->dwFileVersionMS);
|
|
|
+ pBuffer[1] = LOWORD(pVi->dwFileVersionMS);
|
|
|
+ pBuffer[2] = HIWORD(pVi->dwFileVersionLS);
|
|
|
+ pBuffer[3] = LOWORD(pVi->dwFileVersionLS);
|
|
|
+
|
|
|
+ delete []buffer;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ delete []buffer;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+bool GetProductVersion(IN const TCHAR *fname, IN HMODULE hModule, OUT WORD *pBuffer)
|
|
|
+{
|
|
|
+
|
|
|
+ VS_FIXEDFILEINFO *pVi = NULL;
|
|
|
+ DWORD dwHandle = 0;
|
|
|
+ string str;
|
|
|
+
|
|
|
+
|
|
|
+ int size = GetFileVersionInfoSize(fname, &dwHandle);
|
|
|
+
|
|
|
+ if (size > 0)
|
|
|
+ {
|
|
|
+ BYTE *buffer = new BYTE[size];
|
|
|
+ memset(buffer,0,size);
|
|
|
+
|
|
|
+ if (GetFileVersionInfo(fname, dwHandle, size, buffer))
|
|
|
+ {
|
|
|
+ if (VerQueryValue(buffer, _T("\\"), (LPVOID *)&pVi, (PUINT)&size))
|
|
|
+ {
|
|
|
+ pBuffer[0] = HIWORD(pVi->dwProductVersionMS);
|
|
|
+ pBuffer[1] = LOWORD(pVi->dwProductVersionMS);
|
|
|
+ pBuffer[2] = HIWORD(pVi->dwProductVersionLS);
|
|
|
+ pBuffer[3] = LOWORD(pVi->dwProductVersionLS);
|
|
|
+
|
|
|
+ delete []buffer;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ delete []buffer;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+BOOL GetDebugPriv()
|
|
|
+{
|
|
|
+
|
|
|
+ HANDLE hToken;
|
|
|
+
|
|
|
+ LUID sedebugnameValue;
|
|
|
+
|
|
|
+ TOKEN_PRIVILEGES tkp;
|
|
|
+ DWORD dwCurProcId = GetCurrentProcessId();
|
|
|
+
|
|
|
+ HANDLE hCurProc;
|
|
|
+ hCurProc = ::OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwCurProcId );
|
|
|
+
|
|
|
+ if ( !::OpenProcessToken( hCurProc,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
|
|
|
+ {
|
|
|
+ DWORD dwError = GetLastError();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( ! ::LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
|
|
|
+ {
|
|
|
+ DWORD dwError = GetLastError();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ CloseHandle( hToken );
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ tkp.PrivilegeCount = 1;
|
|
|
+ tkp.Privileges[0].Luid = sedebugnameValue;
|
|
|
+ tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
|
+
|
|
|
+ if (!::AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
|
|
|
+ {
|
|
|
+ DWORD dwError = GetLastError();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ CloseHandle( hToken );
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ CloseHandle(hCurProc);
|
|
|
+ CloseHandle(hToken);
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void WriteTextLog(const TCHAR *format, ...)
|
|
|
+{
|
|
|
+
|
|
|
+ TCHAR szlogpath[MAX_PATH] = { 0 };
|
|
|
+ _stprintf_s(szlogpath, _T("%s%s.txt"), g_szCurModulePath, g_szFna);
|
|
|
+
|
|
|
+ FILE *fp = NULL;
|
|
|
+
|
|
|
+#ifndef UNICODE
|
|
|
+ if (_access(szlogpath, 0) != -1)
|
|
|
+#else
|
|
|
+ if (_taccess(szlogpath, 0) != -1)
|
|
|
+#endif
|
|
|
+ {
|
|
|
+ fp = _tfopen(szlogpath, _T("a+"));
|
|
|
+
|
|
|
+ fseek(fp, 0, SEEK_END);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fp = _tfopen(szlogpath, _T("w+"));
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( fp == NULL )
|
|
|
+ return;
|
|
|
+
|
|
|
+
|
|
|
+ TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
|
|
|
+ _tsetlocale(LC_CTYPE, _T("chs"));
|
|
|
+
|
|
|
+
|
|
|
+ va_list args = NULL;
|
|
|
+ int len = 0;
|
|
|
+ TCHAR *buffer = NULL;
|
|
|
+ va_start(args, format);
|
|
|
+
|
|
|
+ len = _vsctprintf(format, args) + 1;
|
|
|
+ buffer = (TCHAR*)malloc(len * sizeof(TCHAR));
|
|
|
+ _vstprintf_s(buffer, len, format, args);
|
|
|
+
|
|
|
+
|
|
|
+ __time64_t gmt = time(NULL);
|
|
|
+ struct tm gmtm = {0};
|
|
|
+ localtime_s(&gmtm, &gmt);
|
|
|
+ _ftprintf(fp, _T("%04d-%02d-%02d %02d:%02d:%02d %s\n"), gmtm.tm_year+1990, gmtm.tm_mon+1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec, buffer);
|
|
|
+
|
|
|
+
|
|
|
+ free(buffer);
|
|
|
+ fclose(fp);
|
|
|
+ _tsetlocale(LC_CTYPE, old_locale);
|
|
|
+ free(old_locale);
|
|
|
+}
|