📄 dbg.c
字号:
"LastError",
"0x%08lX"
},
{
tfiStackBase,
sizeof (DWORD),
"StackBase",
"0x%08lX"
},
{
tfiStackLowBound,
sizeof (DWORD),
"StkLowBnd",
"0x%08lX"
},
{
tfiCreationTimeMSW,
sizeof (DWORD),
"CreatTimeH",
"0x%08lX"
},
{
tfiCreationTimeLSW,
sizeof (DWORD),
"CreatTimeL",
"0x%08lX"
},
{
tfiPC,
sizeof (DWORD),
"PC",
"0x%08lX"
}
};
#define PROC_DESC_NB_FIELDS (sizeof (ProcessDescriptorTable) / sizeof (PROC_THREAD_INFO_FIELD))
#define THREAD_DESC_NB_FIELDS (sizeof (ThreadDescriptorTable) / sizeof (PROC_THREAD_INFO_FIELD))
#define AppendImmByteToOutBuf_M(outbuf,immbyte,outbidx) {(outbuf) [(outbidx)++] = (immbyte);}
#define AppendObjToOutBuf_M(outbuf,obj,outbidx) {memcpy (&((outbuf) [(outbidx)]), &(obj), sizeof (obj)); (outbidx) += sizeof (obj);}
#define AppendStringZToOutBuf_M(outbuf,sz,outbidx) {memcpy (&((outbuf) [(outbidx)]), sz, (strlen (sz) + 1)); (outbidx) += (strlen (sz) + 1);}
#define AppendErrorToOutBuf_M(outbuf,err,outbidx,len) AppendErrorToOutBuf(outbuf, &outbidx, len, err)
void AppendErrorToOutBuf(LPSTR pszOutBuf, UINT *pnOutIndex, UINT nLen, NTSTATUS status)
{
// Normalize buffer/length to skip block
pszOutBuf += *pnOutIndex;
nLen -= *pnOutIndex;
switch(status)
{
case STATUS_ACCESS_VIOLATION:
strncpy(pszOutBuf, "ERROR: Access Violation", nLen);
pszOutBuf[nLen - 1] = '\0';
break;
case STATUS_DATATYPE_MISALIGNMENT:
strncpy(pszOutBuf, "ERROR: Datatype Misalignment", nLen);
pszOutBuf[nLen - 1] = '\0';
break;
case STATUS_INVALID_PARAMETER:
strncpy(pszOutBuf, "ERROR: Invalid Parameter", nLen);
pszOutBuf[nLen - 1] = '\0';
break;
case STATUS_BUFFER_TOO_SMALL:
strncpy(pszOutBuf, "ERROR: Buffer too small", nLen);
pszOutBuf[nLen - 1] = '\0';
break;
case STATUS_INTERNAL_ERROR:
strncpy(pszOutBuf, "ERROR: Internal error. Check COM1 debug output", nLen);
pszOutBuf[nLen - 1] = '\0';
break;
default:
snprintf(pszOutBuf, nLen, L"ERROR: Unknown Error (%08lX)", status);
break;
}
// Update buffer index
*pnOutIndex += strlen(pszOutBuf);
}
/*++
Routine Name:
MarshalDescriptionTable
Routine Description:
Copy (Process or Thread Info) Description Table in output buffer
Arguments:
OutBuf - Supplies and returns pointer to output buffer
pOutBufIndex - Supplies and returns pointer to output buffer index
DescTable - Supplies (Process or Thread Info) description table
TblSize - Supplies number of elements in the description table
NbMaxOutByte - Supplies maximum number of bytes that can be written in output buffer
Return Value:
TRUE if succeed (size OK) otherwise FALSE.
--*/
BOOL MarshalDescriptionTable (IN OUT PCHAR OutBuf,
IN OUT PUSHORT pOutBufIndex,
IN PROC_THREAD_INFO_FIELD DescTable [],
IN USHORT TblSize,
IN USHORT NbMaxOutByte)
{
USHORT FieldIdx;
USHORT FieldDescSize;
for (FieldIdx = 0; FieldIdx < TblSize; FieldIdx++)
{
FieldDescSize = sizeof (DescTable [FieldIdx].wIdentifier) +
sizeof (DescTable [FieldIdx].wSize) +
strlen (DescTable [FieldIdx].szLabel) +
strlen (DescTable [FieldIdx].szFormat);
if (FieldDescSize <= NbMaxOutByte)
{ // Remaining buffer large enough for next field
AppendObjToOutBuf_M (OutBuf, DescTable [FieldIdx].wIdentifier, *pOutBufIndex);
AppendObjToOutBuf_M (OutBuf, DescTable [FieldIdx].wSize, *pOutBufIndex);
AppendStringZToOutBuf_M (OutBuf, DescTable [FieldIdx].szLabel, *pOutBufIndex);
AppendStringZToOutBuf_M (OutBuf, DescTable [FieldIdx].szFormat, *pOutBufIndex);
}
else
{ // Buffer not large enough: exit with error
return FALSE;
}
NbMaxOutByte -= FieldDescSize;
}
return TRUE;
} // End of MarshalDescriptionTable
/*++
Routine Name:
MarshalProcessInfoData
Routine Description:
Copy Process Info Data in output buffer
Arguments:
OutBuf - Supplies and returns pointer to output buffer
pOutBufIndex - Supplies and returns pointer to output buffer index
ProcessOrdNum - Supplies Process Info ordinal number / Index
NbMaxOutByte - Supplies maximum number of bytes that can be written in output buffer
Return Value:
TRUE if succeed (size OK) otherwise FALSE.
--*/
BOOL MarshalProcessInfoData ( IN OUT PCHAR OutBuf,
IN OUT PUSHORT pOutBufIndex,
IN DWORD ProcessOrdNum,
IN USHORT NbMaxOutByte)
{
USHORT FieldIdx;
USHORT FieldSize = 0;
PPROCESS pProc = &(kdProcArray [ProcessOrdNum]);
ULONG ZoneMask;
BOOL Result;
CHAR szProcName [32];
CHAR szProcCmdline [128];
static const CHAR pszUnk[] = "Unknown";
// FieldSize = SUM (ProcessDescriptorTable [0..PROC_DESC_NB_FIELDS[.wSize)
for (FieldIdx = 0; FieldIdx < PROC_DESC_NB_FIELDS; FieldIdx++)
{
FieldSize += ProcessDescriptorTable [FieldIdx].wSize;
}
if (FieldSize <= NbMaxOutByte)
{ // Remaining buffer large enough for all process fields
//////////////////////////////////////////
// Insert Process Info Data fields now: //
//////////////////////////////////////////
AppendObjToOutBuf_M (OutBuf, pProc->procnum, *pOutBufIndex); // pfiProcessSlot
if (pProc->lpszProcName)
{
__try
{
kdbgWtoAmax (pProc->lpszProcName, szProcName, sizeof (szProcName) - 1);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
memcpy(szProcName, pszUnk, sizeof(pszUnk));
}
}
else
{
memcpy(szProcName, pszUnk, sizeof(pszUnk));
}
szProcName [sizeof (szProcName) - 1] = 0;
AppendObjToOutBuf_M (OutBuf, szProcName, *pOutBufIndex); // pfiName
AppendObjToOutBuf_M (OutBuf, pProc->dwVMBase, *pOutBufIndex); // pfiStartOfAddrSpace
AppendObjToOutBuf_M (OutBuf, pProc->aky, *pOutBufIndex); // pfiDefaultAccessKey
AppendObjToOutBuf_M (OutBuf, pProc->bTrustLevel, *pOutBufIndex); // pfiTrustLevel
AppendObjToOutBuf_M (OutBuf, pProc->hProc, *pOutBufIndex); // pfiHandle
AppendObjToOutBuf_M (OutBuf, pProc->BasePtr, *pOutBufIndex); // pfiBasePtr
AppendObjToOutBuf_M (OutBuf, pProc->tlsLowUsed, *pOutBufIndex); // pfiTlsUsageBitMaskL
AppendObjToOutBuf_M (OutBuf, pProc->tlsHighUsed, *pOutBufIndex); // pfiTlsUsageBitMaskH
if (pProc->ZonePtr)
{
__try
{
ZoneMask = pProc->ZonePtr->ulZoneMask;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
ZoneMask = 0;
}
}
else
{
ZoneMask = 0;
}
AppendObjToOutBuf_M (OutBuf, ZoneMask, *pOutBufIndex); // pfiCurDbgZoneMasks
AppendObjToOutBuf_M (OutBuf, pProc, *pOutBufIndex); // pfiStructAddr
if (pProc->pcmdline)
{
__try
{
kdbgWtoAmax ((LPWSTR) pProc->pcmdline, szProcCmdline, sizeof (szProcCmdline) - 1);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
memcpy(szProcCmdline, pszUnk, sizeof(pszUnk));
}
}
else
{
memcpy(szProcCmdline, pszUnk, sizeof(pszUnk));
}
szProcCmdline [sizeof (szProcCmdline) - 1] = 0;
AppendObjToOutBuf_M (OutBuf, szProcCmdline, *pOutBufIndex); // pfiCmdLine
Result = TRUE;
}
else
{ // Buffer not large enough: exit with error
Result = FALSE;
}
return Result;
} // End of MarshalProcessInfoData
/*++
Routine Name:
MarshalCriticalSectionInfo
Routine Description:
Copy Critical Section Info in output buffer
Arguments:
OutBuf - Supplies and returns pointer to output buffer
pOutBufIndex - Supplies and returns pointer to output buffer index
NbMaxOutByte - Supplies maximum number of bytes that can be written in output buffer
Return Value:
TRUE if succeed (size OK) otherwise FALSE.
--*/
BOOL
MarshalCriticalSectionInfo (
IN OUT PCHAR OutBuf,
IN OUT PUSHORT pOutBufIndex,
IN USHORT nMaxBytes
)
{
// USHORT FieldIdx;
// USHORT FieldSize = 0;
PPROCESS pProc;
DWORD nProc; //, nThread;
PTHREAD pThread;
DWORD ThreadNum = 0;
LPPROXY pProxy;
// ULONG ZoneMask;
// BOOL Result;
// CHAR szProcName [32];
sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT("Critical Section Info (shows synchronization object status)\n"));
for (nProc = 0; nProc < MAX_PROCESSES; nProc++) {
pProc = &(kdProcArray[nProc]);
if (!pProc->dwVMBase) {
// No process in this slot
continue;
}
sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT(" pProcess : 0x%08X %s\n"), pProc, pProc->lpszProcName);
pThread = pProc->pTh; // Get process main thread
ThreadNum = 1;
while (pThread)
{ // walk list of threads attached to process (until we reach the index ThreadOrdNum)
sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT("\tpThread 0x%08X\n"), pThread);
pProxy = pThread->lpProxy;
if (pProxy) {
while (pProxy) {
switch(pProxy->bType) {
case HT_CRITSEC : {
LPCRIT lpCrit = (LPCRIT) pProxy->pObject;
PTHREAD pOwnerThread = HandleToThread(lpCrit->lpcs->OwnerThread);
sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT("\t\tpCritSect 0x%08X (pOwner 0x%X)\n"), lpCrit->lpcs, pOwnerThread);
break;
}
case HT_EVENT : {
LPEVENT lpEvent = (LPEVENT) pProxy->pObject;
sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT("\t\thEvent 0x%08X\n"), lpEvent->hNext);
break;
}
default : {
sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT("\t\tUnknown object type %d (0x%08X)\n"), pProxy->bType, pProxy->pObject);
break;
}
}
pProxy = pProxy->pThLinkNext;
}
} else {
// Not blocked
}
pThread = pThread->pNextInProc;
ThreadNum++;
}
}
// Include the NULL
(*pOutBufIndex)++;
return TRUE;
} // End of MarshalCriticalSectionInfo
/*++
Routine Name:
MarshalIOReadWrite
Routine Description:
Copy Critical Section Info in output buffer
Arguments:
OutBuf - Supplies and returns pointer to output buffer
pOutBufIndex - Supplies and returns pointer to output buffer index
nMaxBytes - Supplies maximum number of bytes that can be written in output buffer
fIORead - TRUE indicate Read otherwise Write
dwAddress - Address to read /write
dwSize - Size to read /write
dwData - Data to write
Return Value:
TRUE if succeed (size OK) otherwise FALSE.
--*/
BOOL
MarshalIOReadWrite (
IN OUT PCHAR OutBuf,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -