Leaked source code of windows server 2003
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

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