📄 thrdctl.c
字号:
break;
}
break;
case WM_CLOSE:
EndDialog( hwnd, 0 );
break;
default:
return( FALSE );
}
return( TRUE );
}
#endif
static DWORD getThreadId( char *str ) {
DWORD ret;
sscanf( str, "%*s %*s %X", &ret );
return( ret );
}
static void fillThreadCtl( HWND hwnd, ProcStats *info, char *buf ) {
HWND lb;
LRESULT index;
char save[100];
ThreadList thdinfo;
ThreadPlace place;
BOOL rc;
lb = GetDlgItem( hwnd, THREAD_LIST );
index = SendMessage( lb, LB_GETCURSEL, 0, 0L );
if( index == LB_ERR ) {
strcpy( save, "bbbbbbbbbbbb" ); /* just some text that shouldn't
match anything in the listbox */
} else {
SendMessage( lb, LB_GETTEXT, index, (DWORD)save );
}
SendMessage( lb, LB_RESETCONTENT, 0, 0L );
rc = GetNextThread( &thdinfo, &place, info->pid, TRUE );
while( rc ) {
sprintf( buf, "tid = %08lX", thdinfo.tid );
SendMessage( lb, LB_ADDSTRING, 0, (DWORD)buf );
rc = GetNextThread( &thdinfo, &place, info->pid, FALSE );
}
index = SendMessage( lb, LB_FINDSTRING, -1, (DWORD)save );
if( index == LB_ERR ) {
enableChoices( hwnd, FALSE );
} else {
SendMessage( lb, LB_SETCURSEL, index, 0L );
}
}
static void fillThreadInfo( HWND hwnd, ProcStats *info ) {
HWND lb;
LRESULT index;
char buf[100];
DWORD threadid;
ThreadStats thdinfo;
#ifndef CHICAGO
char *str1;
#endif
lb = GetDlgItem( hwnd, THREAD_LIST );
index = SendMessage( lb, LB_GETCURSEL, 0, 0L );
if( index == LB_ERR ) {
SetDlgItemText( hwnd, THREAD_TID, "" );
SetDlgItemText( hwnd, THREAD_SUSPEND_CNT, "" );
SetDlgItemText( hwnd, THREAD_PRIORITY, "" );
} else {
enableChoices( hwnd, TRUE );
SendMessage( lb, LB_GETTEXT, index, (DWORD)buf );
threadid = getThreadId( buf );
sprintf( buf, "tid = %08lX", threadid );
SetDlgItemText( hwnd, THREAD_TID, buf );
if( GetThreadInfo( info->pid, threadid, &thdinfo ) ) {
#ifndef CHICAGO
if( thdinfo.state == 5 ) { /* the thread is in a wait state */
str1 = SrchMsg( thdinfo.wait_reason, ThreadWaitMsgs, NULL );
if( str1 == NULL ) {
str1 = AllocRCString( STR_WAIT_4_UNKNOWN );
RCsprintf( buf, STR_STATE, str1 );
FreeRCString( str1 );
} else {
RCsprintf( buf, STR_STATE, str1 );
}
} else {
str1 = SrchMsg( thdinfo.state, ThreadStateMsgs, NULL );
if( str1 == NULL ) {
str1 = AllocRCString( STR_BRACED_UNKNOWN );
RCsprintf( buf, STR_STATE, str1 );
FreeRCString( str1 );
} else {
RCsprintf( buf, STR_STATE, str1 );
}
}
SetDlgItemText( hwnd, THREAD_SUSPEND_CNT, buf );
#endif
/* get priority */
RCsprintf( buf, STR_PRIORITY_X, thdinfo.cur_pri,
thdinfo.base_pri );
SetDlgItemText( hwnd, THREAD_PRIORITY, buf );
}
}
}
/*
* ThreadCtlProc
*/
BOOL CALLBACK ThreadCtlProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
{
WORD cmd;
ThreadCtlInfo *info;
LRESULT index;
char buf[200];
DWORD threadid;
ThreadNode *thread;
ProcNode *process;
DWORD susp_cnt;
DWORD rc;
char *action;
info = (ThreadCtlInfo *)GetWindowLong( hwnd, DWL_USER );
switch( msg ) {
case WM_INITDIALOG:
info = MemAlloc( sizeof( ThreadCtlInfo ) );
if( !GetProcessInfo( lparam, &info->procinfo ) ) {
RCsprintf( buf, STR_CANT_GET_PROC_INFO, info->procid );
MessageBox( hwnd, buf, AppName, MB_OK | MB_ICONEXCLAMATION );
SendMessage( hwnd, WM_CLOSE, 0, 0 );
}
info->procid = lparam;
ThreadDlg = hwnd;
SetWindowLong( hwnd, DWL_USER, (DWORD) info );
fillThreadCtl( hwnd, &info->procinfo, buf );
RCsprintf( buf, STR_THREAD_4_PROC_X, lparam );
SetDlgItemText( hwnd, THREAD_PROC_NAME, buf );
sprintf( buf, "(%s)", info->procinfo.name );
SetDlgItemText( hwnd, THREAD_PROC_PATH, buf );
SendDlgItemMessage( hwnd, THREAD_LIST, LB_SETCURSEL, 0, 0L );
index = SendDlgItemMessage( hwnd, THREAD_LIST, LB_GETCURSEL, 0, 0L );
if( index != LB_ERR ) {
enableChoices( hwnd, TRUE );
}
fillThreadInfo( hwnd, &info->procinfo );
break;
case WM_COMMAND:
cmd = LOWORD( wparam );
if( cmd == THREAD_SUSPEND || cmd == THREAD_RESUME ||
cmd == THREAD_KILL || cmd == THREAD_SET_PRIORITY ) {
index = SendDlgItemMessage( hwnd, THREAD_LIST,
LB_GETCURSEL, 0, 0L );
if( index == LB_ERR ) {
RCMessageBox( hwnd, STR_NO_SELECTED_THREAD, AppName,
MB_OK | MB_ICONEXCLAMATION );
break;
}
SendDlgItemMessage( hwnd, THREAD_LIST, LB_GETTEXT,
index, (DWORD)buf );
threadid = getThreadId( buf );
process = FindProcess( info->procinfo.pid );
thread = FindThread( process, threadid );
}
switch( cmd ) {
case IDOK:
SendMessage( hwnd, WM_CLOSE, 0, 0L );
break;
case THREAD_REFRESH:
RefreshInfo();
if( GetProcessInfo( info->procid, &info->procinfo ) ) {
fillThreadCtl( hwnd, &info->procinfo, buf );
fillThreadInfo( hwnd, &info->procinfo );
} else {
action = AllocRCString( STR_REFRESH );
RCMessageBox( hwnd, STR_CANT_REFRESH_THRD, action,
MB_OK | MB_ICONEXCLAMATION );
FreeRCString( action );
}
break;
case THREAD_SUSPEND:
action = AllocRCString( STR_THREAD_SUSPEND );
if( thread == NULL ) {
RCsprintf( buf, STR_CANT_GET_HDL_4_THD_X, threadid );
MessageBox( hwnd, buf, action, MB_OK | MB_ICONEXCLAMATION );
} else {
susp_cnt = SuspendThread( thread->threadhdl );
if( susp_cnt == -1 ) {
RCsprintf( buf, STR_CANT_SUSPEND_THRD_X, threadid );
MessageBox( hwnd, buf, action, MB_ICONQUESTION | MB_OK );
} else if( susp_cnt > 0 ) {
RCsprintf( buf, STR_THREAD_ALREADY_SUSP,
threadid, susp_cnt );
index = MessageBox( hwnd, buf, action,
MB_ICONQUESTION | MB_YESNO );
if( index == IDNO ) {
ResumeThread( thread->threadhdl );
}
}
SendMessage( hwnd, WM_COMMAND, THREAD_REFRESH, 0L );
}
FreeRCString( action );
break;
case THREAD_RESUME:
action = AllocRCString( STR_RESUME );
if( thread == NULL ) {
RCsprintf( buf, STR_THREAD_NOT_RESUMED , threadid );
MessageBox( hwnd, buf, action, MB_OK | MB_ICONEXCLAMATION );
} else {
susp_cnt = ResumeThread( thread->threadhdl );
if( susp_cnt == -1 ) {
RCsprintf( buf, STR_CANT_RESUME_THRD_X, threadid );
MessageBox( hwnd, buf, action,
MB_ICONEXCLAMATION | MB_OK );
} else if( susp_cnt == 0 ) {
RCsprintf( buf, STR_THRD_IS_NOT_SUSP, threadid );
MessageBox( hwnd, buf, action,
MB_ICONEXCLAMATION | MB_OK );
} else if( susp_cnt > 1 ) {
RCsprintf( buf, STR_SUSP_COUNT_DECREMENTED,
threadid, susp_cnt );
MessageBox( hwnd, buf, action,
MB_ICONEXCLAMATION | MB_OK );
}
SendMessage( hwnd, WM_COMMAND, THREAD_REFRESH, 0L );
}
FreeRCString( action );
break;
case THREAD_KILL:
action = AllocRCString( STR_KILL );
if( thread == NULL ) {
RCsprintf( buf, STR_THRD_NOT_TERMINATED, threadid );
MessageBox( hwnd, buf, action, MB_OK | MB_ICONEXCLAMATION );
} else if( GetRetCode( hwnd, RETCD_THREAD, thread->threadid, &rc ) ) {
if( !TerminateThread( thread->threadhdl, rc ) ) {
RCsprintf( buf, STR_CANT_KILL_THRD_X, threadid );
MessageBox( hwnd, buf, action,
MB_OK | MB_ICONEXCLAMATION );
}
SendMessage( hwnd, WM_COMMAND, THREAD_REFRESH, 0L );
}
FreeRCString( action );
break;
case THREAD_SET_PRIORITY:
// {
// ThreadPriorityInfo prinfo;
//
// if( thread == NULL ) {
// sprintf( buf, "Unable to get a handle for thread %08X.\n",
// threadid );
// MessageBox( hwnd, buf, "Set Priority",
// MB_OK | MB_ICONEXCLAMATION );
// } else {
// prinfo.procid = info->procid;
// prinfo.thread = thread;
// prinfo.priority = GetThreadPriority( thread->threadhdl );
// prinfo.procinfo = &info->procinfo;
// DialogBoxParam( Instance, "THREAD_PRIORITY_DLG", hwnd,
// ThreadPriorityProc, (DWORD)&prinfo );
// fillThreadInfo( hwnd, &info->procinfo );
// }
// }
// break;
case THREAD_LIST:
if( HIWORD( wparam ) == LBN_SELCHANGE ) {
fillThreadInfo( hwnd, &info->procinfo );
}
break;
}
break;
case DR_TASK_LIST_CHANGE:
/* make sure this process still exists */
//here if( FindProcess( info->procid ) == NULL ) {
//here SendDlgItemMessage( hwnd, THREAD_LIST, LB_RESETCONTENT, 0, 0L );
//here enableChoices( hwnd, FALSE );
//here info->proc = NULL;
//here } else {
//here fillThreadCtl( hwnd, info->proc, buf );
//here }
break;
case WM_CLOSE:
EndDialog( hwnd, 0 );
break;
case WM_DESTROY:
MemFree( info );
ThreadDlg = NULL;
break;
default:
return( FALSE );
}
return( TRUE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -