?? debug.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 + -