功能展示
使用到的Win32API
HMODULE GetModuleHandle(LPCTSTR lpModuleName); hInstance(进程句柄): dd
从对话框模板资源创建模式对话框
INT_PTR DialogBoxParamA(
[in, optional] HINSTANCE hInstance,
[in] LPCSTR lpTemplateName,
[in, optional] HWND hWndParent,
[in, optional] DLGPROC lpDialogFunc,
[in] LPARAM dwInitParam
);
HWND GetDlgItem([in, optional] HWND hDlg,[in] int nIDDlgItem); hWinEdit(富文本框句柄): dd
HICON LoadIconA([in, optional] HINSTANCE hInstance, [in] LPCSTR lpIconName);
LRESULT SendMessage(
[in] HWND hWnd, //hWinMain(弹出窗口句柄):dd
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
); 把消息直接送到窗口过程处理
void RtlZeroMemory(
void* Destination,
size_t Length
); 用零填充内存块
LPSTR lstrcpyA(
[out] LPSTR lpString1, //szFont
[in] LPCSTR lpString2
); 将字符串复制到缓冲区。
BOOL GetOpenFileNameA(
[in, out] LPOPENFILENAMEA unnamedParam1
); 创建一个“打开”对话框
BOOL GetOpenFileNameA(
[in, out] LPOPENFILENAMEA unnamedParam1
);
HANDLE CreateFileA(
[in] LPCSTR lpFileName, //要打开的文件路径及名称名
[in] DWORD dwDesiredAccess,
[in] DWORD dwShareMode,
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
[in] DWORD dwCreationDisposition,
[in] DWORD dwFlagsAndAttributes,
[in, optional] HANDLE hTemplateFile
); 创建或打开文件或 I/O 设备 local @hFile
DWORD GetFileSize(
[in] HANDLE hFile,
[out, optional] LPDWORD lpFileSizeHigh
);
totalSize(文件大小):dd
HANDLE CreateFileMappingA(
[in] HANDLE hFile,
[in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
[in] DWORD flProtect,
[in] DWORD dwMaximumSizeHigh,
[in] DWORD dwMaximumSizeLow,
[in, optional] LPCSTR lpName
); local @hMapFile
LPVOID MapViewOfFile(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap
);
lpMemory(内存映像文件在内存的起始位置):(dd)
将格式化的数据写入指定的缓冲区。
int WINAPIV wsprintfA(
[out] LPSTR unnamedParam1, //@bufTemp2
[in] LPCSTR unnamedParam2, //lpszFilterFmt4
...
);
将一个字符串追加到另一个字符串。
LPSTR lstrcatA(
[in, out] LPSTR lpString1, //lpServicesBuffer
[in] LPCSTR lpString2 //@bufTemp2
);
int GetWindowTextLengthA(
[in] HWND hWnd
);
变量的分类:
实现最终程序功能需求的变量
需要经过计算的变量
mov @dwCount,1 local @dwCount(计数)
mov @dwCount1,0 local @dwCount1(地址顺号)
mov esi,lpMemory
mov edi,offset bufDisplay(第三列ASCII码字符显示)
wsprintf local @bufTemp2(第一列)
lstrcat lpServicesBuffer(所有内容):db 100
xor edx,edx
mov eax,totalSize
mov ecx,16
div ecx
mov eax,16
sub eax,edx
xor edx,edx
mov ecx,3
mul ecx
mov @dwBlanks,eax
感悟总结:
1.程序的本质其实就是一个调用函数的过程,我们定义的全局变量,常量,局部变量都是为调用函数做准备,我们只需要关注函数执行后哪些变量发生了改变,对后面的函数调用有什么样的影响,以及变量在各种条件分支,循环分支等C++语法中的状态变化情况
2.如果我们需要看这个变量经过了什么数值变化,那么我们可以通过全局查找
3.任何一个程序都有它核心的一个功能,不管它有几个状态,都是为这个核心功能做准备,我们要找出在这些状态中决定这些状态之间切换的关键变量和行为,这个非常非常关键,这些变量串联起了这个程序的始总,而遇到变量最好的方法是采用全局搜索和查看所有引用的方式去定位到这个变量发生了什么样的状态变化
提出问题
1.变量在什么情况下应该消失和存在