J’en ai déjà écrit un auparavantL’écho CMD est implémenté à l’aide de pipelines anonymesMaintenant, il semble que le code à l’époque était vraiment faible, et je l’ai réécrit avec colère.
[mw_shl_code=c,true]void ExecuteCommand(WCHAR * pszCommand, WCHAR *pszRésultat, DWORD dwCount)
{ BOOL bRet = FAUX ; USES_CONVERSION ;
WCHAR szCmdPath[MAX_PATH] = {0} ; GetSystemDirectory(szCmdPath, sizeof(szCmdPath)) ; PathAppend(szCmdPath, L"cmd.exe ») ;
SECURITY_ATTRIBUTES SecurityAttributes ; SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES) ; SecurityAttributes.lpSecurityDescrip{filter}tor = NULL ; SecurityAttributes.bInheritHandle = TRUE ;
HANDLE hRead = NULL ; HANDLE hWrite = NULL ;
if(CreatePipe(&hRead, &hWrite, &SecurityAttributes, 0))
{ STARTUPINFO StartupInfo = {0} ; StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW ; StartupInfo.hStdOutput = hWrite ; StartupInfo.hStdError = hWrite ; StartupInfo.wShowWindow = SW_HIDE ;
PROCESS_INFORMATION ProcessInformation = {0} ;
WCHAR szCurrentPath[MAX_PATH] = {0} ; GetCurrentDirectory(sizeof(szCurrentPath), szCurrentPath) ;
if(CreateProcess(szCmdPath, pszCommand, NULL, NULL, TRUE, 0, NULL, szCurrentPath, &StartupInfo, &ProcessInformation))
{ CloseHandle (hWrite) ;
char szBuffer[4096] = {0} ; DWORD dwRead = 0 ; if(pszRésultat)
{ pszRésultat[0] = 0 ; while(VRAI)
{ memset(szBuffer, 0, sizeof(szBuffer)) ; bRet = ReadFile(hRead, szBuffer, sizeof(szBuffer), & dwRead, NULL) ; if((FAUX == bRet) || (dwRead = 0)) pause ;
wcscat_s(pszRésultat, dwCompte, A2W(szBuffer)) ;
}
}
}
CloseHandle(hRead) ;
} }[/mw_shl_code]
|