2025-04-27 07:49:33 -04:00

80 lines
1.8 KiB
C++

//
// 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;
}