Chinaunix首页 | 论坛 | 博客
  • 博客访问: 929163
  • 博文数量: 201
  • 博客积分: 8078
  • 博客等级: 中将
  • 技术积分: 2162
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-20 17:22
文章分类

全部博文(201)

文章存档

2013年(3)

2012年(11)

2011年(34)

2010年(25)

2009年(51)

2008年(77)

分类: WINDOWS

2009-10-04 15:40:15


#include
#include
#include

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        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, "pagxir.gmail.com/rpcserver");
    if (GetLastError() == ERROR_ALREADY_EXISTS){
    CloseHandle(hMutex);
    return -1;
    }

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

    CloseHandle(hMutex);
    return 0;
}

阅读(974) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~