⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.cpp

📁 监视OutputDebugString信息,,调试用起来方便,并且可通过此方法和内核通信也不错
💻 CPP
字号:
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <tlhelp32.h>
#include "resource.h"

#define WND_DEBUGLIST  12001
#define ID_TASKBARICON		100
#define WM_ICONNOTIFY		(WM_USER+101)
#pragma comment(lib,"comctl32")

typedef struct dbwin_buffer {
    DWORD   dwProcessId;
    char    data[4096-sizeof(DWORD)];
}DBWINBUFF;

LRESULT __stdcall MainProc(HWND,UINT,WPARAM,LPARAM);
BOOL ListProc(HWND,UINT,WPARAM,LPARAM);

bool ListView_AddStr(DBWINBUFF *buff);

char * GetProcessName(int pid);
BOOL ProcessMod(int pid);

HWND hList,hList1,hWndWindow;
BOOL IsMod=FALSE;
DWORD __stdcall ThreadDebug(LPVOID lPvoid);

int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{

	InitCommonControls();
	MSG Msg;
	char cls[]="debug";
	WNDCLASSEX wc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.cbSize = sizeof wc;
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wc.hIconSm = NULL;
	wc.hCursor = LoadCursor(NULL,IDC_SIZENS);
	wc.hInstance = hInstance;
	wc.lpfnWndProc = MainProc;
	wc.lpszClassName = cls;
	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
	wc.style = CS_HREDRAW|CS_VREDRAW;
	if(!RegisterClassEx(&wc))
	{
		return -0;
	}
	hWndWindow = CreateWindowEx(NULL,cls,"亚麻-Debug(本程序可显示通过OutputDebugString打印出来的字符串..群号:29653295..欢迎来一起讨论学习)",
							WS_OVERLAPPEDWINDOW,
							0,0,600,500,
						  NULL,NULL,hInstance,NULL);

	int x = (GetSystemMetrics(SM_CXSCREEN)-600)/2;
	int y = (GetSystemMetrics(SM_CYSCREEN)-500)/2;
	MoveWindow(hWndWindow,x,y,600,500,TRUE);

	SetClassLong(hWndWindow,GCL_HICON,(LONG)LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)));

	ShowWindow(hWndWindow,iCmdShow);
	UpdateWindow(hWndWindow);

	while(GetMessage(&Msg,NULL,0,0))
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	return Msg.wParam;
}

LRESULT __stdcall MainProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
	switch(Message)
	{
	case WM_CREATE:
		{
			NOTIFYICONDATA m_Nid;
			m_Nid.cbSize = sizeof(NOTIFYICONDATA);
			m_Nid.uID = ID_TASKBARICON;
			m_Nid.hWnd = hWnd;
			m_Nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
			m_Nid.uCallbackMessage = WM_ICONNOTIFY;
			m_Nid.hIcon = (HICON)LoadImage((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0);
			strcpy(m_Nid.szTip,"单击");
			// 添加into系统托盘
			Shell_NotifyIcon(NIM_ADD, &m_Nid);

			hList = CreateWindowEx(WS_EX_CLIENTEDGE,
									WC_LISTVIEW,
									NULL,
									WS_CHILD|WS_VISIBLE|LVS_REPORT,
									0,0,200,200,
									hWnd,
									(HMENU)WND_DEBUGLIST,
									(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
									0);
			hList1 = CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW,NULL,WS_CHILD|WS_VISIBLE|LVS_REPORT,0,200,200,200,hWnd,NULL,(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),0);

			LV_COLUMN lvcol;
			lvcol.mask = LVCF_TEXT;
			lvcol.pszText="进程名称";
			ListView_InsertColumn(hList,0,&lvcol);
			ListView_SetColumnWidth(hList,0,100);
			lvcol.pszText="进程编号";
			ListView_InsertColumn(hList,1,&lvcol);
			ListView_SetColumnWidth(hList,1,100);
			lvcol.pszText="输出信息";
			ListView_InsertColumn(hList,2,&lvcol);
			ListView_SetColumnWidth(hList,2,100);


			lvcol.pszText="模块名称";
			ListView_InsertColumn(hList1,0,&lvcol);
			ListView_SetColumnWidth(hList1,0,200);
			lvcol.pszText="地址";
			ListView_InsertColumn(hList1,1,&lvcol);
			ListView_SetColumnWidth(hList1,1,200);

			CreateThread(NULL,NULL,ThreadDebug,NULL,NULL,NULL);
		}
		break;
	case WM_SIZE:
		{
			RECT rect,list;
			GetClientRect(hWnd,&rect);
			GetClientRect(hList,&list);
			
		    HDWP hDwp = BeginDeferWindowPos(2);
			DeferWindowPos(hDwp,hList,NULL,0,0,rect.right,list.bottom,SWP_NOZORDER);
			DeferWindowPos(hDwp,hList1,NULL,0,list.bottom+3,rect.right,rect.bottom-list.bottom-3,SWP_NOZORDER);
			EndDeferWindowPos(hDwp);

			ListView_SetColumnWidth(hList,0,100);
			ListView_SetColumnWidth(hList,1,100);
			ListView_SetColumnWidth(hList,2,rect.right-220);
		}
		break;
	case WM_LBUTTONUP:
		ReleaseCapture();
		break;
	case WM_LBUTTONDOWN:
		SetCapture(hWnd);
		break;
	case WM_MOUSEMOVE:
		if((wParam & MK_LBUTTON) == MK_LBUTTON && GetCapture() == hWnd)
		{
			int x = (short)HIWORD(lParam);
			RECT rect,list;
			GetClientRect(hWnd,&rect);
			GetClientRect(hList,&list);
			
		    HDWP hDwp = BeginDeferWindowPos(2);
			DeferWindowPos(hDwp,hList,NULL,0,0,rect.right,x,SWP_NOZORDER);
			DeferWindowPos(hDwp,hList1,NULL,0,x+3,rect.right,rect.bottom-list.bottom-3,SWP_NOZORDER);
			EndDeferWindowPos(hDwp);
		}
		break;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case ID_RE:
			ListView_DeleteAllItems(hList);
			break;
		case ID_MOD:
			IsMod = !IsMod;
			break;
		case ID_HELPS:
			MessageBox(NULL,"本程序可显示通过OutputDebugString打印出来的字符串\n群号:29653295\n欢迎来一起讨论学习","Debug",0);
			break;
		}
		break;
	case WM_ICONNOTIFY:
		switch(lParam)
		{
		case WM_LBUTTONDBLCLK:
			ShowWindow(hWndWindow,SW_RESTORE);
			SetForegroundWindow(hWnd);
			break;
		}
		break;
	case WM_NOTIFY:
		switch(LOWORD(wParam))
		{
		case WND_DEBUGLIST:
			ListProc(hWnd,Message,wParam,lParam);
			break;
		}
		break;
	case WM_SYSCOMMAND:
		switch(LOWORD(wParam))
		{
		case SC_MINIMIZE:
			ShowWindow(hWndWindow,SW_HIDE);
			return 0;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd,Message,wParam,lParam);
}

DWORD __stdcall ThreadDebug(LPVOID lPvoid)
{
	int MAX_DebugBuffer = 1024;
	HANDLE hMapping = NULL;
	HANDLE hAckEvent = NULL;
	LPVOID lpBuffer = (LPVOID)GlobalAlloc(GPTR,4098);
	hAckEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("DBWIN_BUFFER_READY"));      
	HANDLE m_hReadyEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("DBWIN_DATA_READY"));  
	
	hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MAX_DebugBuffer, TEXT("DBWIN_BUFFER"));       
	lpBuffer = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);      
 
	while(true)
	{    
		SetEvent(hAckEvent);
		if (WaitForSingleObject(m_hReadyEvent, INFINITE) == WAIT_OBJECT_0)      
		{         
			ListView_AddStr((DBWINBUFF*)lpBuffer);
		}     
		else      
		{         // 等待失败        
			MessageBox(NULL,"error,0",0,0);
		}    
	}
	return 0;
}



BOOL ListProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
#define lpnm ((LPNMHDR)lParam)
	switch(lpnm->code)
	{
	case NM_CLICK:
		if(IsMod)
		{
			LV_DISPINFO *lpdis = (LV_DISPINFO*)lParam;
			char text[32]={0};
			ListView_GetItemText(hList,lpdis->item.mask,1,text,32);
			ProcessMod(atoi(text));
		}
		break;
	}
	return FALSE;
}

bool ListView_AddStr(DBWINBUFF *buff)
{
	int item = ListView_GetItemCount(hList);
	char pid[10]={0};
	sprintf(pid,"%d",buff->dwProcessId);

	LVITEM lvi;
	lvi.mask = LVIF_TEXT|LVIF_IMAGE;
	lvi.state =LVIS_SELECTED;
	lvi.stateMask =0;
	lvi.iSubItem = 0;
	lvi.iItem = item;;
	lvi.pszText = GetProcessName(buff->dwProcessId);
	lvi.iImage = 0;
	int i = ListView_InsertItem(hList,&lvi);
	ListView_SetItemText(hList,i,1,pid);
	ListView_SetItemText(hList,i,2,buff->data);
	return true;
}

char * GetProcessName(int pid)
{
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof pe32;
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	Process32First(hProcessSnap,&pe32);
	do
	{
		if(pe32.th32ProcessID==(DWORD)pid)
		{
			MODULEENTRY32 mod32;
			mod32.dwSize = sizeof mod32;
			HANDLE hModSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID);
			if(Module32First(hModSnap,&mod32))
			{
				CloseHandle(hModSnap);
				CloseHandle(hProcessSnap);
				return mod32.szExePath;
			}
			CloseHandle(hModSnap);
			CloseHandle(hProcessSnap);
			return pe32.szExeFile;
		}
	}while(Process32Next(hProcessSnap,&pe32));
	CloseHandle(hProcessSnap);
	return "未知";
}

BOOL ProcessMod(int pid)
{
	ListView_DeleteAllItems(hList1);
	MODULEENTRY32 mod32;
	mod32.dwSize = sizeof mod32;
	HANDLE hModSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
	if(Module32First(hModSnap,&mod32))
	{
		int item=0;
		do{
			LVITEM lvi;
			lvi.mask = LVIF_TEXT|LVIF_IMAGE;
			lvi.state =LVIS_SELECTED;
			lvi.stateMask =0;
			lvi.iSubItem = 0;
			lvi.iItem = item++;
			lvi.pszText = mod32.szExePath;
			lvi.iImage = 0;
			int i = ListView_InsertItem(hList1,&lvi);
			char t[32]={0};
			sprintf(t,"0x%x",mod32.modBaseAddr);
			ListView_SetItemText(hList1,i,1,t);
		//	ListView_SetItemText(hList,i,2,buff->data);
		}while(Module32Next(hModSnap,&mod32));

	}
	CloseHandle(hModSnap);
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -