📄 flexptmi.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// This source code is licensed under Microsoft Shared Source License
// Version 1.0 for Windows CE.
// For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223.
//
/*++
Module Name:
flexptmi.cpp
Abstract:
Implement the Flexi-PTMI interface for Osaxs
Environment:
OsaxsH / OsaxsT
--*/
#include "osaxs_p.h"
/********** Descriptors */
BEGIN_FIELD_INFO_LIST (ProcessDesc)
FIELD_INFO (pfiProcessSlot, sizeof (BYTE), L"ProcSlot#", L"%u") //1
FIELD_INFO (pfiName, CCH_PROCNAME, L"Name", L"%s") //33
FIELD_INFO (pfiStartOfAddrSpace, sizeof (DWORD), L"VMBase", L"0x%08lX") //37
FIELD_INFO (pfiDefaultAccessKey, sizeof (ULONG), L"AccessKey", L"0x%08lX") //41
FIELD_INFO (pfiTrustLevel, sizeof (BYTE), L"TrustLevel", L"%N{0=None,1=Run,2=Full}") //42
FIELD_INFO (pfiHandle, sizeof (HANDLE), L"hProcess", L"0x%08lX") //46
FIELD_INFO (pfiBasePtr, sizeof (LPVOID), L"BasePtr", L"0x%08lX") //50
FIELD_INFO (pfiTlsUsageBitMaskL, sizeof (DWORD), L"TlsUseL32b", L"0x%08lX") //54
FIELD_INFO (pfiTlsUsageBitMaskH, sizeof (DWORD), L"TlsUseH32b", L"0x%08lX") //58
FIELD_INFO (pfiCurDbgZoneMasks, sizeof (ULONG), L"CurZoneMask", L"0x%08lX") //62
FIELD_INFO (pfiStructAddr, sizeof (LPVOID), L"pProcess", L"0x%08lX") //66
FIELD_INFO (pfiCmdLine, CCH_CMDLINE, L"CmdLine", L"%s") //194
END_FIELD_INFO_LIST ();
#pragma pack (push, 1)
struct FlexiProcess
{
BYTE bSlot;
char szName [CCH_PROCNAME];
DWORD dwVMBase;
DWORD dwAccessKey;
BYTE bTrustLevel;
DWORD dwHandle;
DWORD dwBasePtr;
DWORD dwTlsUseLow;
DWORD dwTlsUseHigh;
DWORD dwZoneMask;
DWORD dwAddr;
char szCommandLine [CCH_CMDLINE];
};
#pragma pack (pop)
BEGIN_FIELD_INFO_LIST (ThreadDesc)
FIELD_INFO (tfiStructAddr, sizeof (LPVOID), L"pThread", L"0x%08lX") //4
FIELD_INFO (tfiRunState, sizeof (WORD), L"RunState", L"%T{4=Dying,5=Dead,6=Buried,7=Slpg,39=Awak,0=Rung,1=Runab,2=RunBlkd,3=RunNeeds}") //6
FIELD_INFO (tfiInfo, sizeof (WORD), L"InfoStatus", L"%T{38=UMode,6=KMode,8=StkFlt,12=UsrBlkd,15=Profd}") //8
FIELD_INFO (tfiHandle, sizeof (HANDLE), L"hThread", L"0x%08lX") //12
FIELD_INFO (tfiWaitState, sizeof (BYTE), L"WaitState", L"%N{0=Signalled,1=Processing,2=Blocked}") //13
FIELD_INFO (tfiAddrSpaceAccessKey, sizeof (ACCESSKEY), L"AccessKey", L"0x%08lX") //17
FIELD_INFO (tfiHandleCurrentProcessRunIn, sizeof (HANDLE), L"hCurProcIn", L"0x%08lX") //21
FIELD_INFO (tfiHandleOwnerProc, sizeof (HANDLE), L"hOwnerProc", L"0x%08lX") //25
FIELD_INFO (tfiCurrentPriority, sizeof (BYTE), L"CurPrio", L"%u") //26
FIELD_INFO (tfiBasePriority, sizeof (BYTE), L"BasePrio", L"%u") //27
FIELD_INFO (tfiKernelTime, sizeof (DWORD), L"KernelTime", L"%lu") //31
FIELD_INFO (tfiUserTime, sizeof (DWORD), L"UserTime", L"%lu") //35
FIELD_INFO (tfiQuantum, sizeof (DWORD), L"Quantum", L"%lu") //39
FIELD_INFO (tfiQuantumLeft, sizeof (DWORD), L"QuantuLeft", L"%lu") //43
FIELD_INFO (tfiSleepCount, sizeof (DWORD), L"SleepCount", L"%lu") //47
FIELD_INFO (tfiSuspendCount, sizeof (BYTE), L"SuspendCount", L"%u") //48
FIELD_INFO (tfiTlsPtr, sizeof (LPDWORD), L"TlsPtr", L"0x%08lX") //52
FIELD_INFO (tfiLastError, sizeof (DWORD), L"LastError", L"0x%08lX") //56
FIELD_INFO (tfiStackBase, sizeof (DWORD), L"StackBase", L"0x%08lX") //60
FIELD_INFO (tfiStackLowBound, sizeof (DWORD), L"StkLowBnd", L"0x%08lX") //64
FIELD_INFO (tfiCreationTimeMSW, sizeof (DWORD), L"CreatTimeH", L"0x%08lX") //68
FIELD_INFO (tfiCreationTimeLSW, sizeof (DWORD), L"CreatTimeL", L"0x%08lX") //72
FIELD_INFO (tfiPC, sizeof (DWORD), L"PC", L"0x%08lX") //76
FIELD_INFO (tfiNcrPtr, sizeof (DWORD), L"NcrPtr", L"0x%08lX") //80
FIELD_INFO (tfiStkRetAddr, sizeof (DWORD), L"StkRetAddr", L"0x%08lX") //84
END_FIELD_INFO_LIST();
#pragma pack (push, 1)
struct FlexiThread
{
DWORD dwAddr;
WORD wRunState;
WORD wInfo;
DWORD dwHandle;
BYTE bWaitState;
DWORD dwAccessKey;
DWORD dwCurProcHandle;
DWORD dwOwnProcHandle;
BYTE bCurPrio;
BYTE bBasePrio;
DWORD dwKernelTime;
DWORD dwUserTime;
DWORD dwQuantum;
DWORD dwQuantumLeft;
DWORD dwSleepCount;
BYTE bSuspendCount;
DWORD dwTlsPtr;
DWORD dwLastError;
DWORD dwStackBase;
DWORD dwStackLowBound;
DWORD dwCreationTimeHi;
DWORD dwCreationTimeLo;
DWORD dwCurrentPC;
DWORD dwNcrPtr;
DWORD dwStkRetAddr;
};
#pragma pack (pop)
BEGIN_FIELD_INFO_LIST (ModuleDesc)
FIELD_INFO (mfiName, CCH_MODULENAME, L"Name", L"%s") //32
FIELD_INFO (mfiBasePointer, sizeof(DWORD), L"Base Ptr", L"0x%08lX") //36
FIELD_INFO (mfiModuleSize, sizeof(DWORD), L"Size", L"%lu") //40
FIELD_INFO (mfiRdWrDataStart, sizeof(DWORD), L"RW Data Start", L"0x%08lX") //44
FIELD_INFO (mfiRdWrDataEnd, sizeof(DWORD), L"RW Data End", L"0x%08lX") //48
FIELD_INFO (mfiTimeStamp, sizeof(DWORD), L"Timestamp", L"0x%08lX") //52
FIELD_INFO (mfiPdbFormat, sizeof(DWORD), L"PDB Format", L"%N{808534606=NB10,1396986706=RSDS}") //56
FIELD_INFO (mfiPdbGuid, sizeof(GUID), L"PDB Guid", L"%U") //72
FIELD_INFO (mfiPdbAge, sizeof(DWORD), L"PDB Age", L"%lu") //76
FIELD_INFO (mfiDllHandle, sizeof(DWORD), L"hDll", L"0x%08lX") //80
FIELD_INFO (mfiInUse, sizeof(DWORD), L"In Use", L"0x%08lX") //84
FIELD_INFO (mfiFlags, sizeof(WORD), L"Flags", L"%T{0=NoDllRef,1=Data,3=SearchPath,15=Kernel}") //86
FIELD_INFO (mfiTrustLevel, sizeof(BYTE), L"Trust Level", L"%d") //87
FIELD_INFO (mfiRefCount, CB_MODREFCNT, L"RefCount", L"") //151
FIELD_INFO (mfiStructAddr, sizeof(DWORD), L"Pointer", L"0x%08kX")
END_FIELD_INFO_LIST ();
#pragma pack (push, 1)
struct FlexiModule
{
char szModuleName [CCH_MODULENAME];
DWORD dwBasePointer;
DWORD dwModuleSize;
DWORD dwRdWrDataStart;
DWORD dwRdWrDataEnd;
DWORD dwTimeStamp;
DWORD dwPdbFormat;
GUID PdbGuid;
DWORD dwPdbAge;
DWORD dwDllHandle;
DWORD dwInUse;
WORD wFlags;
BYTE bTrustLevel;
WORD rgwRefCount [MAX_PROCESSES];
DWORD dwAddr;
};
#pragma pack (pop)
/*++
Routine Name:
WriteFieldInfo
Routine Description:
Dump field information to the output function
Arguments:
pRequest - User request
pbBuf - Beginning of response buffer
piBuf - Ptr to index of current position in response buffer.
cbBuf - Total size of the response buffer.
Return values:
S_OK : success,
E_FAIL : general failure,
E_OUTOFMEMORY : response buffer not big enough
--*/
HRESULT WriteFieldInfo (FLEXI_FIELD_INFO *pFields, const DWORD cFields,
DWORD &riOut, const DWORD cbOut, BYTE *pbOut)
{
HRESULT hr = S_OK;
DWORD i;
DWORD pNextStr;
DEBUGGERMSG (OXZONE_FLEXI, (L"++WriteFieldInfo: FieldCnt:%d, Offset:%d\r\n",
cFields, riOut));
pNextStr = riOut + CB_FIELDINFO * cFields;
DEBUGGERMSG (OXZONE_FLEXI, (L" WriteFieldInfo: Strings start at: %d\r\n", pNextStr));
for (i = 0; SUCCEEDED (hr) && i < cFields; i++)
{
hr = Write((DWORD)pFields[i].ul32Id, riOut, cbOut, pbOut);
if (SUCCEEDED (hr))
hr = Write((DWORD)pFields[i].ul32Size, riOut, cbOut, pbOut);
if (SUCCEEDED (hr))
{
hr = Write(pNextStr, riOut, cbOut, pbOut);
if (SUCCEEDED (hr))
pNextStr += sizeof(DWORD) + (kdbgwcslen(pFields[i].szLabel) + 1) * sizeof(WCHAR);
}
if (SUCCEEDED (hr))
{
hr = Write(pNextStr, riOut, cbOut, pbOut);
if (SUCCEEDED (hr))
pNextStr += sizeof(DWORD) + (kdbgwcslen(pFields[i].szFormat) + 1) * sizeof(WCHAR);
}
}
if (FAILED(hr))
{
DEBUGGERMSG(OXZONE_ALERT, (L" WriteFieldInfo: Failed to write structs: 0x%.08x\r\n", hr));
}
if (SUCCEEDED(hr))
{
for (i = 0; SUCCEEDED (hr) && i < cFields; i++)
{
DWORD sizeLabel = kdbgwcslen(pFields[i].szLabel) * sizeof(WCHAR);
hr = Write(sizeLabel, riOut, cbOut, pbOut);
if (SUCCEEDED(hr))
hr = Write(pFields[i].szLabel,
sizeLabel + (sizeof (WCHAR) * 1),
riOut, cbOut, pbOut);
DWORD sizeFormat = kdbgwcslen(pFields[i].szFormat) * sizeof(WCHAR);
if (SUCCEEDED(hr))
hr = Write(sizeFormat, riOut, cbOut, pbOut);
if (SUCCEEDED (hr))
hr = Write(pFields[i].szFormat,
sizeFormat + (sizeof (WCHAR) * 1),
riOut, cbOut, pbOut);
}
}
if (FAILED(hr))
{
DEBUGGERMSG(OXZONE_ALERT, (L" WriteFieldInfo: Failed to write strings: 0x%.08x\r\n", hr));
}
DEBUGGERMSG (OXZONE_FLEXI || FAILED (hr), (L"--WriteFieldInfo: 0x%.08x, Offset:%d\r\n", hr, riOut));
return hr;
}
//
// Flexi Process Data
//
static HRESULT WriteProcessData (PROCESS *pProc, DWORD &riOut, const DWORD cbOut, BYTE *pbOut)
{
FlexiProcess proc = {0};
proc.bSlot = pProc->procnum;
if (pProc->lpszProcName)
{
DEBUGGERMSG (OXZONE_FLEXI, (L" WriteProcessData: Proc Name Addr:0x%.08x\r\n",
pProc->lpszProcName));
__try
{
WideToAnsi (pProc->lpszProcName, proc.szName, CCH_PROCNAME);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
strcpy (proc.szName, "Unknown");
}
}
else
strcpy (proc.szName, "Unknown");
DEBUGGERMSG (OXZONE_FLEXI, (L" WriteProcessData: Name = %a\r\n", proc.szName));
proc.dwVMBase = pProc->dwVMBase;
proc.dwAccessKey = pProc->aky;
proc.bTrustLevel = pProc->bTrustLevel;
proc.dwHandle = reinterpret_cast <DWORD> (pProc->hProc);
proc.dwBasePtr = reinterpret_cast <DWORD> (pProc->BasePtr);
proc.dwTlsUseLow = pProc->tlsLowUsed;
proc.dwTlsUseHigh = pProc->tlsHighUsed;
if (pProc->ZonePtr)
{
__try
{
proc.dwZoneMask = pProc->ZonePtr->ulZoneMask;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
proc.dwZoneMask = 0;
}
}
proc.dwAddr = reinterpret_cast <DWORD> (pProc);
if (pProc->pcmdline)
{
__try
{
WideToAnsi (pProc->pcmdline, proc.szCommandLine, CCH_CMDLINE);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
strcpy (proc.szCommandLine, "Unknown");
}
}
else
strcpy (proc.szCommandLine, "Unknown");
HRESULT hr = Write (&proc, sizeof (proc), riOut, cbOut, pbOut);
DEBUGGERMSG (OXZONE_FLEXI || FAILED (hr), (L"--WriteProcessData: hr=0x%08x\r\n", hr));
return hr;
}
static HRESULT MarshalOneProcess (FLEXI_REQUEST *pRequest, DWORD &riOut, const DWORD cbOut, BYTE *pbOut)
{
HRESULT hr = S_OK;
DEBUGGERMSG (OXZONE_FLEXI, (L"++MarshalOneProcess\r\n"));
if (pRequest->dwRequest & FLEXI_FILTER_PROCESS_POINTER)
{
PPROCESS pProcess = reinterpret_cast <PPROCESS> (pRequest->dwHProc);
PPROCESS pProcArray = FetchProcArray ();
if (pProcess >= pProcArray && pProcess < &pProcArray [MAX_PROCESSES])
{
hr = WriteProcessData (pProcess, riOut, cbOut, pbOut);
}
else
{
DBGRETAILMSG (OXZONE_ALERT, (L"!!MarshalOneProcess: BAD PROCESS ADDRESS 0x%08x\r\n", pProcess));
hr = E_FAIL;
}
}
else
hr = E_FAIL;
DEBUGGERMSG (OXZONE_FLEXI || FAILED (hr), (L"--MarshalOneProcess: hr=0x%08x\r\n", hr));
return hr;
}
static HRESULT MarshalProcessData (FLEXI_REQUEST *pRequest, DWORD &riOut,
const DWORD cbOut, BYTE *pbOut, DWORD *pcElements)
{
HRESULT hr = S_OK;
PROCESS *pProcArray;
DWORD i;
DEBUGGERMSG (OXZONE_FLEXI, (L"++MarshalProcessData: Offset:%d\r\n", riOut));
pProcArray = FetchProcArray();
if (!pProcArray)
hr = E_FAIL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -