VOID SetRealTimeMode( const HWND hWnd, const BOOL bRealTime, const HANDLE * phChildThread, LPTSTR lpszWindowText )
{
//	int i;
	UNREFERENCED_PARAMETER( phChildThread );
//
	if( bRealTime )
	{
		g_bRealTime = TRUE;
		SetPriorityClass( GetCurrentProcess(), REALTIME_PRIORITY_CLASS );
//		SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL );
		CheckMenuItem( GetMenu( hWnd ), IDM_REALTIME, MF_BYCOMMAND | MFS_CHECKED );
/*
		for( i = 0; i < 4; i++ )
		{
			if( g_bHack[ i ] && phChildThread[ i ] != NULL )
			{
				SetThreadPriority( phChildThread[ i ], THREAD_PRIORITY_HIGHEST );
			}
		}
*/
		WriteDebugLog( TEXT( "Real-time mode: Yes" ) );
	}
	else
	{
		g_bRealTime = FALSE;
		SetPriorityClass( GetCurrentProcess(), HIGH_PRIORITY_CLASS );
//		SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_NORMAL );
		CheckMenuItem( GetMenu( hWnd ), IDM_REALTIME, MF_BYCOMMAND | MFS_UNCHECKED );
/*
		for( i = 0; i < 4; i++ )
		{
			if( g_bHack[ i ] && phChildThread[ i ] != NULL )
			{
				SetThreadPriority( phChildThread[ i ], THREAD_PRIORITY_NORMAL );
			}
		}
*/
		WriteDebugLog( TEXT( "Real-time mode: No" ) );
	}

	if( lpszWindowText != NULL )
	{
		wsprintf( lpszWindowText, TEXT( "%s - %s%s" ),
			APP_NAME,
			IsActive() ? TEXT( "Active" ) : TEXT( "Idle" ),
			g_bRealTime ? TEXT( " (Real-time mode)" ) : TEXT( "" )
		);
		SetWindowText( hWnd, lpszWindowText );
	}


}
Example #2
0
int test_outputfunc()
{
	LOG		*g = NULL ;
	
	g = CreateLogHandle() ;
	if( g == NULL )
	{
		printf( "创建日志句柄失败errno[%d]\n" , errno );
		return -1;
	}
	else
	{
		printf( "创建日志句柄成功\n" );
	}
	
	SetLogOutput( g , LOG_OUTPUT_CALLBACK , "127.0.0.1:514" , & MyOpenLogFirst , NULL , & MyWriteLog , NULL , NULL , & MyCloseLogFinally );
	SetLogLevel( g , LOG_LEVEL_INFO );
	SetLogStyles( g , LOG_STYLES_LOG , LOG_NO_STYLEFUNC );
	
	WriteDebugLog( g , __FILE__ , __LINE__ , "hello iLOG3\n" );
	WriteInfoLog( g , __FILE__ , __LINE__ , "hello iLOG3\n" );
	WriteWarnLog( g , __FILE__ , __LINE__ , "hello iLOG3\n" );
	WriteErrorLog( g , __FILE__ , __LINE__ , "hello iLOG3\n" );
	WriteFatalLog( g , __FILE__ , __LINE__ , "hello iLOG3\n" );
	
	DestroyLogHandle( g );
	printf( "销毁日志句柄\n" );
	
	return 0;
}
VOID Unwatch( HANDLE& hSema, HANDLE& hThread, BOOL * lpbWatch )
{
	*lpbWatch = FALSE;
	if( WaitForSingleObject( hSema, 1000UL ) == WAIT_OBJECT_0 )
	{
		WriteDebugLog( TEXT( "Closing hChildThread[ 3 ]" ) );
		if( hThread )
		{
			CloseHandle( hThread );
			hThread = NULL;
		}
		ReleaseSemaphore( hSema, 1L, (LPLONG) NULL );
	}
	else
	{
		WriteDebugLog( TEXT( "[!] Sema3 Error" ) );
	}
}
Example #4
0
FILE *out_file_open(char *outFile, int rate, int *channels)
{
   FILE *fout=NULL;
   if (strlen(outFile)==0)
   {
        unsigned int speex_channels = *channels;
        if (Set_WIN_Params (INVALID_FILEDESC, rate, SAMPLE_SIZE, speex_channels))
        {
            WriteDebugLog("out_file_open -Can't access-WAVE OUT");
            //fprintf (stderr, "Can't access %s\n", "WAVE OUT");
            return 0;
        }
   } 
   return fout;
}
Example #5
0
BOOL sendTeamTalkMessage(const PCOPYDATASTRUCT cpyData)
{
#ifdef _DEBUG
	g_hTeamTalkWnd = FindWindow("TeamTalkMainDialog_debug", 0);
#else
	g_hTeamTalkWnd = FindWindow("TeamTalkMainDialog", 0);
#endif
    
    if (g_hTeamTalkWnd && cpyData)
    {
        SendMessage(g_hTeamTalkWnd,WM_COPYDATA,0,(LPARAM)cpyData);
        return TRUE;
	}
	else
	{
		WriteDebugLog("Can't find the window.");
	}

    return FALSE;
}
BOOL SetSliderIni( LPCTSTR lpszString, const int iSlider )
{
	if( iSlider <= 0 || iSlider > 99 || lstrlen( lpszString ) > 1000 ) return FALSE;

	WriteDebugLog( TEXT( "SetSliderIni" ) );
	WriteDebugLog( lpszString );


	TCHAR lpszExeName[ MAX_PATH * 2 ] = _T( "" );
/* - 1.1b7
	int len = lstrlen( lpszTarget );
	int start = -1;
	int end = -1;
	for( int i = len - 1; i >= 5; i-- )
	{
		if(
			lpszTarget[ i ] == TEXT( ' ' ) &&
			( lpszTarget[ i - 1 ] == TEXT( 'e' ) || lpszTarget[ i - 1 ] == TEXT( 'E' ) ) &&
			( lpszTarget[ i - 2 ] == TEXT( 'x' ) || lpszTarget[ i - 2 ] == TEXT( 'X' ) ) &&
			( lpszTarget[ i - 3 ] == TEXT( 'e' ) || lpszTarget[ i - 3 ] == TEXT( 'E' ) ) &&
			lpszTarget[ i - 4 ] == TEXT( '.' )
		)
		{
			end = i;
			break;
		}
	}

	for( ; i >=0; i-- )
	{
		if( lpszTarget[ i ] == TEXT( '\\' ) )
		{
			start = i + 1;
			break;
		}
	}

	if( start == -1 ) start = 0;

	if( end == -1 || end - start <= 0 )
	{
		TCHAR dbg[1000];
		wsprintf( dbg, TEXT("DEBUG: %s %d %d %d"), lpszTarget, start, end, end-start );
		WriteDebugLog( dbg ) ;

		return FALSE;
	}



	lstrcpy( lpszExeName, &lpszTarget[ start ] );
	lpszExeName[ end - start ] = TEXT( '\0' );
*/
// +1.1b7
	PathToExe( lpszString, lpszExeName, MAX_PATH * 2 );


#if !defined( _UNICODE )
	if( lstrlen( lpszExeName ) >= 19 )
	{
		lpszExeName[ 15 ] = '\0';
		PathToExeEx( lpszExeName, MAX_PATH * 2 );
	}
#endif


	TCHAR lpszExeNameLower[ MAX_PATH * 2 ] = _TEXT( "" );
	int len = lstrlen( lpszExeName );
	for( int i = 0; i < len; i++ )
	{
		TCHAR c = lpszExeName[ i ];
		if( _istascii( c ) && _istupper( c ) )
		{
			lpszExeNameLower[ i ] = (TCHAR) _totlower( c );
		}
		else
		{
			lpszExeNameLower[ i ] = c;
		}
	}
	//lpszExeNameLower[ i ] = TEXT( '\0' );



	TCHAR lpszPath[ MAX_PATH * 2 ];
	GetIniPath( lpszPath );

	TCHAR tmpstr[ 100 ];
	wsprintf( tmpstr, TEXT( "%d" ), iSlider );


	WritePrivateProfileString(
		TEXT( "Slider" ), 
		lpszExeNameLower,
		tmpstr,
		lpszPath
	);

	// to flushes the cache
	WritePrivateProfileString(
		NULL,
		NULL,
		NULL,
		lpszPath
	);

	return TRUE;
}
Example #7
0
static void *process_header(ogg_packet *op, spx_int32_t enh_enabled, spx_int32_t *frame_size, int *granule_frame_size, spx_int32_t *rate, int *nframes, int forceMode, int *channels, SpeexStereoState *stereo, int *extra_headers, int quiet)
{
   void *st;
   const SpeexMode *mode;
   SpeexHeader *header;
   int modeID;
   SpeexCallback callback;
      
   header = speex_packet_to_header((char*)op->packet, op->bytes);
   if (!header)
   {
      WriteDebugLog("Cannot read header");
      //fprintf (stderr, "Cannot read header\n");
      return NULL;
   }
   if (header->mode >= SPEEX_NB_MODES || header->mode<0)
   {
       WriteDebugLog("Mode number %d does not (yet/any longer) exist in this version");
      //fprintf (stderr, "Mode number %d does not (yet/any longer) exist in this version\n", 
      //         header->mode);
      free(header);
      return NULL;
   }
      
   modeID = header->mode;
   if (forceMode!=-1)
      modeID = forceMode;

   mode = speex_lib_get_mode (modeID);
   
   if (header->speex_version_id > 1)
   {
       char Error[256] = {0};
       sprintf(Error,"This file was encoded with Speex bit-stream version %d, which I don't know how to decode\n", header->speex_version_id);
       WriteDebugLog(Error);
      //fprintf (stderr, "This file was encoded with Speex bit-stream version %d, which I don't know how to decode\n", header->speex_version_id);
      free(header);
      return NULL;
   }

   if (mode->bitstream_version < header->mode_bitstream_version)
   {
      WriteDebugLog("The file was encoded with a newer version of Speex. You need to upgrade in order to play it.");
      //fprintf (stderr, "The file was encoded with a newer version of Speex. You need to upgrade in order to play it.\n");
      free(header);
      return NULL;
   }
   if (mode->bitstream_version > header->mode_bitstream_version) 
   {
      WriteDebugLog("The file was encoded with an older version of Speex. You would need to downgrade the version in order to play it.");
      //fprintf (stderr, "The file was encoded with an older version of Speex. You would need to downgrade the version in order to play it.\n");
      free(header);
      return NULL;
   }
   
   st = speex_decoder_init(mode);
   if (!st)
   {
      WriteDebugLog("Decoder initialization failed.");
      //fprintf (stderr, "Decoder initialization failed.\n");
      free(header);
      return NULL;
   }
   speex_decoder_ctl(st, SPEEX_SET_ENH, &enh_enabled);
   speex_decoder_ctl(st, SPEEX_GET_FRAME_SIZE, frame_size);
   *granule_frame_size = *frame_size;

   if (!*rate)
      *rate = header->rate;
   /* Adjust rate if --force-* options are used */
   if (forceMode!=-1)
   {
      if (header->mode < forceMode)
      {
         *rate <<= (forceMode - header->mode);
         *granule_frame_size >>= (forceMode - header->mode);
      }
      if (header->mode > forceMode)
      {
         *rate >>= (header->mode - forceMode);
         *granule_frame_size <<= (header->mode - forceMode);
      }
DWORD WINAPI LimitPlus( LPVOID lpVoid )
{
	int i, j;
	LPHACK_PARAMS lphp = (LPHACK_PARAMS) lpVoid;
	const HWND hWnd = lphp->myHwnd;
	const LPTARGETINFO lpTarget = lphp->lpTarget;

	EnableMenuItem( GetMenu( hWnd ), IDM_WATCH, MF_BYCOMMAND | MF_GRAYED );
	EnableMenuItem( GetMenu( hWnd ), IDM_UNWATCH, MF_BYCOMMAND | MF_ENABLED );

	g_dwTargetProcessId[ 2 ] = WATCHING_IDLE;
	UpdateStatus( hWnd );

	TCHAR lpszTargetPath[ MAX_PATH * 2 ];
	TCHAR lpszTargetExe[ MAX_PATH * 2 ];
	lstrcpy( lpszTargetPath, lpTarget->szPath );
	lstrcpy( lpszTargetExe, lpTarget->szExe );
	wsprintf( g_szTarget[ 2 ], TEXT( "%s (Watching)" ), lpszTargetPath );

	for( i = 8; i < 12; i++ )
	{
		lstrcpy( lphp->lpszStatus[ i ], TEXT( "" ) );
	}

	lstrcpy( lphp->lpszStatus[ 13 ], TEXT( "Watching..." ) );


	TCHAR str[ MAX_PATH * 2 ];

#ifdef _UNICODE
	lstrcpy( lphp->lpszStatus[ 14 ], lpszTargetPath );
#else
	lstrcpy( str, lpszTargetPath );
	if( lstrlen( str ) >= 19 )
	{
		str[ 15 ] = '\0';
		PathToExeEx( str, MAX_PATH * 2 );
	}
	lstrcpy( lphp->lpszStatus[ 14 ], str );
#endif

	wsprintf( str, TEXT( "Watching : %s" ), lpszTargetPath );
	WriteDebugLog( str );

	AdjustLength( lphp->lpszStatus[ 14 ] );

	g_Slider[ 2 ] = (BYTE) GetSliderIni( lpszTargetPath );
	
	for( ; ; )
	{
		if( lphp->lpTarget->dwProcessId == TARGET_PID_NOT_SET )
		{
			g_dwTargetProcessId[ 2 ] = PathToProcess( lpszTargetPath );
		}
		else
		{
			g_dwTargetProcessId[ 2 ] = lphp->lpTarget->dwProcessId;
			wsprintf( str, TEXT( "Watching : ProcessID given : %08lX" ), g_dwTargetProcessId[ 2 ] );
			WriteDebugLog( str );
		}

		if( g_dwTargetProcessId[ 2 ] == g_dwTargetProcessId[ 0 ] )
		{
			if( g_bHack[ 0 ] )
			{
				SendMessage( hWnd, WM_USER_STOP, 0U, 0L );
			}

			Sleep( 500UL );
			
			for( i = 0; i < 4; i++ )
			{	
				lstrcpy( lphp->lpszStatus[ i ], TEXT( "" ) );
			}
			g_dwTargetProcessId[ 0 ] = TARGET_PID_NOT_SET;
			lstrcpy( g_szTarget[ 0 ], TARGET_UNDEF );
		}
		else if( g_dwTargetProcessId[ 2 ] == g_dwTargetProcessId[ 1 ] )
		{
			if( g_bHack[ 1 ] )
			{
				SendMessage( hWnd, WM_USER_STOP, 1U, 0L );
			}

			Sleep( 500UL );
			
			for( i = 4; i < 8; i++ )
			{
				lstrcpy( lphp->lpszStatus[ i ], TEXT( "" ) );
			}
			g_dwTargetProcessId[ 1 ] = TARGET_PID_NOT_SET;
			lstrcpy( g_szTarget[ 1 ], TEXT( "<target not specified>" ) );
		}


		if( g_dwTargetProcessId[ 2 ] == (DWORD) -1 )
		{
			if( lstrcmp( lphp->lpszStatus[ 15 ], TEXT( "Not found" ) ) != 0 )
			{
				wsprintf( lphp->lpszStatus[ 15 ], TEXT( "Not found" ) );
				InvalidateRect( hWnd, NULL, TRUE );
			}
			for( j = 0; j < 80; j++ ) // wait 8 seconds
			{
				Sleep( 100UL );
				if( ! g_bHack[ 3 ] ) goto EXIT_THREAD;
			}
		}
		else
		{
			wsprintf( str, TEXT( "Watching : Found! <%s>" ), lpszTargetPath );
			WriteDebugLog( str );
			lphp->lpTarget->dwProcessId = g_dwTargetProcessId[ 2 ];
			lstrcpy( lphp->lpTarget->szPath, lpszTargetPath );
			lstrcpy( lphp->lpTarget->szExe , lpszTargetExe );
			lstrcpy( lphp->lpTarget->szText, TEXT( "" ) );
			g_Slider[ 2 ] = (BYTE) GetSliderIni( lpszTargetPath );

			SendMessage( hWnd, WM_USER_HACK, (WPARAM) 2, (LPARAM) lphp );
			
			UpdateStatus( hWnd );

			wsprintf( lphp->lpszStatus[ 15 ], TEXT( "Found ( %08lX )" ), g_dwTargetProcessId[ 2 ] );
			InvalidateRect( hWnd, NULL, TRUE );

			while( g_dwTargetProcessId[ 2 ] != TARGET_PID_NOT_SET )
			{
				Sleep( 100UL );
				if( g_bHack[ 3 ] == FALSE )
				{
					WriteDebugLog( TEXT( "g_bHack[ 3 ] == FALSE" ) );

					goto EXIT_THREAD;
				}
			}
			
			if( WaitForSingleObject( hSemaphore[ 2 ], 1000UL ) != WAIT_OBJECT_0 )
			{
				g_bHack[ 2 ] = FALSE;
				MessageBox( hWnd, TEXT("Sema Error in LimitPlus()"), APP_NAME, MB_OK | MB_ICONEXCLAMATION );
				goto EXIT_THREAD;
			}
			
			g_dwTargetProcessId[ 2 ] = WATCHING_IDLE;
			UpdateStatus( hWnd );
		}

	}

EXIT_THREAD:
	WriteDebugLog( TEXT( "Watch: Exiting Thread..." ) );

	// if the Watched is idle, we will free the slot #2 when 'unwatch' is posted
	// (Otherwise, #2 should be still active)
	if( g_dwTargetProcessId[ 2 ] == WATCHING_IDLE )
	{
		g_dwTargetProcessId[ 2 ] = TARGET_PID_NOT_SET;
		lphp->lpTarget->dwProcessId = TARGET_PID_NOT_SET;
		g_bHack[ 2 ] = FALSE;
		ReleaseSemaphore( hSemaphore[ 2 ], 1L, (LONG *) NULL );
	}

	if( ReleaseSemaphore( hSemaphore[ 3 ], 1L, (LONG *) NULL ) )
	{
		WriteDebugLog( TEXT( "* Sema3 Released" ) );
	}
	else
	{
		WriteDebugLog( TEXT( "[!] Sema3 Not released" ) );
	}

	lstrcpy( lphp->lpszStatus[ 13 ], TEXT( "* Not watching *" ) );
	lstrcpy( lphp->lpszStatus[ 14 ], lpszTargetPath );
	AdjustLength( lphp->lpszStatus[ 14 ] );
	lstrcpy( lphp->lpszStatus[ 15 ], TEXT( "" ) );
	InvalidateRect( hWnd, NULL, TRUE );

	if( ! g_bHack[ 2 ] )
	{
		EnableMenuItem( GetMenu( hWnd ), IDM_WATCH, MF_BYCOMMAND | MF_ENABLED );
	}
	EnableMenuItem( GetMenu( hWnd ), IDM_UNWATCH, MF_BYCOMMAND | MF_GRAYED );

	UpdateStatus( hWnd );

	g_bHack[ 3 ] = FALSE; // just in case
	return NOT_WATCHING;
}
int GetArgument( LPCTSTR lpszCmdLine, int iBufferSize, LPTSTR lpszMyPath,
				LPTSTR lpszTargetLongPath, LPTSTR lpszTargetLongExe )
{
	if( iBufferSize > MAX_PATH * 2 ) iBufferSize = MAX_PATH * 2;

	TCHAR lpszTargetPath[ MAX_PATH * 2 ] = _T( "" );

	TCHAR p[ 1024 ];
	lstrcpy( p, lpszCmdLine );
	int s = 0;
	while( p[ s ] == TEXT( ' ' ) )
	{
		s++;
	}

	TCHAR * p1;
	TCHAR * p2;
	if( p[ s ] == TEXT( '\"' ) )
	{
		if( lstrlen( &p[ s + 1 ] ) >= iBufferSize ) return IGNORE_ARGV;
		else lstrcpy( lpszMyPath, &p[ s + 1 ] );

		p1 = _tcschr( lpszMyPath, TEXT( '\"' ) );
		
		if( !p1 ) return IGNORE_ARGV;
		else p1[ 0 ] = TEXT( '\0' );

		if( p1[ 1 ] != TEXT( ' ' ) ) return IGNORE_ARGV;
		else p2 = &p1[ 2 ];

	}
	else
	{
		if( lstrlen( &p[ s ] ) >= iBufferSize ) return IGNORE_ARGV;
		else lstrcpy( lpszMyPath, &p[ s ] );
		p1 = _tcschr( lpszMyPath, TEXT( ' ' ) );
		if( !p1 ) return IGNORE_ARGV;
		else p1[ 0 ] = TEXT( '\0' );
		p2 = &p1[ 1 ];
	}

	WriteDebugLog( lpszMyPath );

	s = 0;
	while( p2[ s ] == TEXT( ' ' ) )
	{
		s++;
	}

	if( p2[ s ] == TEXT( '\"' ) )
	{
		lstrcpy( lpszTargetPath, &p2[ s + 1 ] );
		p1 = _tcschr( lpszTargetPath, TEXT( '\"' ) );
		
		if( !p1 ) return IGNORE_ARGV;
		else p1[ 0 ] = TEXT( '\0' );
		if( p1[ 1 ] == TEXT( ' ' ) )
		{
			p2 = &p1[ 2 ];
		}
		else
		{
			p2 = p1; // TEXT( '\0' )
		}
	}
	else
	{
		lstrcpy( lpszTargetPath, &p2[ s ] );
		p1 = _tcschr( lpszTargetPath, TEXT( ' ' ) );
		if( p1 )
		{
			p1[ 0 ] = TEXT( '\0' );
			p2 = &p1[ 1 ];
		}
		else
		{
			p2 = p1; // TEXT( '\0' )
		}
	}

	int len = lstrlen( lpszTargetPath );
	if( len < 5 ) return IGNORE_ARGV;

//	if( lstrcmpi( &lpszTargetPath[ len - 4 ], TEXT( ".exe" ) ) != 0 ) return IGNORE_ARGV;

	WriteDebugLog( lpszTargetPath );

	DWORD dwResult = 
		GetLongPathName( lpszTargetPath, lpszTargetLongPath, (DWORD) iBufferSize );
	if( dwResult == 0UL || dwResult > (DWORD) iBufferSize )
	{
		lstrcpy( lpszTargetLongPath, lpszTargetPath );
	}

	WriteDebugLog( lpszTargetLongPath );

	PathToExe( lpszTargetLongPath, lpszTargetLongExe, iBufferSize );

	WriteDebugLog( lpszTargetLongExe );

#if !defined( _UNICODE )
	lstrcpy( lpszTargetLongPath, lpszTargetLongExe );
#endif

	int iSlider = _ttoi( p2 );

	
	if( iSlider < 0 || iSlider > 99 )
	{
		iSlider = 0;
	}


	WriteDebugLog( p2 );


	return iSlider;
}
LRESULT CALLBACK Settings( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
#define TIMER_ID_S (UINT) 'S'

	static LONG lSlider[ 3 ];
	static int iPathId[ 3 ] = { IDC_EDIT_TARGET1, IDC_EDIT_TARGET2, IDC_EDIT_TARGET3 };
	static int iButtonId[ 3 ] = { IDC_BUTTON_STOP1, IDC_BUTTON_STOP2, IDC_BUTTON_STOP3 };
	static int iTextId[ 3 ] = { IDC_TEXT_TARGET1, IDC_TEXT_TARGET2, IDC_TEXT_TARGET3 };
	static int iSliderId[ 3 ] = { IDC_SLIDER1, IDC_SLIDER2, IDC_SLIDER3 };
	static HWND hWnd;
	static int iMyId;
	static LPTSTR * lpszStatus;
	static TCHAR lpszWindowText[ 1024 ];

	static HFONT hMyFont = NULL;


	switch (message)
	{
		case WM_INITDIALOG:
		{
			hWnd = ( ( LPHACK_PARAMS ) lParam ) -> myHwnd;
			iMyId =  ( ( LPHACK_PARAMS ) lParam ) -> iMyId;
			lpszStatus = ( ( LPHACK_PARAMS ) lParam ) -> lpszStatus;

			
			HDC hDC = GetDC( hDlg );
			
			hMyFont = MyCreateFont( hDC, TEXT( "Verdana" ), 12, TRUE, FALSE );

			

			ReleaseDC( hDlg, hDC );
		

#ifdef _UNICODE
			if( IS_JAPANESE )
			{
				
				MultiByteToWideChar( CP_UTF8, MB_CUTE,
					IS_JAPANESEo ? S_JPNo_1002 : S_JPN_1002,
					-1, lpszWindowText, 1023 );
				SetWindowText( hDlg, lpszWindowText );
			}
			else if( IS_FRENCH )
			{

				MultiByteToWideChar( CP_UTF8, MB_CUTE,
					S_FRE_1002,
					-1, lpszWindowText, 1023 );
				SetWindowText( hDlg, lpszWindowText );
			}
			else if( IS_SPANISH )
			{

				MultiByteToWideChar( CP_UTF8, MB_CUTE,
					S_SPA_1002,
					-1, lpszWindowText, 1023 );
				SetWindowText( hDlg, lpszWindowText );
			}
			else
#endif
			{
				lstrcpy( lpszWindowText, _T( "Limiter control" ) );
				SetWindowText( hDlg, lpszWindowText );
			}

			for( int i = 0; i < 3; i++ )
			{
				lSlider[ i ] = (long) g_Slider[ i ];
				SetDlgItemText( hDlg, iPathId[ i ], g_szTarget[ i ] );
				TCHAR tmpstr[ 100 ];
				wsprintf( tmpstr, TEXT( "%s #&%d" ),
						( ( g_bHack[ i ] )? TEXT( "Unlimit" ) : TEXT( "Limit" ) ),
						i + 1
				);
				SetDlgItemText( hDlg, iButtonId[ i ], tmpstr );
				EnableWindow( GetDlgItem( hDlg, iButtonId[ i ] ), ( g_dwTargetProcessId[ i ] != TARGET_PID_NOT_SET ) );
				EnableWindow( GetDlgItem( hDlg, iSliderId[ i ] ), ( g_dwTargetProcessId[ i ] != TARGET_PID_NOT_SET ) );
				EnableWindow( GetDlgItem( hDlg, iTextId[ i ] ), ( g_dwTargetProcessId[ i ] != TARGET_PID_NOT_SET ) );

				SendDlgItemMessage( hDlg, iSliderId[ i ], TBM_SETRANGE, TRUE, MAKELONG( 1, 99 ) );
				
				
				SendDlgItemMessage( hDlg, iSliderId[ i ], TBM_SETPOS,   TRUE, lSlider[ i ] );

				for( long lPos = 10L; lPos <= 90L; lPos += 10L )
				{
					SendDlgItemMessage( hDlg, iSliderId[ i ], TBM_SETTIC, 0U, lPos );
				}

				SendDlgItemMessage( hDlg, iTextId[ i ], WM_SETFONT, ( WPARAM ) hMyFont, 0L );
				SetSliderText( hDlg, iTextId[ i ] , lSlider[ i ] );
			}

			if( g_dwTargetProcessId[ 2 ] == (DWORD) -1 || g_bHack[ 3 ] )
			{
				SetDlgItemText( hDlg, iButtonId[ 2 ], TEXT( "(Watching)" ) );
				EnableWindow( GetDlgItem( hDlg, iButtonId[ 2 ] ), FALSE );
				EnableWindow( GetDlgItem( hDlg, iTextId[ 2 ] ), TRUE );
			}

			// Anti-Ukagaka
			SetTimer( hDlg, TIMER_ID_S, 500U, (TIMERPROC) NULL );
			break;
		}

		case WM_CTLCOLORSTATIC:
		{
			for( int i = 0; i < 3; i++ )
			{
				HWND hEdit = GetDlgItem( hDlg, iTextId[ i ] );
				if( (HWND) lParam == hEdit )
				{
					HDC hDC = (HDC) wParam;
					SetBkMode( hDC, TRANSPARENT );
					SetBkColor( hDC, GetSysColor( COLOR_3DFACE ) );
					SetTextColor( hDC, RGB( 0,0,0xaa ) );
					return (BOOL) (HBRUSH) GetSysColorBrush( COLOR_3DFACE );
				}
			}
			return 0L;
		}
		
		
		case WM_HSCROLL:
		{
			if( GetDlgItem( hDlg, IDC_SLIDER1 ) == (HWND) lParam && SliderMoved( wParam ) )
			{
				const RECT minirect = { 20L, 20L + 90L * 0L, 479L, 40L + 90L * 0L };
				lSlider[ 0 ] = SendDlgItemMessage( hDlg, IDC_SLIDER1, TBM_GETPOS, 0U, 0L );
				SetSliderText( hDlg, IDC_TEXT_TARGET1, lSlider[ 0 ] );
				g_Slider[ 0 ] = GetSliderParam( lSlider[ 0 ] );
				if( g_bHack[ 0 ] )
				{
					wsprintf( lpszStatus[ 0 ], TEXT( "Target #1 [ -%d%% ]" ),
						g_Slider[ 0 ] );
					InvalidateRect( hWnd, &minirect, 0 );
				}
			}
			else
			if( GetDlgItem( hDlg, IDC_SLIDER2 ) == (HWND) lParam && SliderMoved( wParam ) )
			{
				const RECT minirect = { 20L, 20L + 90L * 1L, 479L, 40L + 90L * 1L };
				lSlider[ 1 ] = SendDlgItemMessage( hDlg, IDC_SLIDER2, TBM_GETPOS, 0U, 0L );
				SetSliderText( hDlg, IDC_TEXT_TARGET2, lSlider[ 1 ] );
				g_Slider[ 1 ] = GetSliderParam( lSlider[ 1 ] );
				if( g_bHack[ 1 ] )
				{
					wsprintf( lpszStatus[ 0 + 4 * 1 ], TEXT( "Target #2 [ -%d%% ]" ),
						g_Slider[ 1 ] );
					InvalidateRect( hWnd, &minirect, 0 );
				}
			}
			else
			if( GetDlgItem( hDlg, IDC_SLIDER3 ) == (HWND) lParam && SliderMoved( wParam ) )
			{
				const RECT minirect = { 20L, 20L + 90L * 2L, 479L, 40L + 90L * 2L };
				lSlider[ 2 ] = SendDlgItemMessage( hDlg, IDC_SLIDER3, TBM_GETPOS, 0U, 0L );
				SetSliderText( hDlg, IDC_TEXT_TARGET3, lSlider[ 2 ] );
				g_Slider[ 2 ] = GetSliderParam( lSlider[ 2 ] );
				if( g_bHack[ 2 ] )
				{
					wsprintf( lpszStatus[ 0 + 4 * 2 ], TEXT( "Target #3 [ -%d%% ]" ),
						g_Slider[ 2 ] );
					InvalidateRect( hWnd, &minirect, 0 );
				}
			}
			break;
		}
		case WM_COMMAND:
		{
			switch( LOWORD( wParam ) )
			{
				case IDOK:
				{
					TCHAR msg[ 4096 ];
					int i;
					for( i = 0; i < 3; i++ )
					{
						if( g_dwTargetProcessId[ i ] != 0UL )
						{
							wsprintf( msg, TEXT( "g_Slider[ %d ] = %d : %s" ), i, (int) g_Slider[ i ], g_szTarget[ i ] );
							WriteDebugLog( msg );
							SetSliderIni( g_szTarget[ i ], (int) g_Slider[ i ] );
						}
					}

					EndDialog( hDlg, TRUE );
					break;
				}
				case IDCANCEL:
				{
					EndDialog( hDlg, FALSE );
					break;
				}
				case IDC_BUTTON_STOP1:
				{
					if( g_bHack[ 0 ] )
					{
						SendMessage( hWnd, WM_USER_STOP, 0U, 0L );
						SetDlgItemText( hDlg, iButtonId[ 0 ], TEXT( "Limit #&1" ) );
					}
					else
					{
						SendMessage( hWnd, WM_USER_RESTART, 0U, 0L );
						SetDlgItemText( hDlg, iButtonId[ 0 ], TEXT( "Unlimit #&1" ) );
					}
					break;
				}
				case IDC_BUTTON_STOP2:
				{
					if( g_bHack[ 1 ] )
					{
						SendMessage( hWnd, WM_USER_STOP, 1U, 0L );
						SetDlgItemText( hDlg, iButtonId[ 1 ], TEXT( "Limit #&2" ) );
					}
					else
					{
						SendMessage( hWnd, WM_USER_RESTART, 1U, 0L );
						SetDlgItemText( hDlg, iButtonId[ 1 ], TEXT( "Unlimit #&2" ) );
					}
					break;
				}
				case IDC_BUTTON_STOP3:
				{
					if( g_bHack[ 2 ] )
					{
						SendMessage( hWnd, WM_USER_STOP, 2U, 0L );
						SetDlgItemText( hDlg, iButtonId[ 2 ], TEXT( "Limit #&3" ) );
					}
					else
					{
						SendMessage( hWnd, WM_USER_RESTART, 2U, 0L );
						SetDlgItemText( hDlg, iButtonId[ 2 ], TEXT( "Unlimit #&3" ) );
					}
					break;
				}
				default:
				{
					break;
				}
			}
			break; // <-- fixed @ 1.1 beta3
		}

		case WM_TIMER:
		{
			SetWindowText( hDlg, lpszWindowText );
			break;
		}
		case WM_DESTROY:
		{
			DeleteFont( hMyFont );
			hMyFont = NULL;
			KillTimer( hDlg, TIMER_ID_S );
			
			break;
		}
		default:
			return 0L;//FALSE;
	}
    return 1L;//TRUE;
}
DWORD WINAPI Hack( LPVOID lpVoid )
{
	TCHAR msg[ 4096 ];
	LPHACK_PARAMS lphp = (LPHACK_PARAMS) lpVoid;
	HWND hWnd = lphp -> myHwnd;
	const int iMyId = lphp -> iMyId;
	LPTARGETINFO lpTarget = lphp -> lpTarget;
	LPTSTR * lpszStatus = lphp -> lpszStatus;
	DWORD dwTargetProcessId = lpTarget -> dwProcessId;
	DWORD dwPrevSuspendCount;
	DWORD dwTotalChanges = 0;
	int iPrevThreadCount = 0;
	int errorflag = 0;

	const RECT minirect = { 20L, 20L + 90L * iMyId, 479L, 40L + 90L * iMyId };
	const RECT hackrect = { 20L, 20L + 90L * iMyId, 479L, 100L + 90L * iMyId };

	TCHAR lpszEnemyPath[ MAX_PATH * 2 ] = _T("");
	TCHAR lpszEnemyExe[ MAX_PATH * 2 ] = _T("");
	lstrcpy( lpszEnemyPath, lpTarget->szPath );
	lstrcpy( lpszEnemyExe, lpTarget->szExe );

	int i , j;

	HANDLE hProcess = NULL;
	DWORD dwOldPriority = NORMAL_PRIORITY_CLASS;
	int iOpenThreadRetry = 0;
	int iSuspendThreadRetry = 0;
	int iResumeThreadRetry = 0;
	SYSTEMTIME st;

	for( i = 0 + iMyId * 4; i < 4 + iMyId * 4; i++ )
	{
		lstrcpy( lpszStatus[ i ], TEXT( "" ) );
	}

	lstrcpy( lpszStatus[ 2 + iMyId * 4 ], lpszEnemyPath );

#if !defined( _UNICODE )
	// for watching...
	if( iMyId == 2 && lstrlen( lpszEnemyPath ) >= 19 )
	{
		lpszStatus[ 2 + iMyId * 4 ][ 15 ] = '\0';
		PathToExeEx( lpszStatus[ 2 + iMyId * 4 ], MAX_PATH * 2 );
	}
#endif

	AdjustLength( lpszStatus[ 2 + iMyId * 4 ] );
	
	for( DWORD dwOuterLoops = 0; 
		g_bHack[ iMyId ];
		dwOuterLoops++ )
	{
		if( dwOuterLoops == 0UL )
		{
			hProcess = OpenProcess(
				PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION ,
				FALSE,
				dwTargetProcessId
			);
			if( hProcess )
			{
				dwOldPriority = GetPriorityClass( hProcess );
				wsprintf( msg, TEXT( "Target #%d: \"%s\"\r\n\tProcess ID = 0x%08lX : hProcess = 0x%08lX (Priority: %lu)" ),
					iMyId + 1, lpszEnemyPath, dwTargetProcessId, hProcess, dwOldPriority
				);
				WriteDebugLog( msg );
				if( g_bRealTime )
				{
					WriteDebugLog( SetPriorityClass( hProcess, IDLE_PRIORITY_CLASS )?
						TEXT( "SetPriorityClass OK" ) : TEXT( "SetPriorityClass failed" ) );
				}
			}
			else
			{
				WriteDebugLog( TEXT( "OpenProcess failed." ) );

				GetLocalTime( &st );
				wsprintf( lpszStatus[ 1 + iMyId * 4 ], TEXT( "Process ID = n/a" ) );
				wsprintf( lpszStatus[ 3 + iMyId * 4 ], TEXT( "%02d:%02d:%02d Initial OpenThread failed" ),
					st.wHour, st.wMinute, st.wSecond
				);
				g_dwTargetProcessId[ iMyId ] = TARGET_PID_NOT_SET;

				// This is needed as a workaround
				UpdateStatus( hWnd );

				if( ReleaseSemaphore( hSemaphore[ iMyId ], 1L, (LPLONG) NULL ) )
				{
					wsprintf( msg, TEXT( "* ReleaseSemaphore #%d in Hack()" ), iMyId + 1 );
					WriteDebugLog( msg );
				}
				else
				{
					wsprintf( msg, TEXT( "[!] Target #%d : ReleaseSemaphore failed in Hack(): ErrCode %lu" ),
						iMyId + 1, GetLastError() );
					WriteDebugLog( msg );
				}
				lphp->lpTarget->dwProcessId = TARGET_PID_NOT_SET;


				if( PathToProcess( lpszEnemyPath ) == ( DWORD ) -1 )
				{
					SendMessageCallback( hWnd, WM_USER_STOP, (WPARAM) iMyId, (LPARAM) TARGET_MISSING,
						(SENDASYNCPROC) DummyCallback, (DWORD) hWnd );

					InvalidateRect( hWnd, NULL, TRUE );
					return TARGET_MISSING;
				}
				else
				{
					SendMessageCallback( hWnd, WM_USER_STOP, (WPARAM) iMyId, (LPARAM) THREAD_NOT_OPENED,
						(SENDASYNCPROC) DummyCallback, (DWORD) hWnd );

					
					InvalidateRect( hWnd, NULL, TRUE );
					return THREAD_NOT_OPENED;

				}

			}

			
			wsprintf( lpszStatus[ 0 + iMyId * 4 ],
				TEXT( "Target #%d [ -%d%% ]" ),
				iMyId + 1,
				g_Slider[ iMyId ]
			);
		
		} // endif( dwOuterLoops == 0 )



		DWORD dwThreadId[ MAX_THREAD_CNT ];
		int iThreadCount = ListProcessThreads( dwTargetProcessId, dwThreadId );


		// ----------------------- @@@
		if( iThreadCount == 0 )
		{
			GetLocalTime( &st );
			wsprintf( lpszStatus[ 1 + iMyId * 4 ], TEXT( "Process ID = n/a" ) );
			wsprintf( lpszStatus[ 3 + iMyId * 4 ], TEXT( "%02d:%02d:%02d No threads" ),
				st.wHour, st.wMinute, st.wSecond
			);
			g_dwTargetProcessId[ iMyId ] = TARGET_PID_NOT_SET;
			if( hProcess ) 
			{
				SetPriorityClass( hProcess, dwOldPriority );
				CloseHandle( hProcess );
			}

			if( ReleaseSemaphore( hSemaphore[ iMyId ], 1L, (LPLONG) NULL ) )
			{
				wsprintf( msg, TEXT( "* TARGET_MISSING #%d : ReleaseSemaphore in Hack()" ), iMyId + 1 );
				WriteDebugLog( msg );
			}
			else
			{
				wsprintf( msg, TEXT( "[!] Target #%d : ReleaseSemaphore failed in Hack(): ErrCode %lu" ),
					iMyId + 1, GetLastError() );
				WriteDebugLog( msg );
			}

			g_bBlock = TRUE;
			
			WriteDebugLog( TEXT("SendMessage Doing...") );

			SendMessageCallback( hWnd, WM_USER_STOP, (WPARAM) iMyId, (LPARAM) TARGET_MISSING,
				(SENDASYNCPROC) DummyCallback, (DWORD) hWnd );

			WriteDebugLog( TEXT("SendMessage Done!") );

			for( int z = 0; z < 10; z++ )
			{
				if( ! g_bBlock )
				{
					wsprintf( msg, TEXT("g_bBlock cleared at z=%d"), z );
					WriteDebugLog( msg );
					break;
				}
				Sleep( 10UL );
			}

			lphp->lpTarget->dwProcessId = TARGET_PID_NOT_SET;
// [email protected] beta
// This is not needed because WM_USER_STOP will do the same,
// and this thread will die (so thie order wil be probably void) anyway
//			InvalidateRect( hWnd, NULL, TRUE );
			return TARGET_MISSING;
		}

		if( dwOuterLoops == 0UL )
		{
			iPrevThreadCount = iThreadCount;
			wsprintf( msg, TEXT( "Target #%d : iThreadCount = %3d" ), iMyId + 1, iThreadCount );
			WriteDebugLog( msg );
		}
		else if( dwOuterLoops % 50UL == 0UL )
		{
			wsprintf( msg, TEXT( "Target #%d : Loops %5d, ThreadCnt %3d (Prev %3d)" ), 
				iMyId + 1, dwOuterLoops, iThreadCount, iPrevThreadCount );
			WriteDebugLog( msg );
		}

		wsprintf( lpszStatus[ 1 + iMyId * 4 ], TEXT( "Process ID = 0x%04X %04X [ %d %s ]" ),
			HIWORD( dwTargetProcessId ),
			LOWORD( dwTargetProcessId ),
			iThreadCount,
			( iThreadCount > 1 ? TEXT( "Threads" ) : TEXT( "Thread" ) )
		);
		GetLocalTime( &st );
		if( iThreadCount != iPrevThreadCount || errorflag )
		{
			dwTotalChanges++;
			wsprintf( msg, TEXT( "Target #%d : iThreadCount = %3d (Prev = %d)" ), iMyId + 1, iThreadCount, iPrevThreadCount );
			WriteDebugLog( msg );
			iPrevThreadCount = iThreadCount;
			errorflag = 0;
			wsprintf( lpszStatus[ 3 + iMyId * 4 ], TEXT( "%02d:%02d:%02d Target Re-Locked On: OK" ),
				st.wHour, st.wMinute, st.wSecond
			);
		}
		else
		{
			wsprintf( lpszStatus[ 3 + iMyId * 4 ], TEXT( "%02d:%02d:%02d %s: OK" ),
				st.wHour, st.wMinute, st.wSecond,
				dwOuterLoops == 0 ? TEXT( "Started" ) : TEXT( "Calm" )
			);
		}

		HANDLE hTarget[ MAX_THREAD_CNT ];
		ZeroMemory( hTarget, sizeof( HANDLE ) * MAX_THREAD_CNT );
		int iOpenedThread = 0;
		for( i = 0; i < iThreadCount; i++ )
		{
			hTarget[ i ] = OpenThread( THREAD_SUSPEND_RESUME, FALSE, dwThreadId[ i ] );
			if( hTarget[ i ] == NULL )
			{
				wsprintf( msg, TEXT( "[!] Target #%d : OpenThread failed: Thread #%03d, ThreadId 0x%08lX" ),
					iMyId + 1, i + 1, dwThreadId[ i ] );
				WriteDebugLog( msg );
			}
			else
			{
				iOpenedThread++;
			}
		}

		// ###----------------
		if( iOpenedThread == 0
			||
			iOpenedThread != iThreadCount && iOpenThreadRetry > 10
			||
			iSuspendThreadRetry > 100
			||
			iResumeThreadRetry > 50			
		)
		{
			GetLocalTime( &st );
			if( iResumeThreadRetry > 50 )
			{
				wsprintf( lpszStatus[ 3 + iMyId * 4 ], TEXT( "%02d:%02d:%02d ResumeThread Error" ),
					st.wHour, st.wMinute, st.wSecond
				);
				// to do
				// 'unfreeze'
			}
			else if( iSuspendThreadRetry > 100 )
			{
				wsprintf( lpszStatus[ 3 + iMyId * 4 ], TEXT( "%02d:%02d:%02d SuspendThread Error" ),
					st.wHour, st.wMinute, st.wSecond
				);
			}
			else
			{
				wsprintf( lpszStatus[ 3 + iMyId * 4 ], TEXT( "%02d:%02d:%02d OpenThread Error" ),
					st.wHour, st.wMinute, st.wSecond
				);
			}

			WriteDebugLog( lpszStatus[ 3 + iMyId * 4 ] );
			WriteDebugLog( TEXT( "### Giving up... ###" ) );

			lphp->lpTarget->dwProcessId = TARGET_PID_NOT_SET; //?
			g_dwTargetProcessId[ iMyId ] = TARGET_PID_NOT_SET;

			if( hProcess ) 
			{
				SetPriorityClass( hProcess, dwOldPriority );
				CloseHandle( hProcess );
			}

			// This is needed as a workaround ? (Possibly this works as a workaround) 1.0 beta6
			UpdateStatus( hWnd );

			if( ReleaseSemaphore( hSemaphore[ iMyId ], 1L, NULL ) )
			{
				wsprintf( msg, TEXT( "* THREAD_NOT_OPENED #%d : ReleaseSemaphore in Hack()" ), iMyId + 1 );
				WriteDebugLog( msg );
			}

			BOOL bMissing = ( PathToProcess( lpszEnemyPath ) == ( DWORD ) -1 );
			WriteDebugLog( TEXT("SendMessage Doing...") );

			SendMessageCallback( hWnd, WM_USER_STOP, (WPARAM) iMyId,
				bMissing? TARGET_MISSING : THREAD_NOT_OPENED,
				(SENDASYNCPROC) DummyCallback, (DWORD) hWnd );

			WriteDebugLog( TEXT("SendMessage Done!") );

			lphp->lpTarget->dwProcessId = TARGET_PID_NOT_SET;

			InvalidateRect( hWnd, NULL, TRUE );

			return ( bMissing ) ? TARGET_MISSING : THREAD_NOT_OPENED ;
		}
		else if( iOpenedThread != iThreadCount )
		{
			for( j = 0; j < i; j++ ) if( hTarget[ j ] ) CloseHandle( hTarget[ j ] );
			iOpenThreadRetry++;
			wsprintf( msg, TEXT( "@ Couldn't open some threads: Retrying #%d..." ), iOpenThreadRetry );
			WriteDebugLog( msg );
			Sleep( 100UL );
			continue;
		}

		iOpenThreadRetry = 0;

		if( g_bHack[ 0 ] || g_bHack[ 1 ] || g_bHack[ 2 ] )
		{
			TCHAR strStatus[ 1024 ] = TEXT( " Limiting CPU load:" );
#ifdef _UNICODE
			if( IS_JAPANESE )
			{
				MultiByteToWideChar( CP_UTF8, MB_CUTE, S_JPN_2000, -1, strStatus, 1023 );
			}
			else if( IS_FINNISH )
			{
				MultiByteToWideChar( CP_UTF8, MB_CUTE, S_FIN_2000, -1, strStatus, 1023 );
			}
			else if( IS_SPANISH )
			{
				MultiByteToWideChar( CP_UTF8, MB_CUTE, S_SPA_2000, -1, strStatus, 1023 );
			}
			else if( IS_CHINESE_T )
			{
				MultiByteToWideChar( CP_UTF8, MB_CUTE, S_CHI_2000T, -1, strStatus, 1023 );
			}
			else if( IS_CHINESE_S )
			{
				MultiByteToWideChar( CP_UTF8, MB_CUTE, S_CHI_2000S, -1, strStatus, 1023 );
			}
			else if( IS_FRENCH )
			{
				MultiByteToWideChar( CP_UTF8, MB_CUTE, S_FRE_2000, -1, strStatus, 1023 );
			}
#endif
				
			if( g_bHack[ 0 ] )
			{
				lstrcat( strStatus, TEXT( " #1" ) );
			}
				
			if( g_bHack[ 1 ] )
			{
				lstrcat( strStatus, TEXT( " #2" ) );
			}
				
			if( g_bHack[ 2 ] && g_dwTargetProcessId[ 2 ] != (DWORD) -1 )
			{
				lstrcat( strStatus, TEXT( " #3" ) );
			}
		
			wsprintf( lpszStatus[ 12 ], TEXT( "%s" ), strStatus );
		}
		else
		{
			lstrcpy( lpszStatus[ 12 ], TEXT( "" ) );
		}



		InvalidateRect( hWnd, &hackrect, FALSE );




		for( DWORD dwInnerLoops = 1; dwInnerLoops <= MAX_INNER_LOOPS; dwInnerLoops++ )
		{
			BYTE TimeRed = g_Slider[ iMyId ];
			BYTE TimeGreen = (BYTE)( 100 - TimeRed );
			
			for( i = 0; i < iThreadCount; i++ )
			{
				if( ! hTarget[ i ] ) continue;

				dwPrevSuspendCount = SuspendThread( hTarget[ i ] );
				if( ( DWORD ) -1 == dwPrevSuspendCount )
				{
					errorflag = 1;
					wsprintf( msg,
						TEXT( "Target #%d : SuspendThread failed (Thread #%03d) : Retry=%d" ),
						iMyId + 1, i + 1, iSuspendThreadRetry );
					WriteDebugLog( msg );
				}
//				else if( dwPrevSuspendCount != 0UL )
//				{
//					WriteDebugLog( TEXT( "### dwPrevSuspendCount != 0UL" ) );
//					do
//					{
//						dwPrevSuspendCount = ResumeThread( hTarget[ i ] );
//					}
//					while( dwPrevSuspendCount > 1UL );
//				}
			}

			if( errorflag == 1 )
			{
				iSuspendThreadRetry++;
			}
			else
			{
				iSuspendThreadRetry = 0;
			}

			Sleep( (DWORD) TimeRed );
			for( i = 0; i < iThreadCount; i++ )
			{
				if( ! hTarget[ i ] ) continue;
				DWORD dwPrevSuspendCount = ResumeThread( hTarget[ i ] );
				if( ( DWORD ) -1 == dwPrevSuspendCount )
				{
					errorflag = 2;
					wsprintf( msg,
						TEXT( "Target #%d : ResumeThread failed: Thread #%03d, ThreadId 0x%08lX, iResumeThreadRetry=%d" ),
						iMyId + 1, i + 1, dwThreadId[ i ], iResumeThreadRetry );
					WriteDebugLog( msg );
				}
//
//				else if( dwPrevSuspendCount != 1UL )
//				{
//					WriteDebugLog( TEXT( "### dwPrevSuspendCount != 1UL" ) );
//					do
//					{
//						dwPrevSuspendCount = ResumeThread( hTarget[ i ] );
//					}
//					while( dwPrevSuspendCount > 1UL );
//				}

			}

			if( errorflag == 2 )
			{
				iResumeThreadRetry++;
			}
			else
			{
				iResumeThreadRetry = 0;
			}

			if( g_bHack[ iMyId ] == FALSE || errorflag )
			{
				break;
			}
			Sleep( (DWORD) TimeGreen );
		
		
			if( dwInnerLoops % 10UL == 0UL )
			{
				wsprintf( lpszStatus[ 0 + iMyId * 4 ],
					TEXT( "Target #%d [ -%d%% ] %s" ),
					iMyId + 1,
					g_Slider[ iMyId ],
					( dwInnerLoops % 20UL == 0UL )?
						_T( " " ) :
#ifdef _UNICODE
						L"\x25CF"
#else
						"*"
#endif
				);
				InvalidateRect( hWnd, &minirect, 0 );
			}
		
		}

		for( i = 0; i < iThreadCount; i++ )
		{
			if( hTarget[ i ] ) CloseHandle( hTarget[ i ] );
		}
	}

	wsprintf( lpszStatus[ 1 + iMyId * 4 ], TEXT( "* Unlimited *" ) );

	if( ReleaseSemaphore( hSemaphore[ iMyId ], 1L, (LONG *) NULL ) )
	{
		wsprintf( msg, TEXT( "* Target #%d : ReleaseSemaphore in Hack()" ), iMyId + 1 );
		WriteDebugLog( msg );
	}
	else
	{
		wsprintf( msg, TEXT( "[!] Target #%d : ReleaseSemaphore failed in Hack(): ErrCode %lu" ),
			iMyId + 1, GetLastError() );
		WriteDebugLog( msg );
	}

	if( hProcess ) 
	{
		WriteDebugLog( SetPriorityClass( hProcess, dwOldPriority )? TEXT( "Set dwOldPriority: OK" ) : TEXT( "Set dwOldPriority: Failed" ) );
		CloseHandle( hProcess );
	}

	lstrcpy( lpszStatus[ 3 + iMyId * 4 ], TEXT( "" ) );
	return NORMAL_TERMINATION;
}