Tuesday, November 29, 2016

"UEStudio | UltraEdit | UltraCompare" starter / loader.

  • ue_starter.c
  • make_vs.bat
  • usage.txt
  • ue_starter.b64

ue_starter.c

//    _ __   _____      _________  _ __ _ __ ___
//   | '_ \ / _ \ \ /\ / /_  / _ \| '__| '__/ _ \
//   | | | | (_) \ V  V / / / (_) | |  | | | (_) |
//   |_| |_|\___/ \_/\_/ /___\___/|_|  |_|  \___/
//

#include 

// #pragma comment(lib, "kernel32.lib")
// #pragma comment(lib, "user32.lib")

// #define UESTUDIO
// #define ULTRAEDIT
// #define ULTRACOMPARE

#ifdef UESTUDIO
    #define APP_FILENAME  TEXT("UEStudio.exe")
    #define APP_TITLE     TEXT("UEStudio")
#elif defined(ULTRAEDIT)
    #define APP_FILENAME  TEXT("Uedit32.exe")
    #define APP_TITLE     TEXT("UltraEdit")
#elif defined(ULTRACOMPARE)
    #define APP_FILENAME  TEXT("uc.exe")
    #define APP_TITLE     TEXT("UltraCompare")
#else
    #error Specify Application
#endif

#define TRIAL_WND_CLASS   "#32770"
#define TRIAL_WND_NAME    "Trial Period Expiring"

#define INIT_WAIT_TIMEOUT 5000
#define TRY_FIND_TIMEOUT  5000
#define TRY_FIND_SLEEP    10
#define TRY_FIND_COUNT    (TRY_FIND_TIMEOUT / TRY_FIND_SLEEP)

enum
{
    RESULT_OK = 0,
    RESULT_ERROR_CANT_RUN,
    RESULT_ERROR_INIT_HOOK,
    RESULT_ERROR_TRIAL_WND_NOT_FOUND,
    RESULT_ERROR_MAIN_WND_NOT_FOUND,
    RESULT_ERROR_CANT_ENABLE_MAIN_WND
};

const TCHAR *MESSAGE[] =
{
    0,
    TEXT("Cannot run ") APP_TITLE TEXT("."),
    TEXT("Amicus certus in re incerta cernitur."),
    TEXT("Ibi semper est victoria, ubi concordia est."),
    TEXT("Oderint, dum metuant."),
    TEXT("Amor non est medicabilis herbis.")
};

// Use ASM -> Disable CRT version
__inline
void _zeroMemory(void *p, size_t count)
{
    _asm
    {
        push ecx
        push edi
        mov al, 0
        mov ecx, count
        mov edi, p
        rep stosb
        pop edi
        pop ecx
    }
}

// Return process handle
HANDLE runProcess(/* const */ TCHAR *path)
{
    STARTUPINFO si;
    _zeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi;
    _zeroMemory(&pi, sizeof(pi));
    if (!CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
        return NULL;
    CloseHandle(pi.hThread);
    return pi.hProcess;
}

TCHAR* skipCommandLinePath(TCHAR *s)
{
    if (TEXT('"') == *s)
    {
        ++s;
        for (; *s && *s != TEXT('"'); ++s);
        if (TEXT('"') == *s)
            ++s;
    }
    else
        for (; *s > TEXT(' '); ++s);
    for (; *s && *s <= TEXT(' '); ++s);
    return s;
}

int work(TCHAR *commandLine)
{
    TCHAR path[] = APP_FILENAME;
    HANDLE hProcess = runProcess(commandLine && commandLine[0] != TEXT('\0') ? commandLine : path);

    if (!hProcess)
        return RESULT_ERROR_CANT_RUN;

    // Wait until app has finished initialization
    if (WaitForInputIdle(hProcess, INIT_WAIT_TIMEOUT) != 0)
    {
        CloseHandle(hProcess);
        return RESULT_ERROR_INIT_HOOK;
    }
    CloseHandle(hProcess);

    HWND hTrialWnd = NULL;
    for (int i = TRY_FIND_COUNT; i-- && !hTrialWnd; Sleep(TRY_FIND_SLEEP))
    {
        hTrialWnd = FindWindowA(TRIAL_WND_CLASS, TRIAL_WND_NAME);
        if (hTrialWnd)
            break;
    }

    if (!hTrialWnd)
        return RESULT_ERROR_TRIAL_WND_NOT_FOUND;

    for (int i = TRY_FIND_COUNT; i-- && !IsWindowVisible(hTrialWnd); )
    {
        UINT flags = SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |
                     SWP_NOSIZE | SWP_NOZORDER | SWP_NOREDRAW;
        SetWindowPos(hTrialWnd, NULL, -2000, -2000, 0, 0, flags);
        Sleep(TRY_FIND_SLEEP);
    }

    // LONG exStyle = GetWindowLong(hTrialWnd, GWL_EXSTYLE);
    // exStyle = exStyle & ~WS_EX_DLGMODALFRAME;
    // SetWindowLongA(hTrialWnd, GWL_EXSTYLE, exStyle);

    HWND hMainWnd = GetParent(hTrialWnd);
    if (!hMainWnd)
        return RESULT_ERROR_MAIN_WND_NOT_FOUND;
    if (!IsWindowEnabled(hMainWnd))
    {
        EnableWindow(hMainWnd, TRUE);
        if (!IsWindowEnabled(hMainWnd))
            return RESULT_ERROR_CANT_ENABLE_MAIN_WND;
    }

    if (IsWindowVisible(hTrialWnd))
    {
        ShowWindow(hTrialWnd, SW_HIDE);
        for (int i = TRY_FIND_COUNT; i-- && IsWindowVisible(hTrialWnd); )
            Sleep(TRY_FIND_SLEEP);
        SetForegroundWindow(hMainWnd);
    }

    return RESULT_OK;
}

void WINAPI main()
{
    TCHAR *commandLine = GetCommandLine();
    commandLine = skipCommandLinePath(commandLine);
    int result = work(commandLine);
    if (result != RESULT_OK)
        MessageBox(NULL, MESSAGE[result], TEXT("Error"), MB_OK | MB_ICONERROR);
    ExitProcess(result);
}

make_vs.bat

::    _ __   _____      _________  _ __ _ __ ___
::   | '_ \ / _ \ \ /\ / /_  / _ \| '__| '__/ _ \
::   | | | | (_) \ V  V / / / (_) | |  | | | (_) |
::   |_| |_|\___/ \_/\_/ /___\___/|_|  |_|  \___/

@echo off

set DEFINE_APP=UESTUDIO
set OUT_FILENAME=uestudio
call :MAKE

set DEFINE_APP=ULTRAEDIT
set OUT_FILENAME=uedit
call :MAKE

set DEFINE_APP=ULTRACOMPARE
set OUT_FILENAME=ucompare
call :MAKE

goto :EOF

:MAKE
:: Base for XP Toolset
set SDK71PATH=%ProgramFiles%\Microsoft SDKs\Windows\7.1A
path %SDK71PATH%\Bin;%PATH%
set CL=/W3 /O1 /GL /GF /GS- /MT /EHsa- /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D_USING_V110_SDK71_
set CL=%CL% /D "_UNICODE" /D "UNICODE"
set LINK=/LTCG /OPT:REF /OPT:ICF /DYNAMICBASE:NO /NXCOMPAT:NO /SUBSYSTEM:WINDOWS,5.01 /FIXED /NODEFAULTLIB /MERGE:.rdata=.text /ENTRY:main
set INCLUDE=%INCLUDE%;%SDK71PATH%\Include
set LIB=%LIB%;%SDK71PATH%\Lib

:: Prepare VC++2013 compiler
:: call "%VS120COMNTOOLS%\vsvars32.bat"
:: Prepare VC++2015 compiler
call "%VS140COMNTOOLS%\vsvars32.bat"
if errorlevel 1 goto :EOF

::Compile
cl.exe /nologo /D %DEFINE_APP% ue_starter.c "kernel32.lib" "user32.lib" /link /NOLOGO /OUT:start_%OUT_FILENAME%.exe && del *.obj

usage.txt

1) Copy starter to .exe folder:
   [c:\Program Files\..\UEStudio]
    UEStudio.exe
    start_uestudio.exe

2) Or set command line parameter in shortcut:
    start_uestudio.exe "c:\Program Files\..\UEStudio.exe"
    
Note: Use icon from UEStudio.exe

ue_starter.b64

MIME-Version: 1.0
Content-Type: application/octet-stream; name="ue_starter.7z"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="ue_starter.7z"

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

No comments:

Post a Comment