Win32汇编——过程控制(环境变量、命令行参数、可执行文件执行)
来源:互联网 发布:mp3顺序排列软件 编辑:程序博客网 时间:2024/06/05 15:34
1.环境变量
按用途可分为:与系统运行相关、反应系统状态以及应用程序自定义三种环境变量
操作函数:
获取一个环境变量的值:GetEnvironmentVariable
设置新变量或删除已有变量 :SetEnvironmentVariable (仅改变本进程的环境变量)
枚举所有的环境变量:GetEnvironmentStrings
释放环境变量的拷贝:FreeEnvironmentStrings
2.命令行参数:某些情况下,命令行参数是窗口程序的必然补充,如:关联文件
操作函数:
获取命令行参数:GetCommanLine (Windows以空格区分参数,所以应注意双引号引起的问题)
3.1 Shell 调用(创建了新进程,但控制不了)
WinExec
ShellExecute
3.2 创建进程(可进行后续控制)
进程被创建时,系统的操作:创建一个内核对象和一个虚拟地址空间以及一个主线程
涉及结构:
STARTUPINFO
PROCESS_INFORMATION
涉及函数:
获取当期进程的 STARTUPINFO :GetStartUp
创建进程:CreateProcess
结束进程:ExitProcess
获取退出码:GetExitCodeProcess
结束其他进程:TerminateProcess
进程被结束时,系统的操作:
(1)关闭进程创建或打开的所有对象句柄
(2)终止进程中的所有线程
(3)进程及进程中所有线程的状态被改为置位状态,以便让WaitSingleObject 函数正确检测
(4)进程对象中的退出码字段从 STILL_ACTIVE 被改为指定的退出码
PS:进程结束不影响子进程,直到使用CloseHandle 将进程句柄关闭后,进程对象才真正被删除。当不再需要进程句柄的时候,记得关闭PROCESS_INFORMATION结构中返回的进程句柄和主线程句柄。
示例如下:
按用途可分为:与系统运行相关、反应系统状态以及应用程序自定义三种环境变量
操作函数:
获取一个环境变量的值:GetEnvironmentVariable
设置新变量或删除已有变量 :SetEnvironmentVariable (仅改变本进程的环境变量)
枚举所有的环境变量:GetEnvironmentStrings
释放环境变量的拷贝:FreeEnvironmentStrings
2.命令行参数:某些情况下,命令行参数是窗口程序的必然补充,如:关联文件
操作函数:
获取命令行参数:GetCommanLine (Windows以空格区分参数,所以应注意双引号引起的问题)
PS:Win32中CommandLineToArgvW 可以扫描字符串,但仅适合Unicode 和 WinNT ,因此,我们自己编写一个获取命令行参数的通用函数,代码如下:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; _CmdLine.asm; 命令行参数分析的通用子程序; 功能:; _argc ---> 对命令行参数进行数量统计; _argv ---> 取某个命令行参数;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>CHAR_BLANKequ20h;定义空格CHAR_DELIequ'"';定义分隔符;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 取命令行参数个数 (arg count); 参数个数必定大于等于 1, 参数 1 为当前执行文件名;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_argcproclocal@dwArgc;参数个数pushadmov@dwArgc,0invokeGetCommandLinemovesi,eaxcld_argc_loop:;********************************************************************; 忽略参数之间的空格;********************************************************************lodsboral,aljz_argc_end;无输入或到字符串尾cmpal,CHAR_BLANKjz_argc_loop;空格则忽略;********************************************************************; 一个参数开始;********************************************************************decesi;inc@dwArgc_argc_loop1:lodsboral,aljz_argc_end;无输入或到字符串尾cmpal,CHAR_BLANKjz_argc_loop;空格则忽略cmpal,CHAR_DELIjnz_argc_loop1;引号,继续处理参数内容;********************************************************************; 如果一个参数中的一部分有空格,则用 " " 包括;********************************************************************@@:lodsboral,aljz_argc_end;无输入或到字符串尾cmpal,CHAR_DELI;直到遇到另一个引号为止jnz@Bjmp_argc_loop1_argc_end:popadmoveax,@dwArgcret_argcendp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 取指定位置的命令行参数; argv 0 = 执行文件名; argv 1 = 参数1 ...; 参数含义:参数编号,接收参数缓冲区,缓冲区大小;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_argvproc_dwArgv,_lpReturn,_dwSizelocal@dwArgv,@dwFlagpushadinc_dwArgvmov@dwArgv,0movedi,_lpReturn;目的串invokeGetCommandLinemovesi,eaxcld_argv_loop:;********************************************************************; 忽略参数之间的空格;********************************************************************lodsboral,aljz_argv_endcmpal,CHAR_BLANKjz_argv_loop;同上;********************************************************************; 一个参数开始; 如果和要求的参数符合,则开始复制到返回缓冲区;********************************************************************decesiinc@dwArgvmov@dwFlag,FALSEmoveax,_dwArgvcmpeax,@dwArgvjnz@Fmov@dwFlag,TRUE;表示需要将字符返回@@:_argv_loop1:lodsboral,aljz_argv_endcmpal,CHAR_BLANKjz_argv_loop;参数结束cmpal,CHAR_DELIjz_argv_loop2cmp_dwSize,1;如果返回缓冲区满则返回jle@Fcmp@dwFlag,TRUEjne@Fstosbdec_dwSize@@:jmp_argv_loop1;继续处理参数内容_argv_loop2:lodsboral,aljz_argv_endcmpal,CHAR_DELIjz_argv_loop1cmp_dwSize,1;如果返回缓冲区满则返回jle@Fcmp@dwFlag,TRUEjne@Fstosbdec_dwSize@@:jmp_argv_loop2_argv_end:xoral,alstosb;0结束popadret_argvendp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3.可执行文件的执行
3.1 Shell 调用(创建了新进程,但控制不了)
WinExec
ShellExecute
3.2 创建进程(可进行后续控制)
进程被创建时,系统的操作:创建一个内核对象和一个虚拟地址空间以及一个主线程
涉及结构:
STARTUPINFO
PROCESS_INFORMATION
涉及函数:
获取当期进程的 STARTUPINFO :GetStartUp
创建进程:CreateProcess
结束进程:ExitProcess
获取退出码:GetExitCodeProcess
结束其他进程:TerminateProcess
进程被结束时,系统的操作:
(1)关闭进程创建或打开的所有对象句柄
(2)终止进程中的所有线程
(3)进程及进程中所有线程的状态被改为置位状态,以便让WaitSingleObject 函数正确检测
(4)进程对象中的退出码字段从 STILL_ACTIVE 被改为指定的退出码
PS:进程结束不影响子进程,直到使用CloseHandle 将进程句柄关闭后,进程对象才真正被删除。当不再需要进程句柄的时候,记得关闭PROCESS_INFORMATION结构中返回的进程句柄和主线程句柄。
示例如下:
.data?stStartUpSTARTUPINFO<?>stProcInfoPROCESS_INFORMATION<?>.codeinvokelstrcpy,addr @szBuffer,addr szFileName.ifszCmdLineinvokelstrcat,addr @szBuffer,addr szBlankinvokelstrcat,addr @szBuffer,addr szCmdLine.endif;********************************************************************; 创建进程;********************************************************************invokeGetStartupInfo,addr stStartUpinvokeCreateProcess,NULL,addr @szBuffer,NULL,NULL,NULL,\NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo.ifeax;********************************************************************; 等待进程结束;********************************************************************invokeWaitForSingleObject,stProcInfo.hProcess,INFINITEinvokeCloseHandle,stProcInfo.hProcessinvokeCloseHandle,stProcInfo.hThread.elseinvokeMessageBox,hWinMain,addr szErrExec,NULL,MB_OK or MB_ICONWARNING.endif
- Win32汇编——过程控制(环境变量、命令行参数、可执行文件执行)
- Win32汇编——过程控制(进程调试和进程隐藏)
- Win32可执行文件开发过程 01
- Win32可执行文件的开发过程
- Linux可执行文件的启动及命令行参数和环境变量的传递
- Linux可执行文件的启动及命令行参数和环境变量的传递
- Linux可执行文件的启动及命令行参数和环境变量的传递
- Win32开发(命令行参数处理)
- win32命令行参数
- Win32汇编——钩子
- Win32汇编——多线程
- win32汇编---控制台中输出
- Win32 汇编子过程总结
- VLC 命令行控制参数
- linux汇编之命令行参数
- 命令行执行存储过程
- sqlserver 命令行执行过程
- How——如何学习Win32汇编
- oracle创建自增主键过程与错误分析
- vector<char*>和vector<string>的不同
- 便利的开发工具 CppUnit 快速使用指南
- sqlite入门学习笔记2
- 三个月的总结
- Win32汇编——过程控制(环境变量、命令行参数、可执行文件执行)
- 结构评审用proeWildfire 5.0蛮好使的
- jsp中的java代码&JSP page指令(11、12章笔记)
- Low-Latency Kernel? WTF?!?!
- Ubuntu配置lamp开发环境
- [Mo]windows XP 下kinect+openNI+NITE+vs2008开发环境的搭建
- 如何修改redhat的主机名称(hostname)
- 基于内核对象WaitableTimer实现的Timer组件
- 电脑族防癌七要诀