📄 debdebug.c
字号:
// FUNCTION : InitProcessNodeInfo( PDEB_PROCESS_NODE_INFO*, LPDEBUG_EVENT )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
InitProcessNodeInfo( PDEB_PROCESS_NODE_INFO* ppProcessNodeInfo, LPDEBUG_EVENT lpDebugEvent )
{
//-- init info data
(*ppProcessNodeInfo)->dwProcessId = lpDebugEvent->dwProcessId;
(*ppProcessNodeInfo)->dwThreadId = lpDebugEvent->dwThreadId;
// Note:pThreadList initialized via previous CreateThreadList() call
// Note:pDllList initialized via previous CreateDllList() call
(*ppProcessNodeInfo)->ProcessDebugInfo = lpDebugEvent->u.CreateProcessInfo;
return( TRUE );
}
// ************************************************************************
// FUNCTION : InsertProcessNode( PLIST, PNODE )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
InsertProcessNode( PLIST pProcessList, PNODE pProcessNode )
{
PDEB_PROCESS_LIST_INFO pProcessListInfo = pProcessList->pListData;
//-- insert the node
InsertNode( pProcessList, pProcessNode );
//-- increment dwActiveProcesss
pProcessListInfo->dwActiveProcesses++;
return( TRUE );
}
// ************************************************************************
// FUNCTION : SetCurrentProcessNode( PLIST, PNODE )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
SetCurrentProcessNode( PLIST pProcessList, PNODE pProcessNode )
{
SetCurrentNode( pProcessList, pProcessNode, pProcessList->OrderFunction );
return( TRUE );
}
// ************************************************************************
// FUNCTION : DeleteProcessNode( PLIST, PNODE )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
DeleteProcessNode( PLIST pProcessList, PNODE pProcessNode )
{
PNODE pDeleteNode;
SetCurrentNode( pProcessList, pProcessNode, pProcessList->OrderFunction );
GetCurrentNode( pProcessList, &pDeleteNode );
DeleteCurrentProcessNode( pProcessList );
return( TRUE );
}
// ************************************************************************
// FUNCTION : FreeProcessNodeInfo( PNODE )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
FreeProcessNodeInfo( PNODE pProcessNode )
{
PDEB_PROCESS_NODE_INFO pProcessNodeInfo = (PDEB_PROCESS_NODE_INFO) pProcessNode->pNodeData;
//-- free info data
DestroyDllList( pProcessNodeInfo->pDllList );
DestroyThreadList( pProcessNodeInfo->pThreadList );
HeapFree( hHeap, (DWORD) NULL, (PVOID) pProcessNodeInfo->lpstrPathName );
HeapFree( hHeap, (DWORD) NULL, (PVOID) pProcessNodeInfo->lpstrFileName );
HeapFree( hHeap, (DWORD) NULL, (PVOID) pProcessNodeInfo );
return( TRUE );
}
// ************************************************************************
// FUNCTION : DestroyProcessNode( PNODE )
// PURPOSE :
// COMMENTS : Frees all memory associated with the node.
// ************************************************************************
BOOL
DestroyProcessNode( PNODE pProcessNode )
{
//-- free info data
FreeProcessNodeInfo( pProcessNode );
//-- destroy node
DestroyNode( pProcessNode );
return( TRUE );
}
// ************************************************************************
// FUNCTION : DeleteCurrentProcessNode( PLIST )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
DeleteCurrentProcessNode( PLIST pProcessList )
{
PDEB_PROCESS_LIST_INFO pProcessListInfo = pProcessList->pListData;
PNODE pProcessNode = (PNODE) pProcessList->pCurrentNode;
//-- free info data
FreeProcessNodeInfo( pProcessNode );
//-- delete and destroy node
DeleteCurrentNode( pProcessList );
//-- decrement dwActiveProcesss
pProcessListInfo->dwActiveProcesses--;
return( TRUE );
}
// ------------------------------------------------------------------------
// Thread list and node specific linked list wrapper functions
// ------------------------------------------------------------------------
// ************************************************************************
// FUNCTION : ThreadOrderFunction( PNODE, PNODE );
// PURPOSE : Provides the sorting/search logic for the double linked
// list package.
// COMMENTS :
// Sorted by thread ID value
// ************************************************************************
int
ThreadOrderFunction( PNODE pNode1, PNODE pNode2 )
{
PDEB_THREAD_NODE_INFO pThreadNodeInfo1 = pNode1->pNodeData;
PDEB_THREAD_NODE_INFO pThreadNodeInfo2 = pNode2->pNodeData;
if( pThreadNodeInfo1->dwThreadId < pThreadNodeInfo2->dwThreadId )
return( LIST_LEFT_OF );
if( pThreadNodeInfo1->dwThreadId > pThreadNodeInfo2->dwThreadId )
return( LIST_RIGHT_OF );
return( LIST_MATCH );
}
// ************************************************************************
// FUNCTION : CreateThreadList( PLIST* )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
CreateThreadList( PLIST* ppThreadList )
{
PDEB_THREAD_LIST_INFO pThreadListInfo;
//-- create list
CreateList( ppThreadList, ThreadOrderFunction );
//-- alloc info data
pThreadListInfo = (PDEB_THREAD_LIST_INFO) HeapAlloc( hHeap, (DWORD) NULL,
sizeof( DEB_THREAD_LIST_INFO ) );
(*ppThreadList)->pListData = pThreadListInfo;
//-- init info data
pThreadListInfo->dwActiveThreads = 0;
return( TRUE );
}
// ************************************************************************
// FUNCTION : DestroyThreadList( PLIST )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
DestroyThreadList( PLIST pThreadList )
{
PDEB_THREAD_LIST_INFO pThreadListInfo = pThreadList->pListData;
PNODE pDeleteNode;
//-- make sure all nodes are removed first
while( pThreadListInfo->dwActiveThreads ) {
GetCurrentNode( pThreadList, &pDeleteNode );
DeleteCurrentThreadNode( pThreadList );
}
//-- free info data
HeapFree( hHeap, (DWORD) NULL, (PVOID) pThreadListInfo );
//-- destroy list
DestroyList( pThreadList );
return( TRUE );
}
// ************************************************************************
// FUNCTION : AllocThreadNode( PNODE*, PDEB_THREAD_NODE_INFO* )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
AllocThreadNode( PNODE* ppThreadNode, PDEB_THREAD_NODE_INFO* ppThreadNodeInfo )
{
//-- create node
CreateNode( ppThreadNode );
//-- alloc info data
*ppThreadNodeInfo = (PDEB_THREAD_NODE_INFO) HeapAlloc( hHeap, (DWORD) NULL,
(DWORD) sizeof( DEB_THREAD_NODE_INFO ) );
(*ppThreadNode)->pNodeData = *(ppThreadNodeInfo);
return( TRUE );
}
// ************************************************************************
// FUNCTION : InitThreadNodeInfo( PDEB_THREAD_NODE_INFO*, LPDEBUG_EVENT )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
InitThreadNodeInfo( PDEB_THREAD_NODE_INFO* ppThreadNodeInfo,
LPDEBUG_EVENT lpDebugEvent )
{
//-- init info data
(*ppThreadNodeInfo)->dwProcessId = lpDebugEvent->dwProcessId;
(*ppThreadNodeInfo)->dwThreadId = lpDebugEvent->dwThreadId;
(*ppThreadNodeInfo)->ThreadDebugInfo = lpDebugEvent->u.CreateThread;
return( TRUE );
}
// ************************************************************************
// FUNCTION : InsertThreadNode( PLIST, PNODE )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
InsertThreadNode( PLIST pThreadList, PNODE pThreadNode )
{
PDEB_THREAD_LIST_INFO pThreadListInfo = (PDEB_THREAD_LIST_INFO) pThreadList->pListData;
//-- insert the thread node
InsertNode( pThreadList, pThreadNode );
//-- increment dwActiveThreads
pThreadListInfo->dwActiveThreads++;
return( TRUE );
}
// ************************************************************************
// FUNCTION : SetCurrentThreadNode( PLIST, PNODE )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
SetCurrentThreadNode( PLIST pThreadList, PNODE pThreadNode )
{
SetCurrentNode( pThreadList, pThreadNode, pThreadList->OrderFunction );
return( TRUE );
}
// ************************************************************************
// FUNCTION : DeleteThreadNode( PLIST, PNODE )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
DeleteThreadNode( PLIST pThreadList, PNODE pThreadNode )
{
PNODE pDeleteNode;
SetCurrentNode( pThreadList, pThreadNode, pThreadList->OrderFunction );
GetCurrentNode( pThreadList, &pDeleteNode );
DeleteCurrentThreadNode( pThreadList );
return( TRUE );
}
// ************************************************************************
// FUNCTION : FreeThreadNodeInfo( PNODE )
// PURPOSE :
// COMMENTS :
//
// ************************************************************************
BOOL
FreeThreadNodeInfo( PNODE pThreadNode )
{
PDEB_THREAD_NODE_INFO pThreadNodeInfo = (PDEB_THREAD_NODE_INFO) pThreadNode->pNodeData;
//-- free info data
HeapFree( hHeap, (DWORD) NULL, (PVOID) pThreadNodeInfo );
return( TRUE );
}
// ************************************************************************
// FUNCTION : DestroyThreadNode( PNODE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -