// // thread.cpp // #include "private.h" #include "tlhelp32.h" #include "osver.h" #include "thdutil.h" #include "vdmdbg.h" #include "immxutil.h" //+--------------------------------------------------------------------------- // // Is16bit() // //---------------------------------------------------------------------------- typedef INT (*VDMENUMTASKWOW)(DWORD dwProcessId, TASKENUMPROC fp, LPARAM lParam); typedef struct tag_MYENUMWOW { DWORD dwThreadId; BOOL bRet; } MYENUMWOW; BOOL TaskEnumProc(DWORD dwThreadId, WORD hMod16, WORD hTask16, LPARAM lParam ) { MYENUMWOW *pewow = (MYENUMWOW *)lParam; if (pewow->dwThreadId == dwThreadId) { pewow->bRet = TRUE; return TRUE; } return FALSE; } BOOL NTIs16bit(DWORD dwProcessId, DWORD dwThreadId) { static VDMENUMTASKWOW fpEnumTask = NULL; MYENUMWOW ewow; if (!fpEnumTask) { HINSTANCE hMod = LoadSystemLibrary("vdmdbg.dll"); fpEnumTask = (VDMENUMTASKWOW)GetProcAddress(hMod, "VDMEnumTaskWOW"); if (!fpEnumTask) return FALSE; } ewow.dwThreadId = dwThreadId; ewow.bRet = FALSE; fpEnumTask(dwProcessId, TaskEnumProc, (LPARAM)&ewow); return ewow.bRet; } BOOL Is16bitThread(DWORD dwProcessId, DWORD dwThreadId) { if (IsOnNT51()) { GUITHREADINFO guiti; guiti.cbSize = sizeof(GUITHREADINFO); if (GetGUIThreadInfo(dwThreadId, &guiti)) { return (guiti.flags & GUI_16BITTASK) ? TRUE : FALSE; } } else if (IsOnNT()) { return NTIs16bit(dwProcessId, dwThreadId); } else { // Win9xEnumProcess(Win9xEnumProcessProc, NULL); // not implemented yet. Assert(0); } return FALSE; }