精易论坛

标题: 取DOS返回值,返回进程ID [打印本页]

作者: 向月亮道晚安    时间: 2024-10-22 12:43
标题: 取DOS返回值,返回进程ID
  
子程序名返回值类型公开备 注
取DOS返回文本1文本型 取出一个dos命令的返回信息。可设置即时回显。注意:该命令会阻塞,[返回值]一直到cmd中的内容执行完毕后才会返回。[取自超级模块]
参数名类 型参考可空数组备 注
命令行文本文本型欲执行的命令行文本
即时回显子程序指针DOS即时回显信息回调函数 回调DOS函数(回显信息) 返回逻辑值,真:停止,假:继续
变量名类 型静态数组备 注
SECURITY_ATTRIBUTESSECURITY_ATTRIBUTES 
STARTUPINFOSTARTUPINFO_短整数 
PROCESS_INFORMATION_进程结构 
txt字节集 
len整数型 
hWrite整数型 
hRead整数型 
EXIT整数型 
返回值文本型 
临时文本型 
参数整数型1
如果真 (命令行文本 = “”)
返回 (“”)

SECURITY_ATTRIBUTES.nLength = 12
SECURITY_ATTRIBUTES.lpSecurityDescriptor = 0
SECURITY_ATTRIBUTES.bInheritHandle = 1
CreatePipe (hRead, hWrite, SECURITY_ATTRIBUTES, 0)  ' 创建一个CMD匿名管道
STARTUPINFO.cb = 68
STARTUPINFO.dwFlags = 位或 ( #STARTF_USESHOWWINDOW, #STARTF_USESTDHANDLES )
STARTUPINFO.wShowWindow = #SW_HIDE
STARTUPINFO.hStdOutput = hWrite
STARTUPINFO.hStdError = hWrite
如果 (取操作系统类别 () ≤ 2)
_创建新进程_短整数 (0, “command.com /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口
_创建新进程_短整数 (0, “cmd.exe /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口

_关闭对象 (hWrite)  ' 因为我们开始已经创建了一个写管道端口,现在进程创键时又自动创键了一个写管道端口,所以应关闭多余的管道写端口
判断循环首 (len ≠ -1)  ' 制造一个无限循环
PeekNamedPipe (hRead, 0, 0, 0, len, 0)  ' 查看管道中是否有数据
如果 (len ≠ 0)
txt = 取空白字节集 (1024)
_读出文件中数据 (hRead, txt, 1023, len, 0)  ' 从管道中读取数据
临时 = 取字节集数据 (txt, #文本型, )
如果真 (是否为空 (即时回显))
参数 [1]_取指针_文本型 (临时, 临时, 0)
如果真 (_动态调用子程序 ( #动态调用代码, 即时回显, 参数, 1, ))
' ====图片字节集: #动态调用代码 ==== API动态调用子程序
' *** 缩略程序块 ***
' 动态调用代码 =  {85,139,236,86,139,117,16,141,78,255,133,201,124,21,139,69,12,141,4,136,65,139,16,137,85,16,255,117,16,131,232,4,73,117,242,255,85,8,137,69,12,139,69,20,133,192,116,13,141,4,181,0,0,0,0,137,69,16,3,101,16,139,69,12,94,93,194,16,0}
' 【汇编码】:
' push ebp
' mov ebp, esp
' push esi
' mov esi, dword ptr [ebp+10h]
' lea ecx, dword ptr [esi-01h]
' test ecx, ecx
' jl Label1
' mov eax, dword ptr [ebp+0Ch]
' lea eax, dword ptr [eax+ecx*4]
' inc ecx
' Label2:
' mov edx, dword ptr [eax]
' mov dword ptr [ebp+10h], edx
' push dword ptr [ebp+10h]
' sub eax, 04h
' dec ecx
' jne Label2
' Label1:
' call dword ptr [ebp+08h]
' mov dword ptr [ebp+0Ch], eax
' mov eax, dword ptr [ebp+14h]
' test eax, eax
' je Label3
' lea eax, dword ptr [00000000h+esi*4]
' mov dword ptr [ebp+10h], eax
' add esp, dword ptr [ebp+10h]
' Label3:
' mov eax, dword ptr [ebp+0Ch]
' pop esi
' pop ebp
' retn 0010h
_关闭对象 (hRead)
跳出循环 ()

返回值 = 返回值 + 临时
_取中断进程退出代码 (PROCESS_INFORMATION.进程句柄, EXIT)  ' 查看指定进程是否已结束
如果真 (EXIT ≠ #STILL_ACTIVE )  ' 因为会有程序退出来了,但管道中还有数据的情况,所以必须在管道中没有数据的情况下判断程序是否已结束,这时才能中止循环!
_关闭对象 (hRead)  ' 关闭管道
跳出循环 ()

处理事件 ()
判断循环尾 ()
返回 (返回值)


这个代码取自论坛大佬的代码,返回值是返回全部的DOS,想给他改成DOS返回用即时回显,子程序返回进程ID,要怎么改?

作者: dnxl    时间: 2024-10-22 13:02
即时回显 这是个回调指针啊,不是返回的值
PID应该在创建进程时最后一个参数PROCESS_INFORMATION结构里返回
作者: 向月亮道晚安    时间: 2024-10-22 13:04
dnxl 发表于 2024-10-22 13:02
即时回显 这是个回调指针啊,不是返回的值
PID应该在创建进程时最后一个参数PROCESS_INFORMATION结构里返回 ...

即时会显显示的是DOS,他这个是即时会显返回了一遍,子程序又返回了一遍,我想把子程序的返回改成进程ID
作者: dnxl    时间: 2024-10-22 13:06
向月亮道晚安 发表于 2024-10-22 13:04
即时会显显示的是DOS,他这个是即时会显返回了一遍,子程序又返回了一遍,我想把子程序的返回改成进程ID ...

那你把返回类型改整数,最后返回PROCESS_INFORMATION.ProcessID不就行了

补充内容 (2024-10-22 13:06):
也就是返回结构体第三个成员
作者: LEOONL    时间: 2024-10-22 13:06
  
子程序名返回值类型公开备 注
取DOS返回文本1整数型 取出一个dos命令的返回信息。可设置即时回显。注意:该命令会阻塞,[返回值]一直到cmd中的内容执行完毕后才会返回。[取自超级模块]
参数名类 型参考可空数组备 注
命令行文本文本型欲执行的命令行文本
即时回显子程序指针DOS即时回显信息回调函数 回调DOS函数(回显信息) 返回逻辑值,真:停止,假:继续
变量名类 型静态数组备 注
SECURITY_ATTRIBUTESSECURITY_ATTRIBUTES 
STARTUPINFOSTARTUPINFO_短整数 
PROCESS_INFORMATION_进程结构 
txt字节集 
len整数型 
hWrite整数型 
hRead整数型 
EXIT整数型 
返回值文本型 
临时文本型 
参数整数型1
进程ID整数型 
如果真 (命令行文本 = “”)
返回 (“”)

SECURITY_ATTRIBUTES.nLength = 12
SECURITY_ATTRIBUTES.lpSecurityDescriptor = 0
SECURITY_ATTRIBUTES.bInheritHandle = 1
CreatePipe (hRead, hWrite, SECURITY_ATTRIBUTES, 0)  ' 创建一个CMD匿名管道
STARTUPINFO.cb = 68
STARTUPINFO.dwFlags = 位或 ( #STARTF_USESHOWWINDOW, #STARTF_USESTDHANDLES )
STARTUPINFO.wShowWindow = #SW_HIDE
STARTUPINFO.hStdOutput = hWrite
STARTUPINFO.hStdError = hWrite
如果 (取操作系统类别 () ≤ 2)
进程ID=_创建新进程_短整数 (0, “command.com /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口
进程ID=_创建新进程_短整数 (0, “cmd.exe /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口

_关闭对象 (hWrite)  ' 因为我们开始已经创建了一个写管道端口,现在进程创键时又自动创键了一个写管道端口,所以应关闭多余的管道写端口
判断循环首 (len ≠ -1)  ' 制造一个无限循环
PeekNamedPipe (hRead, 0, 0, 0, len, 0)  ' 查看管道中是否有数据
如果 (len ≠ 0)
txt = 取空白字节集 (1024)
_读出文件中数据 (hRead, txt, 1023, len, 0)  ' 从管道中读取数据
临时 = 取字节集数据 (txt, #文本型, )
如果真 (是否为空 (即时回显))
参数 [1]_取指针_文本型 (临时, 临时, 0)
如果真 (_动态调用子程序 ( #动态调用代码, 即时回显, 参数, 1, ))
' ====图片字节集: #动态调用代码 ==== API动态调用子程序
' *** 缩略程序块 ***
' 动态调用代码 =  {85,139,236,86,139,117,16,141,78,255,133,201,124,21,139,69,12,141,4,136,65,139,16,137,85,16,255,117,16,131,232,4,73,117,242,255,85,8,137,69,12,139,69,20,133,192,116,13,141,4,181,0,0,0,0,137,69,16,3,101,16,139,69,12,94,93,194,16,0}
' 【汇编码】:
' push ebp
' mov ebp, esp
' push esi
' mov esi, dword ptr [ebp+10h]
' lea ecx, dword ptr [esi-01h]
' test ecx, ecx
' jl Label1
' mov eax, dword ptr [ebp+0Ch]
' lea eax, dword ptr [eax+ecx*4]
' inc ecx
' Label2:
' mov edx, dword ptr [eax]
' mov dword ptr [ebp+10h], edx
' push dword ptr [ebp+10h]
' sub eax, 04h
' dec ecx
' jne Label2
' Label1:
' call dword ptr [ebp+08h]
' mov dword ptr [ebp+0Ch], eax
' mov eax, dword ptr [ebp+14h]
' test eax, eax
' je Label3
' lea eax, dword ptr [00000000h+esi*4]
' mov dword ptr [ebp+10h], eax
' add esp, dword ptr [ebp+10h]
' Label3:
' mov eax, dword ptr [ebp+0Ch]
' pop esi
' pop ebp
' retn 0010h
_关闭对象 (hRead)
跳出循环 ()

返回值 = 返回值 + 临时
_取中断进程退出代码 (PROCESS_INFORMATION.进程句柄, EXIT)  ' 查看指定进程是否已结束
如果真 (EXIT ≠ #STILL_ACTIVE )  ' 因为会有程序退出来了,但管道中还有数据的情况,所以必须在管道中没有数据的情况下判断程序是否已结束,这时才能中止循环!
_关闭对象 (hRead)  ' 关闭管道
跳出循环 ()

处理事件 ()
判断循环尾 ()
返回 (进程ID)

作者: 向月亮道晚安    时间: 2024-10-22 13:16
LEOONL 发表于 2024-10-22 13:06
[e=0].版本 2

.子程序 取DOS返回文本1, 整数型, 公开, 取出一个dos命令的返回信息。可设置即时回显。注意: ...

好像有点错误

错误所处位置: 模块:"DOS"; 程序集:"程序集"; 子程序:"取DOS返回文本2"
错误(10044): 不能将“文本型”数据转换到“整数型”数据。

作者: LEOONL    时间: 2024-10-22 13:17
向月亮道晚安 发表于 2024-10-22 13:16
好像有点错误

错误所处位置: 模块:"DOS"; 程序集:"程序集"; 子程序:"取DOS返回文本2"

如果真 (命令行文本 = “”)
返回 (“”)

删掉

补充内容 (2024-10-22 13:18):
或者 返回(0)
作者: 向月亮道晚安    时间: 2024-10-22 13:24
LEOONL 发表于 2024-10-22 13:17
如果真 (命令行文本 = “”)
返回 (“”)



返回的都是1,而且命令返回也只有一行了

作者: LEOONL    时间: 2024-10-22 13:28
向月亮道晚安 发表于 2024-10-22 13:24
返回的都是1,而且命令返回也只有一行了

放完整源码看看
作者: 向月亮道晚安    时间: 2024-10-22 13:34
LEOONL 发表于 2024-10-22 13:28
放完整源码看看

我的取DOS3就是你的这个
作者: 向月亮道晚安    时间: 2024-10-22 13:35
LEOONL 发表于 2024-10-22 13:28
放完整源码看看

就改了

如果真 (命令行文本 = “”)
返回 (0)

这里
作者: LEOONL    时间: 2024-10-22 13:44
向月亮道晚安 发表于 2024-10-22 13:35
就改了

如果真 (命令行文本 = “”)

完整源码,光你这段我运行不了
作者: 向月亮道晚安    时间: 2024-10-22 14:03
LEOONL 发表于 2024-10-22 13:44
完整源码,光你这段我运行不了
  
窗口程序集名保 留  保 留备 注
窗口程序集_窗口1   
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
ID整数型 
ID = 取DOS返回文本1 (编辑框2.内容, &信息回调)
调试输出 (ID)
子程序名返回值类型公开备 注
信息回调  
参数名类 型参考可空数组备 注
文本文本型
编辑框3.加入文本 (文本 + #换行符 )
子程序名返回值类型公开备 注
取DOS返回文本1整数型 取出一个dos命令的返回信息。可设置即时回显。注意:该命令会阻塞,[返回值]一直到cmd中的内容执行完毕后才会返回。[取自超级模块]
参数名类 型参考可空数组备 注
命令行文本文本型欲执行的命令行文本
即时回显子程序指针DOS即时回显信息回调函数 回调DOS函数(回显信息) 返回逻辑值,真:停止,假:继续
变量名类 型静态数组备 注
SECURITY_ATTRIBUTESSECURITY_ATTRIBUTES 
STARTUPINFOSTARTUPINFO_短整数 
PROCESS_INFORMATION_进程结构 
txt字节集 
len整数型 
hWrite整数型 
hRead整数型 
EXIT整数型 
返回值文本型 
临时文本型 
参数整数型1
进程ID整数型 
如果真 (命令行文本 = “”)
返回 (0)

SECURITY_ATTRIBUTES.nLength = 12
SECURITY_ATTRIBUTES.lpSecurityDescriptor = 0
SECURITY_ATTRIBUTES.bInheritHandle = 1
CreatePipe (hRead, hWrite, SECURITY_ATTRIBUTES, 0)  ' 创建一个CMD匿名管道
STARTUPINFO.cb = 68
STARTUPINFO.dwFlags = 位或 ( #STARTF_USESHOWWINDOW, #STARTF_USESTDHANDLES )
STARTUPINFO.wShowWindow = #SW_HIDE
STARTUPINFO.hStdOutput = hWrite
STARTUPINFO.hStdError = hWrite
如果 (取操作系统类别 () ≤ 2)
进程ID=_创建新进程_短整数 (0, “command.com /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口
进程ID=_创建新进程_短整数 (0, “cmd.exe /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口

_关闭对象 (hWrite)  ' 因为我们开始已经创建了一个写管道端口,现在进程创键时又自动创键了一个写管道端口,所以应关闭多余的管道写端口
判断循环首 (len ≠ -1)  ' 制造一个无限循环
PeekNamedPipe (hRead, 0, 0, 0, len, 0)  ' 查看管道中是否有数据
如果 (len ≠ 0)
txt = 取空白字节集 (1024)
_读出文件中数据 (hRead, txt, 1023, len, 0)  ' 从管道中读取数据
临时 = 取字节集数据 (txt, #文本型, )
如果真 (是否为空 (即时回显))
参数 [1]_取指针_文本型 (临时, 临时, 0)
如果真 (_动态调用子程序 ( #动态调用代码, 即时回显, 参数, 1, ))
' ====图片字节集: #动态调用代码 ==== API动态调用子程序
' *** 缩略程序块 ***
' 动态调用代码 =  {85,139,236,86,139,117,16,141,78,255,133,201,124,21,139,69,12,141,4,136,65,139,16,137,85,16,255,117,16,131,232,4,73,117,242,255,85,8,137,69,12,139,69,20,133,192,116,13,141,4,181,0,0,0,0,137,69,16,3,101,16,139,69,12,94,93,194,16,0}
' 【汇编码】:
' push ebp
' mov ebp, esp
' push esi
' mov esi, dword ptr [ebp+10h]
' lea ecx, dword ptr [esi-01h]
' test ecx, ecx
' jl Label1
' mov eax, dword ptr [ebp+0Ch]
' lea eax, dword ptr [eax+ecx*4]
' inc ecx
' Label2:
' mov edx, dword ptr [eax]
' mov dword ptr [ebp+10h], edx
' push dword ptr [ebp+10h]
' sub eax, 04h
' dec ecx
' jne Label2
' Label1:
' call dword ptr [ebp+08h]
' mov dword ptr [ebp+0Ch], eax
' mov eax, dword ptr [ebp+14h]
' test eax, eax
' je Label3
' lea eax, dword ptr [00000000h+esi*4]
' mov dword ptr [ebp+10h], eax
' add esp, dword ptr [ebp+10h]
' Label3:
' mov eax, dword ptr [ebp+0Ch]
' pop esi
' pop ebp
' retn 0010h
_关闭对象 (hRead)
跳出循环 ()

返回值 = 返回值 + 临时
_取中断进程退出代码 (PROCESS_INFORMATION.进程句柄, EXIT)  ' 查看指定进程是否已结束
如果真 (EXIT ≠ #STILL_ACTIVE )  ' 因为会有程序退出来了,但管道中还有数据的情况,所以必须在管道中没有数据的情况下判断程序是否已结束,这时才能中止循环!
_关闭对象 (hRead)  ' 关闭管道
跳出循环 ()

处理事件 ()
判断循环尾 ()
返回 (进程ID)


i支持库列表   支持库注释   
spec特殊功能支持库


全部的代码就这么多了

作者: 千年    时间: 2024-10-22 14:22


这种要不要??、

作者: 向月亮道晚安    时间: 2024-10-22 14:29
千年 发表于 2024-10-22 14:22
这种要不要??、

我想要的是取进程ID
作者: 千年    时间: 2024-10-22 14:38
向月亮道晚安 发表于 2024-10-22 14:29
我想要的是取进程ID

本来就是创建一个cmd.exe进程,再从进程里取出
作者: 向月亮道晚安    时间: 2024-10-23 08:49
千年 发表于 2024-10-22 14:38
本来就是创建一个cmd.exe进程,再从进程里取出

大佬发我看看?




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4