📄 dbg.c
字号:
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];
// 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
kdbgWtoAmax (pProc->lpszProcName, szProcName, sizeof (szProcName) - 1);
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
ZoneMask = pProc->ZonePtr ? pProc->ZonePtr->ulZoneMask : 0;
AppendObjToOutBuf_M (OutBuf, ZoneMask, *pOutBufIndex); // pfiCurDbgZoneMasks
AppendObjToOutBuf_M (OutBuf, pProc, *pOutBufIndex); // pfiStructAddr
kdbgWtoAmax ((LPWSTR) pProc->pcmdline, szProcCmdline, sizeof (szProcCmdline) - 1);
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
static BOOL sprintf_temp(
PCHAR pOutBuf,
PUSHORT pOutBufIndex,
PUSHORT pMaxBytes,
LPWSTR lpszFmt,
...
)
{
WCHAR szTempString[256];
WORD wLen;
//
// Write to a temporary string
//
NKwvsprintfW(szTempString, lpszFmt,
(LPVOID) ( ((DWORD)&lpszFmt) + sizeof(lpszFmt) ),
sizeof(szTempString) / sizeof(WCHAR));
wLen = (WORD) kdbgwcslen(szTempString);
if (*pMaxBytes < wLen) {
// Not enough space
return FALSE;
}
//
// Convert to ASCII and write it to the output buffer
//
kdbgWtoA( szTempString, (CHAR*) &(pOutBuf[*pOutBufIndex]) );
//
// Don't include the NULL. Instead manually update index to include null at
// the very end.
//
*pOutBufIndex += wLen;
*pMaxBytes -= wLen;
return TRUE;
}
/*++
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)\r\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\r\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\r\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)\r\n"), lpCrit->lpcs, pOwnerThread);
break;
}
case HT_EVENT : {
LPEVENT lpEvent = (LPEVENT) pProxy->pObject;
// sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT("\t\thEvent 0x%08X (name : %s)\r\n"), lpEvent->hNext, lpEvent->name->name ? lpEvent->name->name : TEXT("none"));
sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT("\t\thEvent 0x%08X\r\n"), lpEvent->hNext);
break;
}
default : {
sprintf_temp(OutBuf, pOutBufIndex, &nMaxBytes, TEXT("\t\tUnknown object type %d (0x%08X)\r\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:
GetNumberOfThreadsAttachedToProc
Routine Description:
Calculate the total number of thread(s) attached to the given process
Arguments:
ProcessOrdNum - Supplies Process Info ordinal number / Index
Return Value:
Total number of thread(s) attached to this process.
--*/
DWORD GetNumberOfThreadsAttachedToProc (IN DWORD ProcessOrdNum)
{
PTHREAD pThread;
DWORD ThreadNum = 0;
pThread = kdProcArray [ProcessOrdNum].pTh; // Get process main thread
while (pThread)
{ // walk list of threads attached to process
pThread = pThread->pNextInProc;
ThreadNum++;
}
return ThreadNum;
} // End of GetNumberOfThreadsAttachedToProc
/*++
Routine Name:
MarshalThreadInfoData
Routine Description:
Copy Thread 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
ThreadOrdNum - Supplies Thread 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 MarshalThreadInfoData (IN OUT PCHAR OutBuf,
IN OUT PUSHORT pOutBufIndex,
IN DWORD ProcessOrdNum,
IN DWORD ThreadOrdNum,
IN USHORT NbMaxOutByte)
{
PTHREAD pThread;
USHORT FieldIdx;
USHORT FieldSize = 0;
WORD ThreadState;
WORD ThreadInfo;
BOOL Result;
pThread = kdProcArray [ProcessOrdNum].pTh; // Get process main thread (this is index 0)
while (ThreadOrdNum--)
{ // walk list of threads attached to process (until we reach the index ThreadOrdNum)
pThread = pThread->pNextInProc;
}
// FieldSize = SUM (ThreadDescriptorTable [0..THREAD_DESC_NB_FIELDS[.wSize)
for (FieldIdx = 0; FieldIdx < THREAD_DESC_NB_FIELDS; FieldIdx++)
{
FieldSize += ThreadDescriptorTable [FieldIdx].wSize;
}
if (FieldSize <= NbMaxOutByte)
{ // Remaining buffer large enough for all thread fields
/////////////////////////////////////////
// Insert Thread Info Data fields now: //
/////////////////////////////////////////
AppendObjToOutBuf_M (OutBuf, pThread, *pOutBufIndex); // tfiStructAddr
ThreadState = (WORD)((pThread->wInfo & ((1<<DYING_SHIFT)|(1<<DEAD_SHIFT)|(1<<BURIED_SHIFT)|(1<<SLEEPING_SHIFT))) << 2) + (1 << GET_RUNSTATE (pThread));
AppendObjToOutBuf_M (OutBuf, ThreadState, *pOutBufIndex); // tfiRunState
ThreadInfo = (WORD)(pThread->wInfo & ((1<<TIMEMODE_SHIFT)|(1<<STACKFAULT_SHIFT)|(1<<USERBLOCK_SHIFT)|(1<<PROFILE_SHIFT)));
AppendObjToOutBuf_M (OutBuf, ThreadInfo, *pOutBufIndex); // tfiInfo
AppendObjToOutBuf_M (OutBuf, pThread->hTh, *pOutBufIndex); // tfiHandle
AppendObjToOutBuf_M (OutBuf, pThread->bWaitState, *pOutBufIndex); // tfiWaitState
AppendObjToOutBuf_M (OutBuf, pThread->aky, *pOutBufIndex); // tfiAddrSpaceAccessKey
AppendObjToOutBuf_M (OutBuf, pThread->pProc->hProc, *pOutBufIndex); // tfiHandleCurrentProcessRunIn
AppendObjToOutBuf_M (OutBuf, pThread->pOwnerProc->hProc, *pOutBufIndex); // tfiHandleOwnerProc
AppendObjToOutBuf_M (OutBuf, pThread->bCPrio, *pOutBufIndex); // tfiCurrentPriority
AppendObjToOutBuf_M (OutBuf, pThread->bBPrio, *pOutBufIndex); // tfiBasePriority
AppendObjToOutBuf_M (OutBuf, pThread->dwKernTime, *pOutBufIndex); // tfiKernelTime
AppendObjToOutBuf_M (OutBuf, pThread->dwUserTime, *pOutBufIndex); // tfiUserTime
AppendObjToOutBuf_M (OutBuf, pThread->dwQuantum, *pOutBufIndex); // tfiQuantum
AppendObjToOutBuf_M (OutBuf, pThread->dwQuantLeft, *pOutBufIndex); // tfiQuantumLeft
AppendObjToOutBuf_M (OutBuf, pThread->dwSleepCnt, *pOutBufIndex); // tfiSleepCount
AppendObjToOutBuf_M (OutBuf, pThread->bSuspendCnt, *pOutBufIndex); // tfiSuspendCount
AppendObjToOutBuf_M (OutBuf, pThread->tlsPtr, *pOutBufIndex); // tfiTlsPtr
AppendObjToOutBuf_M (OutBuf, pThread->dwLastError, *pOutBufIndex); // tfiLastError
AppendObjToOutBuf_M (OutBuf, pThread->dwStackBase, *pOutBufIndex); // tfiStackBase
AppendObjToOutBuf_M (OutBuf, pThread->dwStackBound, *pOutBufIndex); // tfiStackLowBound
AppendObjToOutBuf_M (OutBuf, pThread->ftCreate.dwHighDateTime, *pOutBufIndex); // tfiCreationTimeMSW
AppendObjToOutBuf_M (OutBuf, pThread->ftCreate.dwLowDateTime, *pOutBufIndex); // tfiCreationTimeLSW
Result = TRUE;
}
else
{ // Buffer not large enough: exit with error
Result = FALSE;
}
return Result;
} // End of MarshalThreadInfoData
// Tags:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -