#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
bool ExecDosCmd(char* strcmd)
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead = NULL, hWrite = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
return false;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite; //把创建进程的标准错误输出重定向到管道输入
si.hStdOutput = hWrite; //把创建进程的标准输出重定向到管道输入
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!::CreateProcess(NULL, strcmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
{
CloseHandle(hWrite);
CloseHandle(hRead);
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
return false;
}
CloseHandle(hWrite);
char buffer[4096] = { 0 }; //用4K的空间来存储输出的内容,只要不是显示文件内容,一般情况下是够用了。
DWORD bytesRead;
while (true)
{
if (ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL)
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
//printf(buffer); //这里是弹出对话框显示
if (strstr(buffer, "文件损坏或密码错误") || strstr(buffer, "发现文件头毁损"))
{
CloseHandle(hRead);
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
return false;
}
}
CloseHandle(hRead);
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
return true;
}
int main(int argc, char* argv[])
{
//char szCommandLine[] = "Rar.exe a -r -hp123456 \"g:/360Downloads.rar\" \"f:/360Downloads\"";
char szCommandLine[512] = {} ;
for (int i = 100000; i < 999999; i++)
{
sprintf_s(szCommandLine, 512, "Rar.exe x -hp%u \"g:/360Downloads.rar\" \"F:/test/\"", i);
if (ExecDosCmd(szCommandLine))
{
printf("密码是:%u\r\n",i);
break;
}
}
system("pause");
}