int VBoxClipboardInit(const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread) { Log(("VBoxTray: VboxClipboardInit\n")); if (gCtx.pEnv) { /* Clipboard was already initialized. 2 or more instances are not supported. */ return VERR_NOT_SUPPORTED; } RT_ZERO (gCtx); gCtx.pEnv = pEnv; int rc = VbglR3ClipboardConnect(&gCtx.u32ClientID); if (RT_SUCCESS (rc)) { rc = vboxClipboardInit(&gCtx); if (RT_SUCCESS (rc)) { /* Always start the thread for host messages. */ *pfStartThread = true; } else { VbglR3ClipboardDisconnect(gCtx.u32ClientID); } } if (RT_SUCCESS(rc)) *ppInstance = &gCtx; return rc; }
static int svcInit (void) { int rc = RTCritSectInit (&critsect); if (RT_SUCCESS (rc)) { vboxSvcClipboardModeSet (VBOX_SHARED_CLIPBOARD_MODE_OFF); rc = vboxClipboardInit (); /* Clean up on failure, because 'svnUnload' will not be called * if the 'svcInit' returns an error. */ if (RT_FAILURE (rc)) { RTCritSectDelete (&critsect); } } return rc; }