1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
// Copyright © 2010 sss
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "commonheaders.h"
//thx gpg module from Harald Treder, Zakhar V. Bardymov
pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD aexitcode)
{
BOOL success;
STARTUPINFO sinfo = {0};
SECURITY_ATTRIBUTES sattrs = {0};
SECURITY_DESCRIPTOR sdesc = {0};
PROCESS_INFORMATION pri = {0};
HANDLE newstdin, newstdout, readstdout, writestdin;
char *inputpos;
unsigned long transfered;
int size;
TCHAR *bin_path = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", _T(""));
{
if(_waccess(bin_path, 0) == -1)
if(errno == ENOENT)
{
mir_free(bin_path);
return pxNotFound;
}
}
wstring commandline;
sattrs.nLength=sizeof(SECURITY_ATTRIBUTES);
sattrs.bInheritHandle=TRUE;
InitializeSecurityDescriptor(&sdesc,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sdesc,TRUE,NULL,FALSE);
sattrs.lpSecurityDescriptor=&sdesc;
success=CreatePipe(&newstdin,&writestdin,&sattrs,0);
if (!success)
{
return pxCreatePipeFailed;
}
success=CreatePipe(&readstdout,&newstdout,&sattrs,0);
if (!success)
{
CloseHandle(newstdin);
CloseHandle(writestdin);
return pxCreatePipeFailed;
}
GetStartupInfo(&sinfo);
sinfo.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
sinfo.wShowWindow=SW_HIDE;
sinfo.hStdOutput=newstdout;
sinfo.hStdError=newstdout;
sinfo.hStdInput=newstdin;
{ //form initial command
commandline += _T("\"");
commandline += bin_path;
commandline += _T("\" --homedir \"");
TCHAR *home_dir = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T(""));
commandline += home_dir;
commandline += _T("\" ");
commandline += *acommandline;
mir_free(bin_path);
mir_free(home_dir);
}
success = CreateProcess(NULL, (TCHAR*)commandline.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &sinfo, &pri);
if (!success)
{
CloseHandle(newstdin);
CloseHandle(writestdin);
CloseHandle(newstdout);
CloseHandle(readstdout);
return pxCreateProcessFailed;
}
inputpos=ainput;
while (TRUE)
{
success=GetExitCodeProcess(pri.hProcess,aexitcode);
if (success && *aexitcode!=STILL_ACTIVE)
break;
storeOutput(readstdout,aoutput);
if (*inputpos!='\0') size=1;
else size=0;
success=WriteFile(writestdin,inputpos,size,&transfered,NULL);
inputpos+=transfered;
}
storeOutput(readstdout,aoutput);
WaitForSingleObject(pri.hProcess,INFINITE);
CloseHandle(pri.hThread);
CloseHandle(pri.hProcess);
CloseHandle(newstdin);
CloseHandle(newstdout);
CloseHandle(readstdout);
CloseHandle(writestdin);
return pxSuccess;
}
|