コード例 #1
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_pipe_read(char *args)
{
    vp_stack_t stack;
    int fd;
    int nr;
    int timeout;
    DWORD n;
    char buf[VP_READ_BUFSIZE];

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &fd));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &nr));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &timeout));

    vp_stack_push_str(&_result, ""); /* initialize */
    while (nr != 0) {
        n = 0;
        if (!PeekNamedPipe((HANDLE)_get_osfhandle(fd), buf,
                (nr < 0) ? VP_READ_BUFSIZE : (VP_READ_BUFSIZE < nr) ? VP_READ_BUFSIZE : nr,
                &n, NULL, NULL))
        {
            /* can be ERROR_HANDLE_EOF? */
            if (GetLastError() == 0 || GetLastError() == ERROR_BROKEN_PIPE) {
                /* error or eof */
                if (n != 0) {
                    /* decrease stack top for concatenate. */
                    _result.top--;
                    vp_stack_push_bin(&_result, buf, n);
                }
                vp_stack_push_num(&_result, "%d", 1);
                return vp_stack_return(&_result);
            }
            return vp_stack_return_error(&_result, "PeekNamedPipe() error: %08X %s",
                    GetLastError(), lasterror());
        }
        if (n == 0) {
            break;
        }
        if (read(fd, buf, n) == -1)
            return vp_stack_return_error(&_result, "read() error: %s",
                    strerror(errno));
        /* decrease stack top for concatenate. */
        _result.top--;
        vp_stack_push_bin(&_result, buf, n);
        if (nr > 0)
            nr -= n;
        /* try read more bytes without waiting */
        timeout = 0;
    }
    vp_stack_push_num(&_result, "%d", 0);
    return vp_stack_return(&_result);
}
コード例 #2
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_close_handle(char *args)
{
    vp_stack_t stack;
    HANDLE handle;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%p", &handle));

    if (!CloseHandle(handle))
        return vp_stack_return_error(&_result,
                "CloseHandle() error: %s", lasterror());
    return NULL;
}
コード例 #3
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_dlclose(char *args)
{
    vp_stack_t stack;
    HINSTANCE handle;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%p", &handle));

    if (!FreeLibrary(handle))
        return lasterror();
    vp_stack_free(&_result);
    return NULL;
}
コード例 #4
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_pipe_close(char *args)
{
    vp_stack_t stack;
    int fd;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &fd));

    if (!CloseHandle((HANDLE)_get_osfhandle(fd)))
        return vp_stack_return_error(&_result, "CloseHandle() error: %s",
                lasterror());
    return NULL;
}
コード例 #5
0
ファイル: proc_w32.c プロジェクト: toritori0318/dotfiles-vim
const char *
vp_kill(char *args)
{
    vp_stack_t stack;
    HANDLE handle;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%p", &handle));

    if (!TerminateProcess(handle, 2) || !CloseHandle(handle))
        return vp_stack_return_error(&_result, "kill() error: %s",
                lasterror());
    return NULL;
}
コード例 #6
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_file_read(char *args)
{
    vp_stack_t stack;
    int fd;
    int nr;
    int timeout;
    DWORD ret;
    int n;
    char buf[VP_READ_BUFSIZE];

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &fd));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &nr));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &timeout));

    vp_stack_push_str(&_result, ""); /* initialize */
    while (nr != 0) {
        ret = WaitForSingleObject((HANDLE)_get_osfhandle(fd), timeout);
        if (ret == WAIT_FAILED) {
            return vp_stack_return_error(&_result, "WaitForSingleObject() error: %s",
                    lasterror());
        } else if (ret == WAIT_TIMEOUT) {
            /* timeout */
            break;
        }
        if (nr > 0)
            n = read(fd, buf, (VP_READ_BUFSIZE < nr) ? VP_READ_BUFSIZE : nr);
        else
            n = read(fd, buf, VP_READ_BUFSIZE);
        if (n == -1) {
            return vp_stack_return_error(&_result, "read() error: %s",
                    strerror(errno));
        } else if (n == 0) {
            /* eof */
            vp_stack_push_num(&_result, "%d", 1);
            return vp_stack_return(&_result);
        }
        /* decrease stack top for concatenate. */
        _result.top--;
        vp_stack_push_bin(&_result, buf, n);
        if (nr > 0)
            nr -= n;
        /* try read more bytes without waiting */
        timeout = 0;
    }
    vp_stack_push_num(&_result, "%d", 0);
    return vp_stack_return(&_result);
}
コード例 #7
0
BOOL enzyme::kernel::Service::start(SC_HANDLE scm, const TCHAR* path)
{
    mSCHandle = OpenService(scm, bsname, SERVICE_ALL_ACCESS);
    if(mSCHandle != NULL)
        ChangeServiceConfig(mSCHandle, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL, NULL);
    else
        mSCHandle = CreateService(scm, bsname, bsname, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL);

    if(mSCHandle == NULL)
    {
        CloseServiceHandle(scm);
        throw std::runtime_error("Kernel Driver: " + lasterror());
    }

    return StartService(mSCHandle, 1, &bsname);
}
コード例 #8
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_open(char *args)
{
    vp_stack_t stack;
    char *path;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_str(&stack, &path));

    if ((size_t)ShellExecute(NULL, "open", path, NULL, NULL, SW_SHOWNORMAL) < 32) {
        return vp_stack_return_error(&_result, "ShellExecute() error: %s",
                lasterror());
    }

    return NULL;
}
コード例 #9
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_dlopen(char *args)
{
    vp_stack_t stack;
    char *path;
    HINSTANCE handle;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_str(&stack, &path));

    handle = LoadLibrary(path);
    if (handle == NULL)
        return lasterror();
    vp_stack_push_num(&_result, "%p", handle);
    return vp_stack_return(&_result);
}
コード例 #10
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_waitpid(char *args)
{
    vp_stack_t stack;
    HANDLE handle;
    DWORD exitcode;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%p", &handle));

    if (!GetExitCodeProcess(handle, &exitcode))
        return vp_stack_return_error(&_result,
                "GetExitCodeProcess() error: %s", lasterror());

    vp_stack_push_str(&_result, (exitcode == STILL_ACTIVE) ? "run" : "exit");
    vp_stack_push_num(&_result, "%u", exitcode);
    return vp_stack_return(&_result);
}
コード例 #11
0
ファイル: DestroyHandler.cpp プロジェクト: trieck/source
void DestroyHandler::Call(LPDICTIONARY request, LPDICTIONARY response)
{
    LPBEOBJECT pool = request->Get(KEY_POOL_ID);
    if (pool == NULL) {	// no pool id supplied
        response->Set(KEY_RESPONSE_CD, E_INC_REQUEST);
        response->Set(KEY_RESPONSE_MSG, RESP_NO_POOLID);
        return;
    }

    if (pool->GetType() != BEObject::BET_STRING) {
        response->Set(KEY_RESPONSE_CD, E_BAD_REQUEST);
        response->Set(KEY_RESPONSE_MSG, RESP_OBJ_FMT);
        return;
    }

    string poolid = *static_cast<LPSTRING>(pool);

    LPBEOBJECT object = request->Get(KEY_OBJECT_ID);
    if (object == NULL) {	// no object id supplied
        response->Set(KEY_RESPONSE_CD, E_INC_REQUEST);
        response->Set(KEY_RESPONSE_MSG, RESP_NO_OBJECTID);
        return;
    }

    if (object->GetType() != BEObject::BET_STRING) {
        response->Set(KEY_RESPONSE_CD, E_BAD_REQUEST);
        response->Set(KEY_RESPONSE_MSG, RESP_OBJ_FMT);
        return;
    }

    string objectid = *static_cast<LPSTRING>(object);

    // Destroy the object
    ObjectDB *pDB = ObjectDB::instance();
    BOOL result = pDB->DestroyObject(poolid, objectid);
    if (!result) {
        response->Set(KEY_RESPONSE_CD, E_CANT_DESTROY);
        response->Set(KEY_RESPONSE_MSG, lasterror());
        return;
    }

    response->Set(KEY_RESPONSE_CD, INT64(E_OK));
}
コード例 #12
0
BOOL enzyme::kernel::Service::stop()
{
    if(mHandle != INVALID_HANDLE_VALUE)
    {
        CloseHandle(mHandle);
    }

    if(mSCHandle != INVALID_HANDLE_VALUE)
    {
        SERVICE_STATUS_PROCESS status;
        if(ControlService(mSCHandle, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&status))
        {
            DWORD timeout = GetTickCount() + 5000;
            while(status.dwCurrentState != SERVICE_STOPPED)
            {
                DWORD tmp;
                if(GetTickCount() >= timeout)
                {
                    std::clog << "Timeout stopping kernel driver" << std::endl;
                    break;
                }
                Sleep(50);
                if(!QueryServiceStatusEx(mSCHandle, SC_STATUS_PROCESS_INFO, (LPBYTE)&status, sizeof(SERVICE_STATUS_PROCESS), &tmp))
                {
                    break;
                }
            }
        }
        else if(GetLastError() != ERROR_SERVICE_NOT_ACTIVE)
        {
            std::clog << lasterror() << std::endl;
        }

        DeleteService(mSCHandle);
        return CloseServiceHandle(mSCHandle);
    }

    return TRUE;
}
コード例 #13
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
const char *
vp_file_write(char *args)
{
    vp_stack_t stack;
    int fd;
    char *buf;
    size_t size;
    int timeout;
    size_t nleft;
    DWORD ret;
    int n;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &fd));
    VP_RETURN_IF_FAIL(vp_stack_pop_bin(&stack, &buf, &size));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &timeout));

    nleft = 0;
    while (nleft < size) {
        ret = WaitForSingleObject((HANDLE)_get_osfhandle(fd), timeout);
        if (ret == WAIT_FAILED) {
            return vp_stack_return_error(&_result, "WaitForSingleObject() error: %s",
                    lasterror());
        } else if (ret == WAIT_TIMEOUT) {
            /* timeout */
            break;
        }
        n = write(fd, buf + nleft, (unsigned int)(size - nleft));
        if (n == -1) {
            return vp_stack_return_error(&_result, "write() error: %s",
                    strerror(errno));
        }
        nleft += n;
        /* try write more bytes without waiting */
        timeout = 0;
    }
    vp_stack_push_num(&_result, "%u", nleft);
    return vp_stack_return(&_result);
}
コード例 #14
0
enzyme::kernel::Service::Service()
{
    SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if(scm == NULL)
    {
        if(GetLastError() == ERROR_ACCESS_DENIED)
            throw std::runtime_error("Access Denied: Please run this program as Administrator");
        else
            throw std::runtime_error("Kernel Driver: " + lasterror());
    }

    TCHAR path[MAX_PATH];
    TCHAR* ptr;
    if(GetModuleFileName(NULL, ptr = path, MAX_PATH - 12))
        ptr = _tcsrchr(ptr, '\\') + 1;
    _tcscpy(ptr, koname);

    mSCHandle = OpenService(scm, bsname, SERVICE_ALL_ACCESS);
    if(mSCHandle != NULL)
        ChangeServiceConfig(mSCHandle, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL, NULL);
    else
        mSCHandle = CreateService(scm, bsname, bsname, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL);

    if(mSCHandle == NULL)
    {
        CloseServiceHandle(scm);
        throw std::runtime_error("Kernel Driver: " + lasterror());
    }

    BOOL r = start(scm, path);
    if(!r)
    {
        DWORD error = GetLastError();
        if(error == ERROR_PATH_NOT_FOUND)   // Possibly due to running via network/removable drive
        {
/*            if(GetWindowsDirectory(ptr = path, MAX_PATH - 22))
            {
                ptr += _tcslen(ptr);
                _tcscpy(ptr, _T("\\System32\\"));
                ptr += _tcslen(ptr);
            }
            _tcscpy(ptr, koname);

            static bool copied = false;
            if(!copied)
            {
                env::filesystem::copy_file(koname, path);
                copied = true;
            }
            r = start(scm, path);*/
        }
    }
    CloseServiceHandle(scm);
    if(!r)
    {
        if(GetLastError() != ERROR_SERVICE_ALREADY_RUNNING)
        {
            std::string error(lasterror());
            stop();
            throw std::runtime_error("Kernel Driver: " + error);
        }
    }
}
コード例 #15
0
ファイル: proc_w32.c プロジェクト: AmaiSaeta/vimproc
/*
 * http://support.microsoft.com/kb/190351/
 */
const char *
vp_pipe_open(char *args)
{
    vp_stack_t stack;
    int npipe, hstdin, hstderr, hstdout;
    char *cmdline;
    HANDLE hInputWrite = INVALID_HANDLE_VALUE, hInputRead;
    HANDLE hOutputWrite, hOutputRead = INVALID_HANDLE_VALUE;
    HANDLE hErrorWrite, hErrorRead = INVALID_HANDLE_VALUE;
    SECURITY_ATTRIBUTES sa;
    PROCESS_INFORMATION pi;
    STARTUPINFO si;

    VP_RETURN_IF_FAIL(vp_stack_from_args(&stack, args));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &npipe));
    if (npipe != 2 && npipe != 3)
        return vp_stack_return_error(&_result, "npipe range error");
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &hstdin));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &hstdout));
    VP_RETURN_IF_FAIL(vp_stack_pop_num(&stack, "%d", &hstderr));
    VP_RETURN_IF_FAIL(vp_stack_pop_str(&stack, &cmdline));

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;

    if (hstdin) {
        /* Get handle. */
        hInputRead = (HANDLE)_get_osfhandle(hstdin);
    } else {
        HANDLE hInputWriteTmp;

        /* Create pipe. */
        if (!CreatePipe(&hInputRead, &hInputWriteTmp, &sa, 0))
            return vp_stack_return_error(&_result, "CreatePipe() error: %s",
                    lasterror());

        if (!DuplicateHandle(GetCurrentProcess(),
                    hInputWriteTmp,
                    GetCurrentProcess(),
                    &hInputWrite,
                    0,
                    FALSE,
                    DUPLICATE_SAME_ACCESS))
            return vp_stack_return_error(&_result, "DuplicateHandle() error: %s",
                    lasterror());
        if (!CloseHandle(hInputWriteTmp))
            return vp_stack_return_error(&_result, "CloseHandle() error: %s",
                    lasterror());
    }

    if (hstdout) {
        /* Get handle. */
        hOutputWrite = (HANDLE)_get_osfhandle(hstdout);
    } else {
        HANDLE hOutputReadTmp;

        /* Create pipe. */
        if (!CreatePipe(&hOutputReadTmp, &hOutputWrite, &sa, 0))
            return vp_stack_return_error(&_result, "CreatePipe() error: %s",
                    lasterror());

        if (!DuplicateHandle(GetCurrentProcess(),
                    hOutputReadTmp,
                    GetCurrentProcess(),
                    &hOutputRead,
                    0,
                    TRUE,
                    DUPLICATE_SAME_ACCESS))
            return vp_stack_return_error(&_result, "DuplicateHandle() error: %s",
                    lasterror());
        if (!CloseHandle(hOutputReadTmp))
            return vp_stack_return_error(&_result, "CloseHandle() error: %s",
                    lasterror());
    }

    if (npipe == 2) {
        if (!DuplicateHandle(GetCurrentProcess(),
                             hOutputWrite,
                             GetCurrentProcess(),
                             &hErrorWrite,
                             0,
                             TRUE,
                             DUPLICATE_SAME_ACCESS))
            return vp_stack_return_error(&_result, "DuplicateHandle() error: %s",
                    lasterror());
    } else {
        if (hstderr) {
            /* Get handle. */
            hErrorWrite = (HANDLE)_get_osfhandle(hstderr);
        } else {
            HANDLE hErrorReadTmp;

            /* Create pipe. */
            if (!CreatePipe(&hErrorReadTmp, &hErrorWrite, &sa, 0))
                return vp_stack_return_error(&_result, "CreatePipe() error: %s",
                        lasterror());

            if (!DuplicateHandle(GetCurrentProcess(),
                        hErrorReadTmp,
                        GetCurrentProcess(),
                        &hErrorRead,
                        0,
                        TRUE,
                        DUPLICATE_SAME_ACCESS))
                return vp_stack_return_error(&_result, "DuplicateHandle() error: %s",
                        lasterror());
            if (!CloseHandle(hErrorReadTmp))
                return vp_stack_return_error(&_result, "CloseHandle() error: %s",
                        lasterror());
        }
    }

    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    /*si.dwFlags = STARTF_USESTDHANDLES;*/
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.hStdInput = hInputRead;
    si.hStdOutput = hOutputWrite;
    si.hStdError = hErrorWrite;

    if (!CreateProcess(NULL, cmdline, NULL, NULL, TRUE,
                        CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
                        /*0, NULL, NULL, &si, &pi))*/
                        /*DETACHED_PROCESS, NULL, NULL, &si, &pi))*/
                        /*CREATE_NO_WINDOW, NULL, NULL, &si, &pi))*/
        return vp_stack_return_error(&_result, "CreateProcess() error: %s %s",
                lasterror());

    if (!CloseHandle(pi.hThread))
        return vp_stack_return_error(&_result, "CloseHandle() error: %s",
                lasterror());

    if (!CloseHandle(hInputRead))
        return vp_stack_return_error(&_result, "CloseHandle() error: %s",
                lasterror());
    if (!CloseHandle(hOutputWrite))
        return vp_stack_return_error(&_result, "CloseHandle() error: %s",
                lasterror());
    if (!CloseHandle(hErrorWrite))
        return vp_stack_return_error(&_result, "CloseHandle() error: %s",
                lasterror());

    vp_stack_push_num(&_result, "%p", pi.hProcess);
    vp_stack_push_num(&_result, "%d", hstdin ?
            0 : _open_osfhandle((size_t)hInputWrite, 0));
    vp_stack_push_num(&_result, "%d", hstdout ?
            0 : _open_osfhandle((size_t)hOutputRead, _O_RDONLY));
    if (npipe == 3)
        vp_stack_push_num(&_result, "%d", hstderr ?
                0 : _open_osfhandle((size_t)hErrorRead, _O_RDONLY));
    return vp_stack_return(&_result);
}