diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d88a617 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/.vs +/x64 +**~ +/*.sdf +/*.VC.opendb +**/Debug/ +**/Release/ diff --git a/cSuRun.sln b/cSuRun.sln new file mode 100755 index 0000000..9008d14 --- /dev/null +++ b/cSuRun.sln @@ -0,0 +1,50 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.24720.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cSuRun", "cSuRun\cSuRun.vcxproj", "{7953E24A-1E10-47B1-8F2B-175E21D19F7D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cSuRunH", "cSuRunH\cSuRunH.vcxproj", "{9AD85A6A-B86E-4138-8FC9-1B7964007A48}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fakeSuRun", "fakeSuRun\fakeSuRun.vcxproj", "{E296E6CB-E32C-44B7-BCD5-449BA6A975CE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "install", "install\install.vcxitems", "{45D41ACC-2C3C-43D2-BC10-02AA73FFC7C7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7953E24A-1E10-47B1-8F2B-175E21D19F7D}.Debug|x64.ActiveCfg = Debug|x64 + {7953E24A-1E10-47B1-8F2B-175E21D19F7D}.Debug|x64.Build.0 = Debug|x64 + {7953E24A-1E10-47B1-8F2B-175E21D19F7D}.Debug|x86.ActiveCfg = Debug|Win32 + {7953E24A-1E10-47B1-8F2B-175E21D19F7D}.Debug|x86.Build.0 = Debug|Win32 + {7953E24A-1E10-47B1-8F2B-175E21D19F7D}.Release|x64.ActiveCfg = Release|x64 + {7953E24A-1E10-47B1-8F2B-175E21D19F7D}.Release|x64.Build.0 = Release|x64 + {7953E24A-1E10-47B1-8F2B-175E21D19F7D}.Release|x86.ActiveCfg = Release|Win32 + {7953E24A-1E10-47B1-8F2B-175E21D19F7D}.Release|x86.Build.0 = Release|Win32 + {9AD85A6A-B86E-4138-8FC9-1B7964007A48}.Debug|x64.ActiveCfg = Debug|x64 + {9AD85A6A-B86E-4138-8FC9-1B7964007A48}.Debug|x64.Build.0 = Debug|x64 + {9AD85A6A-B86E-4138-8FC9-1B7964007A48}.Debug|x86.ActiveCfg = Debug|Win32 + {9AD85A6A-B86E-4138-8FC9-1B7964007A48}.Debug|x86.Build.0 = Debug|Win32 + {9AD85A6A-B86E-4138-8FC9-1B7964007A48}.Release|x64.ActiveCfg = Release|x64 + {9AD85A6A-B86E-4138-8FC9-1B7964007A48}.Release|x64.Build.0 = Release|x64 + {9AD85A6A-B86E-4138-8FC9-1B7964007A48}.Release|x86.ActiveCfg = Release|Win32 + {9AD85A6A-B86E-4138-8FC9-1B7964007A48}.Release|x86.Build.0 = Release|Win32 + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE}.Debug|x64.ActiveCfg = Debug|x64 + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE}.Debug|x64.Build.0 = Debug|x64 + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE}.Debug|x86.ActiveCfg = Debug|Win32 + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE}.Debug|x86.Build.0 = Debug|Win32 + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE}.Release|x64.ActiveCfg = Release|x64 + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE}.Release|x64.Build.0 = Release|x64 + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE}.Release|x86.ActiveCfg = Release|Win32 + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cSuRun/cSuRun.cpp b/cSuRun/cSuRun.cpp new file mode 100755 index 0000000..24aff72 --- /dev/null +++ b/cSuRun/cSuRun.cpp @@ -0,0 +1,140 @@ +// cmd /e:on /v:on /c "for /l %n in (0,0,1) do @(echo !time! & >nul timeout /t 1)" +// cmd /e:on /v:on /c "for /l %n in (0,0,1) do @(echo !time! & >nul ping -n 2 localhost)" + +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include + +#include "../cSuRun/strdefs.h" + +#define NUM_INSTANCES (4) +HANDLE pipes[NUM_INSTANCES][2] = { + { GetStdHandle(STD_INPUT_HANDLE), NULL }, + { NULL, GetStdHandle(STD_OUTPUT_HANDLE) }, + { NULL, GetStdHandle(STD_ERROR_HANDLE) } +}; + +DWORD WINAPI RedirStdBytesThread(int i) +{ + char ch; + DWORD cch; + + while (1) + { + if (!ReadFile(pipes[i][0], &ch, sizeof(ch), &cch, NULL)) + break; + if (!cch) + break; + if (!WriteFile(pipes[i][1], &ch, sizeof(ch), &cch, NULL)) + break; + if (!cch) + break; + } + return 0; +} + +wchar_t* strip_part(wchar_t **pcmdline) +{ + wchar_t *start = *pcmdline; + wchar_t *end; + + if (*start == '"') + { + if (!(end = wcschr(start + 1, '"'))) + return 0; + end++; + } + else + { + if (!(end = wcschr(start, ' '))) + end = wcschr(start, 0); + } + if (*end != 0) + { + if (*end != ' ') + return 0; + *end = 0; + do end++; while (*end != 0 && *end == ' '); + } + *pcmdline = end; + return start; +} + +int main() +{ + STARTUPINFO si = { sizeof(STARTUPINFO) }; + PROCESS_INFORMATION pi = { 0 }; + wchar_t *pch; + wchar_t *commandLine = GetCommandLine(); + wchar_t *application; + wchar_t *helper_bin = (LPWSTR)malloc(4096); + wchar_t *surun_cmdline = (LPWSTR)malloc(4096); + wchar_t *application_full = (LPWSTR)malloc(4096); + wchar_t pipename[PIPENAME_LEN]; + DWORD exitCode; + int nh = 0; + + GetModuleFileName(NULL, helper_bin, 2047); + pch = wcsrchr(helper_bin, L'.'); + wcscpy(pch, L"H.bin"); + + if (!(strip_part(&commandLine) && (application = strip_part(&commandLine)))) + { + return 1; + } + if (*application == 0 || !wcscmp(application, L"\"\"")) + { + return 1; + } + if (!CreateProcess(NULL, application, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) + { + return 1; + } + GetModuleFileNameEx(pi.hProcess, NULL, application_full, 2047); + TerminateProcess(pi.hProcess, 0); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + StringCchPrintf(surun_cmdline, 2048, CMDLINE_INVOKE_FMT, + helper_bin, GetCurrentProcessId(), application_full, commandLine); + free(helper_bin); + free(application_full); + //wprintf(L"%s\n", surun_cmdline); + if (!CreateProcess(NULL, surun_cmdline, NULL, NULL, + FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) + { + return 1; + } + + free(surun_cmdline); + + StringCchPrintf(pipename, PIPENAME_LEN, PIPENAME_FMT, GetCurrentProcessId()); + //wprintf(L"%s\n", pipe_name); + pipes[0][1] = CreateNamedPipe(pipename, PIPE_ACCESS_DUPLEX, 0, NUM_INSTANCES, 1, 1, 0, NULL); + pipes[1][0] = CreateNamedPipe(pipename, PIPE_ACCESS_DUPLEX, 0, NUM_INSTANCES, 1, 1, 0, NULL); + pipes[2][0] = CreateNamedPipe(pipename, PIPE_ACCESS_DUPLEX, 0, NUM_INSTANCES, 1, 1, 0, NULL); + pipes[3][0] = CreateNamedPipe(pipename, PIPE_ACCESS_DUPLEX, 0, NUM_INSTANCES, 1, 1, 0, NULL); + //DWORD pid; + //HANDLE hprocess; + + ResumeThread(pi.hThread); + WaitForSingleObject(pi.hProcess, INFINITE); + + GetExitCodeProcess(pi.hProcess, &exitCode); + if (exitCode) + return exitCode; + + ConnectNamedPipe(pipes[0][1], NULL); + ConnectNamedPipe(pipes[1][0], NULL); + ConnectNamedPipe(pipes[2][0], NULL); + ConnectNamedPipe(pipes[3][0], NULL); + + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RedirStdBytesThread, (LPVOID)0, 0, NULL); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RedirStdBytesThread, (LPVOID)1, 0, NULL); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RedirStdBytesThread, (LPVOID)2, 0, NULL); + + ReadFile(pipes[3][0], &exitCode, sizeof(exitCode), NULL, NULL); + return exitCode; +} diff --git a/cSuRun/cSuRun.vcxproj b/cSuRun/cSuRun.vcxproj new file mode 100755 index 0000000..c833a23 --- /dev/null +++ b/cSuRun/cSuRun.vcxproj @@ -0,0 +1,157 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {7953E24A-1E10-47B1-8F2B-175E21D19F7D} + Win32Proj + cSuRun + 8.1 + + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + + + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/cSuRun/cSuRun.vcxproj.filters b/cSuRun/cSuRun.vcxproj.filters new file mode 100755 index 0000000..d8af13f --- /dev/null +++ b/cSuRun/cSuRun.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + + + Source Files + + + \ No newline at end of file diff --git a/cSuRun/cSuRun.vcxproj.user b/cSuRun/cSuRun.vcxproj.user new file mode 100755 index 0000000..96d3740 --- /dev/null +++ b/cSuRun/cSuRun.vcxproj.user @@ -0,0 +1,19 @@ + + + + cmd /e:on /v:on /c "for /l %n in (0,0,1) do @(echo !time! & >nul ping -n 2 localhost)" + WindowsLocalDebugger + + + cmd /e:on /v:on /c "for /l %n in (0,0,1) do @(echo !time! & >nul ping -n 2 localhost)" + WindowsLocalDebugger + + + cmd /e:on /v:on /c "for /l %n in (0,0,1) do @(echo !time! & >nul ping -n 2 localhost)" + WindowsLocalDebugger + + + cmd /e:on /v:on /c "for /l %n in (0,0,1) do @(echo !time! & >nul ping -n 2 localhost)" + WindowsLocalDebugger + + \ No newline at end of file diff --git a/cSuRun/strdefs.h b/cSuRun/strdefs.h new file mode 100755 index 0000000..45a2976 --- /dev/null +++ b/cSuRun/strdefs.h @@ -0,0 +1,19 @@ +#ifndef __STRDEFS_H__ +#define __STRDEFS_H__ + +#define PIPENAME(pid) (L"\\\\.\\pipe\\cSuRun-" pid) +#define PIPENAME_FMT PIPENAME("%d") +#define PIPENAME_MAX PIPENAME("4294967296") +#define PIPENAME_LEN (sizeof(PIPENAME_MAX) / sizeof(PIPENAME_MAX[0])) + +#if defined(_DEBUG) && !defined(DEBUG_NO_FAKE_SURUN) +#define SURUN_CMD "fakesurun" +#else +#define SURUN_CMD "surun" +#endif + +#define CMDLINE(pre, post) (L"" pre "/attach:%08x " post) +#define CMDLINE_INVOKE_FMT CMDLINE(SURUN_CMD " \"%s\" ", "\"%s\" %s") +#define CMDLINE_PARSE_FMT CMDLINE("", "%n") + +#endif //__STRDEFS_H__ diff --git a/cSuRunH/cSuRunH.cpp b/cSuRunH/cSuRunH.cpp new file mode 100755 index 0000000..26c250d --- /dev/null +++ b/cSuRunH/cSuRunH.cpp @@ -0,0 +1,42 @@ +#include +#include + +#include "../cSuRun/strdefs.h" + +int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR lpCmdLine, int) +{ + SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES) }; + STARTUPINFO si = { sizeof(STARTUPINFO) }; + PROCESS_INFORMATION pi = { 0 }; + int cmdOffset; + wchar_t pipename[PIPENAME_LEN]; + DWORD csurun_pid; + DWORD exitcode; + + if (swscanf_s(lpCmdLine, CMDLINE_PARSE_FMT, &csurun_pid, &cmdOffset) != 1 || !AttachConsole(csurun_pid)) + return 1; + + sa.bInheritHandle = TRUE; + + StringCchPrintf(pipename, PIPENAME_LEN, PIPENAME_FMT, csurun_pid); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = CreateFile(pipename, GENERIC_READ, 0, &sa, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + si.hStdOutput = CreateFile(pipename, GENERIC_WRITE, 0, &sa, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + si.hStdError = CreateFile(pipename, GENERIC_WRITE, 0, &sa, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + HANDLE hcomm = CreateFile(pipename, GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + CreateProcess(NULL, lpCmdLine + cmdOffset, NULL, NULL, + TRUE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); + + ResumeThread(pi.hThread); + WaitForSingleObject(pi.hProcess, INFINITE); + GetExitCodeProcess(pi.hProcess, &exitcode); + WriteFile(hcomm, &exitcode, sizeof(exitcode), NULL, NULL); + + return 0; +} diff --git a/cSuRunH/cSuRunH.vcxproj b/cSuRunH/cSuRunH.vcxproj new file mode 100755 index 0000000..f5f5f6f --- /dev/null +++ b/cSuRunH/cSuRunH.vcxproj @@ -0,0 +1,158 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {9AD85A6A-B86E-4138-8FC9-1B7964007A48} + Win32Proj + cSuRunH + 8.1 + + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + .bin + + + true + .bin + + + false + .bin + + + false + .bin + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + + + Level3 + Disabled + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/cSuRunH/cSuRunH.vcxproj.filters b/cSuRunH/cSuRunH.vcxproj.filters new file mode 100755 index 0000000..fdfd53c --- /dev/null +++ b/cSuRunH/cSuRunH.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/cSuRunH/cSuRunH.vcxproj.user b/cSuRunH/cSuRunH.vcxproj.user new file mode 100755 index 0000000..6fb136b --- /dev/null +++ b/cSuRunH/cSuRunH.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/fakeSuRun/fakeSuRun.cpp b/fakeSuRun/fakeSuRun.cpp new file mode 100755 index 0000000..3917d14 --- /dev/null +++ b/fakeSuRun/fakeSuRun.cpp @@ -0,0 +1,16 @@ +#include + +int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR lpCmdLine, int) +{ + STARTUPINFO si = { sizeof(STARTUPINFO) }; + PROCESS_INFORMATION pi = { 0 }; + + int answer; + answer = MessageBox(NULL, lpCmdLine, L"fakeSuRun", MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) ; + if (answer != IDYES) + return 255; + + if (!CreateProcess(NULL, lpCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + return 255; + return 0; +} diff --git a/fakeSuRun/fakeSuRun.vcxproj b/fakeSuRun/fakeSuRun.vcxproj new file mode 100755 index 0000000..3261686 --- /dev/null +++ b/fakeSuRun/fakeSuRun.vcxproj @@ -0,0 +1,154 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {E296E6CB-E32C-44B7-BCD5-449BA6A975CE} + Win32Proj + fakeSuRun + 8.1 + + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + + + Level3 + Disabled + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/fakeSuRun/fakeSuRun.vcxproj.filters b/fakeSuRun/fakeSuRun.vcxproj.filters new file mode 100755 index 0000000..afb2b8c --- /dev/null +++ b/fakeSuRun/fakeSuRun.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/install/install.cmd b/install/install.cmd new file mode 100755 index 0000000..1f6c6af --- /dev/null +++ b/install/install.cmd @@ -0,0 +1,35 @@ +@echo off +setlocal enableextensions enabledelayedexpansion + +set /a t=( ( %RANDOM% * %RANDOM% ) %% 900000 + 100000 ) +set t=%SystemRoot%\csurun-install-%t% +( set -p "x=" %t% ) 2>nul || ( + surun "%~dpnx0" && goto test + echo\installation canceled>&2 + exit /b 1 +) +del %t% +pushd "%~dp0\.." +if "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( + cd x64 +) else if "%PROCESSOR_ARCHITECTURE%,%PROCESSOR_ARCHITEW6432%"=="x86,AMD64" ( + cd x64 +) +cd Release +prompt %PROMPT%$_ +echo on +copy cSuRun.exe "%SystemRoot%" +copy cSuRunH.bin "%SystemRoot%" +@echo off +prompt %PROMPT:~0,-2% +popd +echo\ +pause +exit /b + +:test +echo\ +echo\wait until installation has finished +pause +csurun cmd /c "mklink /d "%t%" . && rmdir "%t%"" +pause diff --git a/install/install.vcxitems b/install/install.vcxitems new file mode 100755 index 0000000..a3aaceb --- /dev/null +++ b/install/install.vcxitems @@ -0,0 +1,19 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {45d41acc-2c3c-43d2-bc10-02aa73ffc7c7} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + \ No newline at end of file