您的位置 首页 > 雕刻工具

win32 深入理解win32

大家好,今天来为大家解答win32这个问题的一些问题点,包括深入理解win32也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

在上一节中我们对资源表进行了解析,在这一节里面我们来了解通用控件。

添加一些按钮,修改字体后如下图所示

然后大体的框架就已经搭建了出来

对于windows标准的控件总是可用的

Static\nGroupBox\nButton\nCheckBox\nRadioButton\nEdit\nComboBox\nListBox\n

因为如果把所有的控件在编译的时候全部加进exe就会使exe变得十分大,所以windows把通用控件放在了Comctrl32.dll里面

新建一个列表控件作为进程的显示窗口

再新建一个列表控件作为模块的显示窗口

因为通用控件在dll里,所以还需要包含头文件

#include<commctrl.h>\n#pragmacomment(lib,"comctl32.lib")\n

另外我们需要给windows指定我们需要使用哪一个通用控件,就需要通过INITCOMMONCONTROLSEX进行初始化

typedefstructtagINITCOMMONCONTROLSEX{\nDWORDdwSize;\nDWORDdwICC;\n}INITCOMMONCONTROLSEX,*LPINITCOMMONCONTROLSEX;\n

第一个参数为INITCOMMONCONTROLSEX的大小,第二个参数就是使用哪一个通用控件

例如这里我应该使用的是ICC_LISTVIEW_CLASSES这个控件,但是每次找的话都会很麻烦,这里windows给我们提供了一个包含常用的通用控件的类型,即ICC_WIN95_CLASSES

INITCOMMONCONTROLSEXicex;\nicex.dwSize=sizeof(INITCOMMONCONTROLSEX);\nicex.dwICC=ICC_WIN95_CLASSES;\nInitCommonControlsEx(&icex);\n

即可使用通用控件生成界面

voidInitProcessListView(HWNDhDlg)\n{\nLV_COLUMNlv;\nHWNDhListProcess;\n\n//初始化\nmemset(&lv,0,sizeof(LV_COLUMN));\n//获取IDC_LIST_PROCESS句柄\nhListProcess=GetDlgItem(hDlg,IDC_LIST_PROCESS);\n//设置整行选中\nSendMessage(hListProcess,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);\n\n//第一列\nlv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;\nlv.pszText=TEXT("进程");//列标题\nlv.cx=200;//列宽\nlv.iSubItem=0;\n//ListView_InsertColumn(hListProcess,0,&lv);\nSendMessage(hListProcess,LVM_INSERTCOLUMN,0,(DWORD)&lv);\n//第二列\nlv.pszText=TEXT("PID");\nlv.cx=100;\nlv.iSubItem=1;\n//ListView_InsertColumn(hListProcess,1,&lv);\nSendMessage(hListProcess,LVM_INSERTCOLUMN,1,(DWORD)&lv);\n//第三列\nlv.pszText=TEXT("镜像基址");\nlv.cx=100;\nlv.iSubItem=2;\nListView_InsertColumn(hListProcess,2,&lv);\n//第四列\nlv.pszText=TEXT("镜像大小");\nlv.cx=100;\nlv.iSubItem=3;\nListView_InsertColumn(hListProcess,3,&lv);\n\n}\n\ncaseWM_INITDIALOG:\n{\n//设置ProcerssListView的风格\nInitProcessListView(hDlg);\n\nbreak;\n}\n

这里如果要显示数据的话应该用遍历进程的方法,但是这里还没有涉及到,就自己写代码添加进程进去显示

VOIDEnumProcess(HWNDhListProcess)\n{\nLV_ITEMvitem;\n\n//初始化\nmemset(&vitem,0,sizeof(LV_ITEM));\nvitem.mask=LVIF_TEXT;\n\nvitem.pszText="csrss.exe";\nvitem.iItem=0;\nvitem.iSubItem=0;\n//ListView_InsertItem(hListProcess,&vitem);\nSendMessage(hListProcess,LVM_INSERTITEM,0,(DWORD)&vitem);\n\nvitem.pszText=TEXT("448");\nvitem.iItem=0;\nvitem.iSubItem=1;\nListView_SetItem(hListProcess,&vitem);\n\nvitem.pszText=TEXT("56590000");\nvitem.iItem=0;\nvitem.iSubItem=2;\nListView_SetItem(hListProcess,&vitem);\n\nvitem.pszText=TEXT("000F0000");\nvitem.iItem=0;\nvitem.iSubItem=3;\nListView_SetItem(hListProcess,&vitem);\n\nvitem.pszText=TEXT("winlogon.exe");\nvitem.iItem=1;\nvitem.iSubItem=0;\n//ListView_InsertItem(hListProcess,&vitem);\nSendMessage(hListProcess,LVM_INSERTITEM,0,(DWORD)&vitem);\n\nvitem.pszText=TEXT("456");\nvitem.iSubItem=1;\nListView_SetItem(hListProcess,&vitem);\n\nvitem.pszText=TEXT("10000000");\nvitem.iSubItem=2;\nListView_SetItem(hListProcess,&vitem);\n\nvitem.pszText=TEXT("000045800");\nvitem.iSubItem=3;\nListView_SetItem(hListProcess,&vitem);\n\n}\n

再编译生成即可发现已经生成

这里提一个点,使用ListView_InsertColumn跟SendMessage的效果相同

ListView_InsertColumn(hListProcess,1,&lv);\nSendMessage(hListModules,LVM_INSERTCOLUMN,1,(DWORD)&lv);\n

这里再写一个模块函数InitProcessListView

VOIDInitModulesListView(HWNDhDlg)\n{\nLV_COLUMNlv;\nHWNDhListModules;\n\n//初始化\nmemset(&lv,0,sizeof(LV_COLUMN));\n//获取IDC_LIST_PROCESS句柄\nhListModules=GetDlgItem(hDlg,IDC_LIST_MOUDLE);\n//设置整行选中\nSendMessage(hListModules,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);\n\n//第一列\nlv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;\nlv.pszText=TEXT("模块名称");//列标题\nlv.cx=238;//列宽\nlv.iSubItem=0;\n//ListView_InsertColumn(hListProcess,0,&lv);\nSendMessage(hListModules,LVM_INSERTCOLUMN,0,(DWORD)&lv);\n//第二列\nlv.pszText=TEXT("模块位置");\nlv.cx=238;\nlv.iSubItem=1;\n//ListView_InsertColumn(hListProcess,1,&lv);\nSendMessage(hListModules,LVM_INSERTCOLUMN,1,(DWORD)&lv);\n\n}\n

调用函数初始化

该消息类型与WM_COMMAND类型相似,都是由子窗口向父窗口发送的消息。WM_NOTIFY可以包含比WM_COMMAND更丰富的信息,Windows通用组件中有很多消息,都是通过WM_NOTIFY来描述的。一般标准控件在父窗口执行使用WM_COMMAND,通用控件在父窗口执行使用WM_NOTIFY

typedefstructtagNMHDR{\nHWNDhwndFrom;//发送通知消息的控制窗口句柄\nUINTidFrom;//发送通知消息的控制ID值\nUINTcode;//通知码,如LVM_SELCHANGED\n}NMHDR;\n

这个结构体能满足一般的要求,但能描述的信息还是有限的,如果不能满足要求还可以使用另外更复杂的结构进行标识(注意这里windows会自动帮我们替换)

以下结构体都有一个共同的特点,第一个成员都是NMHDR,即WM_NOTIFY这个通用结构体,这里体现了C++继承的思想

typedefstructtagNMLVCACHEHINT{\nNMHDRhdr;\nintiFrom;\nintiTo;\n}NMLVCACHEHINT,*PNMLVCACHEHINT;\n\ntypedefstructtagLVDISPINFO{\nNMHDRhdr;\nLVITEMitem;\n}NMLVDISPINFO,FAR*LPNMLVDISPINFO;\n\ntypedefstruct_NMLVFINDITEM{\nNMHDRhdr;\nintiStart;\nLVFINDINFOlvfi;\n}NMLVFINDITEM,*PNMLVFINDITEM;\n

这里首先写一个获取InitProcessListView这个模块进程的PID的函数

首先对从堆栈分配空间的缓冲区进行初始化操作

然后选择行,这里使用SendMessage()赋值给dwRowId,然后判断dwRowId的值即可得到选取的行

当我选取第一行的时候dwRowId的值为0,选取第二行的时候dwRowId的值为1

而当我没有选择有数据的行的时候,dwRowId的值就为-1

所以这里就可以写一个if语句进行条件的判断,当dwRowId的值为-1的时候直接弹出Error的弹窗

然后获取选中行的PID,要得到PID首先要确定PID所在的列,然后指定存储缓冲区的位置和大小,然后使用SendMessage和MessageBox实现弹窗

VOIDEnumMoudules(HWNDhListProcess,WPARAMwParam,LPARAMlParam)\n{\nDWORDdwRowId;\nTCHARszPid[0x20];\nLV_ITEMlv;\n\n//初始化\nmemset(&lv,0,sizeof(LV_ITEM));\nmemset(szPid,0,0x20);\n\n//获取选择行\ndwRowId=SendMessage(hListProcess,LVM_GETNEXTITEM,-1,LVNI_SELECTED);\nif(dwRowId==-1)\n{\nMessageBox(NULL,TEXT("Pleasechooseprocess!"),TEXT("Error"),MB_OK);\n\nreturn;\n}\n\n//获取PID\nlv.iSubItem=1;//获取列\nlv.pszText=szPid;//指定存储查询结果的缓冲区\nlv.cchTextMax=0x20;//指定缓冲区大小\nSendMessage(hListProcess,LVM_GETITEMTEXT,dwRowId,(DWORD)&lv);\n\nMessageBox(NULL,szPid,TEXT("PID"),MB_OK);\n}\n

本文由Drunkmars原创发布转载,请参考转载声明,注明出处:https://www.anquanke.com/post/id/265424安全客-有思想的安全新媒体

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023