Win32汇编——过程控制(环境变量、命令行参数、可执行文件执行)

来源:互联网 发布:mp3顺序排列软件 编辑:程序博客网 时间:2024/06/05 15:34
1.环境变量
按用途可分为:与系统运行相关、反应系统状态以及应用程序自定义三种环境变量
操作函数:
获取一个环境变量的值: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


原创粉丝点击