You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
7.5 KiB
319 lines
7.5 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
wow.c
|
|
|
|
Abstract:
|
|
|
|
This module contains the WOW vdmdbg functions
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include <precomp.h>
|
|
#pragma hdrstop
|
|
|
|
typedef WORD HAND16;
|
|
|
|
#define SHAREWOW_MAIN
|
|
#include <vdmapi.h>
|
|
#include <vdm.h>
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// VDMKillWOW()
|
|
//
|
|
// Interface to kill the wow sub-system. This may not be needed and is
|
|
// certainly not needed now. We are going to look into fixing the
|
|
// debugging interface so this is not necessary.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL
|
|
WINAPI
|
|
VDMKillWOW(
|
|
VOID
|
|
) {
|
|
return( FALSE );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// VDMDetectWOW()
|
|
//
|
|
// Interface to detect whether the wow sub-system has already been started.
|
|
// This may not be needed and is certainly not needed now. We are going
|
|
// to look into fixing the debugging interface so this is not necessary.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL
|
|
WINAPI
|
|
VDMDetectWOW(
|
|
VOID
|
|
) {
|
|
return( FALSE );
|
|
}
|
|
|
|
|
|
INT
|
|
WINAPI
|
|
VDMEnumProcessWOW(
|
|
PROCESSENUMPROC fp,
|
|
LPARAM lparam
|
|
) {
|
|
SHAREDPROCESS SharedProcess[16];
|
|
LPSHAREDPROCESS lpsp;
|
|
INT count = 0;
|
|
BOOL fRet;
|
|
VDMINFO VdmInfo;
|
|
DWORD cbProcArray;
|
|
BOOL fRetry = FALSE;
|
|
|
|
|
|
RtlZeroMemory(&VdmInfo, sizeof(VDMINFO));
|
|
VdmInfo.iTask = 0;
|
|
VdmInfo.VDMState = ASKING_FOR_WOWPROCLIST;
|
|
VdmInfo.Enviornment = SharedProcess;
|
|
VdmInfo.EnviornmentSize = sizeof(SharedProcess);
|
|
|
|
cbProcArray = sizeof(SharedProcess);
|
|
|
|
VDMEnumProcessRetry:
|
|
|
|
if(GetNextVDMCommand(&VdmInfo)) {
|
|
|
|
if (cbProcArray < VdmInfo.EnviornmentSize &&
|
|
!fRetry)
|
|
{
|
|
lpsp = MALLOC(VdmInfo.EnviornmentSize);
|
|
if(!lpsp) {
|
|
return 0;
|
|
}
|
|
VdmInfo.Enviornment = lpsp;
|
|
cbProcArray = VdmInfo.EnviornmentSize;
|
|
fRetry = TRUE;
|
|
|
|
goto VDMEnumProcessRetry;
|
|
}
|
|
|
|
count = 0;
|
|
lpsp = (LPSHAREDPROCESS) VdmInfo.Enviornment;
|
|
|
|
cbProcArray = cbProcArray > VdmInfo.EnviornmentSize ? VdmInfo.EnviornmentSize : cbProcArray;
|
|
|
|
while (cbProcArray) {
|
|
cbProcArray -= sizeof(SHAREDPROCESS);
|
|
count++;
|
|
if ( fp ) {
|
|
fRet = (*fp)( lpsp->dwProcessId, lpsp->dwAttributes, lparam );
|
|
if ( fRet ) {
|
|
break;
|
|
}
|
|
}
|
|
lpsp++;
|
|
}
|
|
}
|
|
|
|
if (fRetry) {
|
|
FREE(VdmInfo.Enviornment);
|
|
}
|
|
|
|
return( count );
|
|
}
|
|
|
|
|
|
INT
|
|
WINAPI
|
|
VDMEnumTaskWOWWorker(
|
|
DWORD dwProcessId,
|
|
void * fp,
|
|
LPARAM lparam,
|
|
BOOL fEx
|
|
) {
|
|
SHAREDTASK SharedTask[16];
|
|
LPSHAREDTASK lpst;
|
|
INT count = 0;
|
|
BOOL fRet;
|
|
VDMINFO VdmInfo;
|
|
DWORD cbTaskArray;
|
|
BOOL fRetry = FALSE;
|
|
|
|
RtlZeroMemory(&VdmInfo, sizeof(VDMINFO));
|
|
|
|
VdmInfo.VDMState = ASKING_FOR_WOWTASKLIST;
|
|
VdmInfo.Enviornment = SharedTask;
|
|
VdmInfo.EnviornmentSize = sizeof(SharedTask);
|
|
VdmInfo.iTask = dwProcessId;
|
|
|
|
cbTaskArray = sizeof(SharedTask);
|
|
|
|
VDMEnumTaskRetry:
|
|
|
|
if(GetNextVDMCommand(&VdmInfo)) {
|
|
if(cbTaskArray < VdmInfo.EnviornmentSize &&
|
|
!fRetry)
|
|
{
|
|
lpst = MALLOC(VdmInfo.EnviornmentSize);
|
|
if(!lpst) {
|
|
return 0;
|
|
}
|
|
VdmInfo.Enviornment = lpst;
|
|
cbTaskArray = VdmInfo.EnviornmentSize;
|
|
fRetry = TRUE;
|
|
goto VDMEnumTaskRetry;
|
|
}
|
|
|
|
|
|
lpst = (LPSHAREDTASK) VdmInfo.Enviornment;
|
|
|
|
cbTaskArray = cbTaskArray > VdmInfo.EnviornmentSize ? VdmInfo.EnviornmentSize : cbTaskArray;
|
|
|
|
count = 0;
|
|
|
|
while(cbTaskArray) {
|
|
cbTaskArray -= sizeof(SHAREDTASK);
|
|
count++;
|
|
if ( fp && lpst->hMod16 ) {
|
|
if (fEx) {
|
|
fRet = ((TASKENUMPROCEX)fp)( lpst->dwThreadId, lpst->hMod16, lpst->hTask16,
|
|
lpst->szModName, lpst->szFilePath, lparam );
|
|
} else {
|
|
fRet = ((TASKENUMPROC)fp)( lpst->dwThreadId, lpst->hMod16, lpst->hTask16, lparam );
|
|
}
|
|
if ( fRet ) {
|
|
break;
|
|
}
|
|
}
|
|
lpst++;
|
|
}
|
|
}
|
|
|
|
if (fRetry) {
|
|
FREE(VdmInfo.Enviornment);
|
|
}
|
|
|
|
return( count );
|
|
}
|
|
|
|
|
|
INT
|
|
WINAPI
|
|
VDMEnumTaskWOW(
|
|
DWORD dwProcessId,
|
|
TASKENUMPROC fp,
|
|
LPARAM lparam
|
|
) {
|
|
return VDMEnumTaskWOWWorker(dwProcessId, (void *)fp, lparam, 0);
|
|
}
|
|
|
|
|
|
INT
|
|
WINAPI
|
|
VDMEnumTaskWOWEx(
|
|
DWORD dwProcessId,
|
|
TASKENUMPROCEX fp,
|
|
LPARAM lparam
|
|
) {
|
|
return VDMEnumTaskWOWWorker(dwProcessId, (void *)fp, lparam, 1);
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
VDMTerminateTaskWOW(
|
|
DWORD dwProcessId,
|
|
WORD htask
|
|
)
|
|
{
|
|
SHAREDPROCESS SharedProcess;
|
|
BOOL fRet = FALSE;
|
|
HANDLE hProcess;
|
|
HANDLE hRemoteThread;
|
|
DWORD dwThreadId;
|
|
VDMINFO VdmInfo;
|
|
|
|
RtlZeroMemory(&VdmInfo, sizeof(VDMINFO));
|
|
VdmInfo.iTask = dwProcessId;
|
|
VdmInfo.VDMState = ASKING_FOR_WOWPROCLIST;
|
|
VdmInfo.Enviornment = (LPVOID)&SharedProcess;
|
|
VdmInfo.EnviornmentSize = sizeof(SHAREDPROCESS);
|
|
|
|
if(GetNextVDMCommand(&VdmInfo)) {
|
|
|
|
//
|
|
// Get a handle to the process and start W32HungAppNotifyThread
|
|
// running with htask as the parameter.
|
|
//
|
|
|
|
hProcess = OpenProcess(
|
|
PROCESS_ALL_ACCESS,
|
|
FALSE,
|
|
SharedProcess.dwProcessId
|
|
);
|
|
|
|
if (hProcess) {
|
|
|
|
hRemoteThread = CreateRemoteThread(
|
|
hProcess,
|
|
NULL,
|
|
0,
|
|
SharedProcess.pfnW32HungAppNotifyThread,
|
|
(LPVOID) htask,
|
|
0,
|
|
&dwThreadId
|
|
);
|
|
|
|
if (hRemoteThread) {
|
|
fRet = TRUE;
|
|
CloseHandle(hRemoteThread);
|
|
}
|
|
|
|
CloseHandle(hProcess);
|
|
}
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
|
|
BOOL
|
|
VDMStartTaskInWOW(
|
|
DWORD pidTarget,
|
|
LPSTR lpCommandLine,
|
|
WORD wShow
|
|
)
|
|
{
|
|
HWND hwnd = NULL;
|
|
DWORD pid;
|
|
BOOL fRet;
|
|
|
|
do {
|
|
|
|
hwnd = FindWindowEx(NULL, hwnd, TEXT("WowExecClass"), NULL);
|
|
|
|
if (hwnd) {
|
|
|
|
pid = 0;
|
|
GetWindowThreadProcessId(hwnd, &pid);
|
|
}
|
|
|
|
} while (hwnd && pid != pidTarget);
|
|
|
|
|
|
if (hwnd && pid == pidTarget) {
|
|
|
|
#define WM_WOWEXEC_START_TASK (WM_USER+2)
|
|
PostMessage(hwnd, WM_WOWEXEC_START_TASK, GlobalAddAtom(lpCommandLine), wShow);
|
|
fRet = TRUE;
|
|
|
|
} else {
|
|
|
|
fRet = FALSE;
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
|