MASM32编程用两种方法运行外部程序并等待其结束
PurpleEndurer 原创
2009-06-08 第1版
在实现DelUninstall的卸载软件功能时,我们需要运行软件所指定的卸载程序,并等待其进程结束。
在用API函数WaitForSingleObject来等卸载程序进程结束时:
DWORD WaitForSingleObject( HANDLE hHandle, // 等待对象的句柄 DWORD dwMilliseconds // 等待毫秒数,INFINITE表示无限等待 );
我们需要把进程句柄作为第一个参数传递给它。
要得到卸载程序运行时的进程句柄,我们至少有两个方法:
一、使用API函数ShellExecuteEx来运行卸载程序。
ShellExecuteEx的原型为:
BOOL ShellExecuteEx( LPSHELLEXECUTEINFO lpExecInfo );
其参数所指向的结构SHELLEXECUTEINFO定义为:
typedef struct _SHELLEXECUTEINFO { DWORD cbSize; ULONG fMask; HWND hwnd; LPCTSTR lpVerb; LPCTSTR lpFile; LPCTSTR lpParameters; LPCTSTR lpDirectory; int nShow; HINSTANCE hInstApp; LPVOID lpIDList; LPCTSTR lpClass; HKEY hkeyClass; DWORD dwHotKey; union { HANDLE hIcon; HANDLE hMonitor; } DUMMYUNIONNAME; HANDLE hProcess; } SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
我们把卸载程序的命令行字符串首地址赋给SHELLEXECUTEINFO的成员lpFile,在调用成功后,在SHELLEXECUTEINFO的成员hProcess中保存着进程的句柄。
二、使用API函数CreateProcess来运行卸载程序。
CreateProcess的原型为:
BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, __inout_opt LPTSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation );
我们把卸载程序的命令行字符串首地址传给第2个参数lpCommandLine,同时我们初始化一个STARTUPINFO结构变量和一个PROCESS_INFORMATION结构变量,并把其地址作为第9和第10个参数传递。
PROCESS_INFORMATION结构定义为:
typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; }PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
调用成功后,进程句柄就存放在PROCESS_INFORMATION结构变量的成员hProcess中。
下面是DelUninstall中有关代码,当常量c_UseshlExec值为1时,我们使用ShellExecuteEx来实现,否则使用CreateProcess:
;lpszUnFile:卸载程序的命令行字符串首地址
UninstallAproclpszUnFile:LPSTR
c_UseshlExecequ1
ifc_UseshlExeceq1
localsiExeInfo:SHELLEXECUTEINFO
else
localpiProcInfo:PROCESS_INFORMATION
localsiStartInfo:STARTUPINFO
endif;c_UseshlExec
ifc_UseshlExeceq1
invokeRtlZeroMemory,addrsiExeInfo,sizeofSHELLEXECUTEINFO
movsiExeInfo.cbSize,sizeofSHELLEXECUTEINFO
moveax,lpszUnFile
movsiExeInfo.lpFile,eax
movsiExeInfo.fMask,SEE_MASK_NOCLOSEPROCESS
movsiExeInfo.nShow,SW_HIDE
invokeShellExecuteEx,addrsiExeInfo
testeax,eax
jz@F
invokeWaitForSingleObject,siExeInfo.hProcess,INFINITE
else;c_UseshlExec
invokeRtlZeroMemory,addrsiStartInfo,sizeofSTARTUPINFO
invokeRtlZeroMemory,addrpiProcInfo,sizeofPROCESS_INFORMATION
movsiStartInfo.cb,sizeofSTARTUPINFO
xorebx,ebx
invokeCreateProcess,ebx,lpszUnFile,/
ebx,/;processsecurityattributes
ebx,/;primarythreadsecurityattributes
ebx,/;handlesareinherited
ebx,/;creationflags
ebx,/;useparent'senvironment
ebx,/;useparent'scurrentdirectory
addrsiStartInfo,/;STARTUPINFOpointer
addrpiProcInfo;receivesPROCESS_INFORMATION
invokeWaitForSingleObject,piProcInfo.hProcess,INFINITE
endif;c_UseshlExec
.endif
@@:
ret
UninstallAendp
本文介绍使用MASM32编程通过ShellExecuteEx及CreateProcess两种方法运行外部卸载程序,并利用WaitForSingleObject等待其结束的过程。通过具体代码示例展示了如何获取卸载程序的进程句柄。
1901

被折叠的 条评论
为什么被折叠?



