/// <summary> /// Create environment for future remote procedure calls /// /// _userData layout (x86/x64): /// -------------------------------------------------------------------------------------------------------------------------- /// | Internal return value | Return value | Last Status code | Event handle | Space for copied arguments and strings | /// ------------------------------------------------------------------------------------------------------------------------- /// | 8/8 bytes | 8/8 bytes | 8/8 bytes | 16/16 bytes | | /// -------------------------------------------------------------------------------------------------------------------------- /// </summary> /// <param name="noThread">Create only codecave and sync event, without thread</param> /// <returns>Status</returns> NTSTATUS RemoteExec::CreateRPCEnvironment( bool noThread /*= false*/ ) { NTSTATUS dwResult = STATUS_SUCCESS; DWORD thdID = 0; bool status = true; // // Allocate environment codecave // if (!_workerCode.valid()) _workerCode = _memory.Allocate( 0x1000 ); if (!_userData.valid()) _userData = _memory.Allocate( 0x4000, PAGE_READWRITE ); if (!_userCode.valid()) _userCode = _memory.Allocate( 0x1000 ); // Create RPC thread and sync event if (noThread == false) thdID = CreateWorkerThread(); else // Randomize thread id for event name thdID = GetTickCount(); auto& barrier = _proc.core().native()->GetWow64Barrier(); if (barrier.type != wow_32_64) status = CreateAPCEvent( thdID ); if ((noThread == false && thdID == 0) || status == false) dwResult = LastNtStatus(); return dwResult; }
BOOL CTcpClient::Start(LPCTSTR pszRemoteAddress, USHORT usPort, BOOL bAsyncConnect) { if(!CheckParams() || !CheckStarting()) return FALSE; BOOL isOK = FALSE; m_bAsyncConnect = bAsyncConnect; if(CreateClientSocket()) { if(FirePrepareConnect(m_dwConnID, m_soClient) != HR_ERROR) { if(ConnectToServer(pszRemoteAddress, usPort)) { if(CreateWorkerThread()) isOK = TRUE; else SetLastError(SE_WORKER_THREAD_CREATE, __FUNCTION__, ERROR_CREATE_FAILED); } else SetLastError(SE_CONNECT_SERVER, __FUNCTION__, ::WSAGetLastError()); } else SetLastError(SE_SOCKET_PREPARE, __FUNCTION__, ERROR_FUNCTION_FAILED); } else SetLastError(SE_SOCKET_CREATE, __FUNCTION__, ::WSAGetLastError()); if(!isOK) Stop(); return isOK; }
/// <summary> /// Create environment for future remote procedure calls /// /// _userData layout (x86/x64): /// -------------------------------------------------------------------------------------------------------------------------- /// | Internal return value | Return value | Last Status code | Event handle | Space for copied arguments and strings | /// ------------------------------------------------------------------------------------------------------------------------- /// | 8/8 bytes | 8/8 bytes | 8/8 bytes | 16/16 bytes | | /// -------------------------------------------------------------------------------------------------------------------------- /// </summary> /// <param name="noThread">Create only codecave and sync event, without thread</param> /// <returns>Status</returns> NTSTATUS RemoteExec::CreateRPCEnvironment( bool noThread /*= false*/ ) { NTSTATUS dwResult = STATUS_SUCCESS; DWORD thdID = 0; bool status = true; // // Allocate environment codecave // if (!_workerCode.valid()) _workerCode = _memory.Allocate( 0x1000 ); if (!_userData.valid()) _userData = _memory.Allocate( 0x4000, PAGE_READWRITE ); if (!_userCode.valid()) _userCode = _memory.Allocate( 0x1000 ); // Create RPC thread and sync event if (noThread == false) { thdID = CreateWorkerThread(); if (thdID) status = CreateAPCEvent( thdID ); } if (thdID == 0 || status == false) dwResult = LastNtStatus(); return dwResult; }
int CUdpManage::Init( int ServerSocketSize, int WorkerNum ) { int r = CUdpIocp::Init( ServerSocketSize, WorkerNum ); //创建外部完成端口 m_hWorkerIOCPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 ); CreateWorkerThread( 4 ); return r; }
BOOL CUdpCast::Start(LPCTSTR lpszRemoteAddress, USHORT usPort, BOOL bAsyncConnect, LPCTSTR lpszBindAddress) { if(!CheckParams() || !CheckStarting()) return FALSE; PrepareStart(); m_ccContext.Reset(); BOOL isOK = FALSE; HP_SOCKADDR bindAddr(AF_UNSPEC, TRUE); if(CreateClientSocket(lpszRemoteAddress, usPort, lpszBindAddress, bindAddr)) { if(BindClientSocket(bindAddr)) { if(FirePrepareConnect(m_soClient) != HR_ERROR) { if(ConnectToGroup(bindAddr)) { if(CreateWorkerThread()) { isOK = TRUE; } else SetLastError(SE_WORKER_THREAD_CREATE, __FUNCTION__, ERROR_CREATE_FAILED); } else SetLastError(SE_CONNECT_SERVER, __FUNCTION__, ::WSAGetLastError()); } else SetLastError(SE_SOCKET_PREPARE, __FUNCTION__, ERROR_CANCELLED); } else SetLastError(SE_SOCKET_BIND, __FUNCTION__, ::WSAGetLastError()); } else SetLastError(SE_SOCKET_CREATE, __FUNCTION__, ::WSAGetLastError()); if(!isOK) { DWORD dwCode = ::GetLastError(); m_ccContext.Reset(FALSE); Stop(); ::SetLastError(dwCode); } return isOK; }
BOOL CTcpClient::Start(LPCTSTR lpszRemoteAddress, USHORT usPort, BOOL bAsyncConnect, LPCTSTR lpszBindAddress, USHORT usLocalPort) { if(!CheckParams() || !CheckStarting()) return FALSE; PrepareStart(); m_ccContext.Reset(); BOOL isOK = FALSE; HP_SOCKADDR addrRemote, addrBind; if(CreateClientSocket(lpszRemoteAddress, addrRemote, usPort, lpszBindAddress, addrBind)) { if(BindClientSocket(addrBind, addrRemote, usLocalPort)) { if(TRIGGER(FirePrepareConnect(m_soClient)) != HR_ERROR) { if(ConnectToServer(addrRemote, bAsyncConnect)) { if(CreateWorkerThread()) isOK = TRUE; else SetLastError(SE_WORKER_THREAD_CREATE, __FUNCTION__, ERROR_CREATE_FAILED); } else SetLastError(SE_CONNECT_SERVER, __FUNCTION__, ::WSAGetLastError()); } else SetLastError(SE_SOCKET_PREPARE, __FUNCTION__, ENSURE_ERROR_CANCELLED); } else SetLastError(SE_SOCKET_BIND, __FUNCTION__, ::WSAGetLastError()); } else SetLastError(SE_SOCKET_CREATE, __FUNCTION__, ::WSAGetLastError()); if(!isOK) { m_ccContext.Reset(FALSE); EXECUTE_RESTORE_ERROR(Stop()); } return isOK; }
void CDeviceHostStatPage::BeginRefreshHosts() { m_wndRefreshLink.EnableWindow(FALSE); m_findHostsAnimate.ShowWindow(SW_SHOW); m_findHostsAnimate.Play(0,-1,-1); m_hostInfoDataArray.RemoveAll(); m_wndListView.DeleteAllItems(); m_hWorkerThread = CreateWorkerThread(); if (NULL == m_hWorkerThread) { ATLTRACE("Worker Thread creation failed %d\n", ::GetLastError()); } m_hCursor = AtlLoadSysCursor(IDC_APPSTARTING); SetCursor(m_hCursor); }
/// <summary> /// Create environment for future remote procedure calls /// /// _userData layout (x86/x64): /// -------------------------------------------------------------------------------------------------------------------------- /// | Internal return value | Return value | Last Status code | Event handle | Space for copied arguments and strings | /// ------------------------------------------------------------------------------------------------------------------------- /// | 8/8 bytes | 8/8 bytes | 8/8 bytes | 16/16 bytes | | /// -------------------------------------------------------------------------------------------------------------------------- /// </summary> /// <param name="bThread">Create worker thread</param> /// <param name="bEvent">Create sync event for worker thread</param> /// <returns>Status</returns> NTSTATUS RemoteExec::CreateRPCEnvironment( bool bThread /*= true*/, bool bEvent /*= true*/ ) { DWORD thdID = GetTickCount(); // randomize thread id NTSTATUS status = STATUS_SUCCESS; // // Allocate environment codecave // if (!_workerCode.valid()) _workerCode = _memory.Allocate( 0x1000 ); if (!_userData.valid()) _userData = _memory.Allocate( 0x4000, PAGE_READWRITE ); if (!_userCode.valid()) _userCode = _memory.Allocate( 0x1000 ); // Create RPC thread if (bThread) thdID = CreateWorkerThread(); // Create RPC sync event if (bEvent) { if (_proc.core().native()->GetWow64Barrier().type != wow_32_64) { status = CreateAPCEvent( thdID ); } else { status = LastNtStatus( STATUS_NOT_SUPPORTED ); } } if (bThread && thdID == 0) status = LastNtStatus(); return status; }
void COSMCtrlMapOperationsDlg::OnBnClickedStartOperation() { if (UpdateData(TRUE)) { //First thing to do is disable this button and enable the stop operation button m_ctrlStartOperation.EnableWindow(FALSE); m_ctrlStopOperation.EnableWindow(TRUE); //Set focus to the Stop button m_ctrlStopOperation.SetFocus(); //Reset the progress control m_ctrlProgress.SetPos(0); //Disable the zoom level control m_ctrlZoomLevel.EnableWindow(FALSE); //Empty out the array m_PendingEvents.clear(); //Create the worker thread CreateWorkerThread(); } }
int CSocketServer::Run() { try { vector<WorkerThread *> workers; workers.reserve( m_numThreads ); for ( size_t i = 0; i < m_numThreads; ++i ) { /* * Call to unqualified virtual function */ WorkerThread *pThread = CreateWorkerThread( m_iocp ); workers.push_back( pThread ); pThread->Start(); } HANDLE handlesToWaitFor[2]; handlesToWaitFor[0] = m_shutdownEvent.GetEvent(); handlesToWaitFor[1] = m_acceptConnectionsEvent.GetEvent(); while ( !m_shutdownEvent.Wait( 0 ) ) { DWORD waitResult = ::WaitForMultipleObjects( 2, handlesToWaitFor, false, INFINITE ); if ( waitResult == WAIT_OBJECT_0 ) { /* * Time to shutdown */ break; } else if ( waitResult == WAIT_OBJECT_0 + 1 ) { /* * accept connections */ while ( !m_shutdownEvent.Wait( 0 ) && m_acceptConnectionsEvent.Wait( 0 ) ) { CIOBuffer *pAddress = Allocate(); int addressSize = (int)pAddress->GetSize(); SOCKET acceptedSocket = ::WSAAccept( m_listeningSocket, reinterpret_cast<sockaddr *>(const_cast<BYTE *>( pAddress->GetBuffer() ) ), &addressSize, 0, 0); pAddress->Use( addressSize ); if ( acceptedSocket != INVALID_SOCKET ) { Socket *pSocket = AllocateSocket( acceptedSocket ); /* * Call to unqualified virtual function */ OnConnectionEstablished( pSocket, pAddress ); } else if ( m_acceptConnectionsEvent.Wait( 0 ) ) { /* * Call to unqualified virtual function */ OnError( _T("CSocketServer::Run() - WSAAccept:") + GetLastErrorMessage( ::WSAGetLastError() ) ); } pAddress->Release(); } } else { /* * Call to unqualified virtual function */ OnError( _T("CSocketServer::Run() - WaitForMultipleObjects: ") + GetLastErrorMessage( ::GetLastError() ) ); } } for ( i = 0; i < m_numThreads; ++i ) { workers[i]->InitiateShutdown(); } for ( i = 0; i < m_numThreads; ++i ) { workers[i]->WaitForShutdownToComplete(); delete workers[i]; workers[i] = 0; } } catch( const CException &e ) { /* * Call to unqualified virtual function */ OnError( _T("CSocketServer::Run() - Exception: ") + e.GetWhere() + _T(" - ") + e.GetMessage() ); } catch(...) { /* * Call to unqualified virtual function */ OnError( _T("CSocketServer::Run() - Unexpected exception") ); } /* * Call to unqualified virtual function */ OnShutdownComplete(); return 0; }
int main() { int available = numa_available(); if( available == -1 ) { printf( "NUMA is not available on this system!\n" ); return -1; } printf( "numa_available() returned %d\n", available ); mai_init(BIND); int nodes = numa_max_node(); printf( "There are %d NUMA nodes in this system:\n\n", nodes + 1 ); DumpMemoryStats(); // initialize the random number list int x; for(x = 0; x < WORKERS_COUNT * MAJOR_COUNT; x++ ) { rand_nums[x] = 6 + rand() % MAX_BLOCK_FACTOR; } time_t time_start = time(NULL); // start worker threads printf( "\nStarting workers...\n" ); int thread_no = 0,node,m; for(node = 0; node < CORES_COUNT; node++ ) { for(m = 0; m < WORKERS_PER_CORE; m++ ) { CreateWorkerThread( thread_no, node ); thread_no++; } } // wait until all threads complete printf( "Waiting for workers to complete...\n" ); int n; for( n = 0; n < WORKERS_COUNT; n++ ) { if( 0 != pthread_join( targs[n].tid, NULL ) ) { printf( "pthread_join failed!\n" ); } } time_t time_end = time(NULL); printf( "All worker threads completed!\n\n" ); DumpMemoryStats(); double seconds = difftime( time_end, time_start ); unsigned long long min = 0xffffffffffffffffll; unsigned long long max = 0; unsigned long long avg = 0; for( n = 0; n < WORKERS_COUNT; n++ ) { if( targs[n].tdiff < min ) min = targs[n].tdiff; if( targs[n].tdiff > max ) max = targs[n].tdiff; avg = avg + targs[n].tdiff; } printf( "\n%f seconds\t( avg: %llu,\tmin: %llu,\tmax: %llu ticks)\n", seconds, avg, min, max ); return 0; }