打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
windows 下的自动更新

windows 下的自动更新

jackyhwei 发布于 2011-09-02 16:30 点击:198次
Windows下实现自动更新的实现代码。

#include <stdio.h>
#include <assert.h>
#include <windows.h>

static int update_start(const char *path)
{
    HANDLE hProcess = NULL;
    STARTUPINFO startupInfo = {0};
    PROCESS_INFORMATION processInfo;

    char module[256];
    char cmdline[8192];
    startupInfo.cb = sizeof(startupInfo);
    hProcess = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());
    size_t count = GetModuleFileName(NULL, module, sizeof(module));
    assert(count < sizeof(module));
    snprintf(cmdline, sizeof(cmdline),
            "update.exe %p -wait %s -delete %s -copy %s -final",
            hProcess, module, module, module);
    if (CreateProcess(path, cmdline, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS,
                NULL, NULL, &startupInfo, &processInfo) != TRUE) {
        printf("Create Process Fail: %d!\n", GetLastError());
        return -1;
    }
    CloseHandle(processInfo.hThread);
    CloseHandle(processInfo.hProcess);
    CloseHandle(hProcess);
    return 0;
}

static int update_wait(const char *handle)
{
    HANDLE hProcess = NULL;
    int count = sscanf(handle, "%p", &hProcess);
    assert(count == 1);
    WaitForSingleObject(hProcess, INFINITE);
    CloseHandle(hProcess);
    return 0;
}

static int update_final(const char *path)
{
    HANDLE hProcess = NULL;
    STARTUPINFO startupInfo = {0};
    PROCESS_INFORMATION processInfo;

    char module[256];
    char cmdline[8192];
    startupInfo.cb = sizeof(startupInfo);
    hProcess = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());
    size_t count = GetModuleFileName(NULL, module, sizeof(module));
    assert(count < sizeof(module));
    snprintf(cmdline, sizeof(cmdline), "update.exe %p -wait %s -delete -1 -clear",
            hProcess, module, module);
    if (CreateProcess(path, cmdline, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS,
                NULL, NULL, &startupInfo, &processInfo) != TRUE) {
        CloseHandle(hProcess);
        return -1;
    }
    CloseHandle(processInfo.hThread);
    CloseHandle(processInfo.hProcess);
    CloseHandle(hProcess);
    return 0;
}

static int update_interpret(int argc, char *argv[])
{
    int i;
    char module[8192];
    size_t count = GetModuleFileName(NULL, module, sizeof(module));
    assert (count < sizeof(module));

    for (i=1; i<argc; i++) {
        if (!strcmp(argv[i], "-wait")) {
            if (update_wait(argv[i-1]) != 0)
                printf("update wait fail: %d\n", GetLastError());
        }else if (!strcmp(argv[i], "-copy")){
            if (CopyFile(module, argv[i-1], TRUE) != TRUE)
                printf("copy %s to %s fail\n", module, argv[i-1]);
        }else if (!strcmp(argv[i], "-delete")){
            if (DeleteFile(argv[i-1]) != TRUE)
                printf("delete %s fail\n", argv[i-1]);
        }else if (!strcmp(argv[i], "-final")){
            if (update_final(argv[i-1]) != 0)
                printf("update final fail: %d\n", GetLastError());
        }else if (!strcmp(argv[i], "-clear")){
            return atoi(argv[i-1]);
        }
    }
    return 0;
}

static int autorun_set(const char *regpath)
{
    HKEY hAutoRunKey = NULL;
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, regpath, 0,
               KEY_ALL_ACCESS, &hAutoRunKey) != ERROR_SUCCESS){
    printf("RegOpenKeyEx Fail\n");
    return -1;
    }
    char module[8192];
    size_t count = GetModuleFileName(NULL, module, sizeof(module));
    assert(count < sizeof(module));
    RegSetValueEx(hAutoRunKey, "rpcserver", 0, REG_SZ,
        (LPBYTE)module, strlen(module));
    RegCloseKey(hAutoRunKey);
    return 0;
}

int main(int argc, char *argv[])
{
    //FreeConsole();

    if (argc > 1 ) {
        if (!update_interpret(argc, argv))
            return 0;
    }else{
        if (!update_start("update.exe"))
            return 0;
    }

    autorun_set("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");

    HANDLE hMutex = CreateMutex(NULL, FALSE, "rg4.net/rpcserver");
    if (GetLastError() == ERROR_ALREADY_EXISTS){
    CloseHandle(hMutex);
    return -1;
    }

    for (;;) {
        Sleep(1000);
        printf("Hello World!\n");
    }

    CloseHandle(hMutex);
    return 0;
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Windows下实现进程保护
实战 | 记一次Word文档网络钓鱼以及绕过火绒,电脑管家和Windows Defender
Windows系统编程之进程间通信_mypage
自删除程序的研究及实现
远程线程注入(二)线程注入
将可执行程序以资源形式添加到另外一可执行程序[转贴]
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服