|

楼主 |
发表于 2021-8-18 18:06:40
|
显示全部楼层
命令行模式的
bcdedit这个命令
我在网上找了资料,使用匿名管道,但是不行。具体代码如下:
- BOOL COneKeyDlg::RunProcess(LPTSTR szCommandLine, LPTSTR szRetBuf, DWORD iRetBufLen, BOOL waitExit)
- {
-
- HANDLE hRead = INVALID_HANDLE_VALUE, hWrite = INVALID_HANDLE_VALUE;
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- ZeroMemory(&si, sizeof(si));
- ZeroMemory(&pi, sizeof(pi));
- si.cb = sizeof(STARTUPINFO);
- GetStartupInfo(&si);
- BOOL bRet = NULL != szRetBuf && iRetBufLen > 0;
- if (bRet)
- {
- SECURITY_ATTRIBUTES sa;
- sa.nLength = sizeof(SECURITY_ATTRIBUTES);
- sa.lpSecurityDescriptor = NULL;
- sa.bInheritHandle = TRUE;
- if (!CreatePipe(&hRead, &hWrite, &sa, 0)) {
- MessageBox("创建管道失败");
- return FALSE;
- }
- si.hStdError = hWrite;
- si.hStdOutput = hWrite;
- }
- // si.wShowWindow = SW_HIDE;
- si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
- if (CreateProcess(
- NULL, // 指向一个NULL结尾的、用来指定可执行模块的宽字节字符串
- szCommandLine, // 命令行字符串
- NULL, // 指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。
- NULL, // 如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。<同上>
- false,// 指示新进程是否从调用进程处继承了句柄。
- 0, // 指定附加的、用来控制优先类和进程的创建的标
- // CREATE_NEW_CONSOLE 新控制台打开子进程
- // CREATE_SUSPENDED 子进程创建后挂起,直到调用ResumeThread函数
- NULL, // 指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境
- NULL, // 指定子进程的工作路径
- &si, // 决定新进程的主窗体如何显示的STARTUPINFO结构体
- &pi // 接收新进程的识别信息的PROCESS_INFORMATION结构体
- ))
- {
- if (waitExit)
- {
- // 等待进程结束
- WaitForSingleObject(pi.hProcess, INFINITE);
- DWORD dwRet = WaitForSingleObject(pi.hProcess, INFINITE);
- switch (dwRet)
- {
- case WAIT_TIMEOUT:
- case WAIT_FAILED:
- return FALSE;
- }
- }
- //下面两行关闭句柄,解除本进程和新进程的关系,不然有可能不小心调用TerminateProcess函数关掉子进程
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- if (bRet)
- {
- CloseHandle(hWrite); //如果hWrite句柄在这里关闭,错误码为109,管道已经关闭
- DWORD dwRead, dwAvail;
- if (!PeekNamedPipe(hRead, szRetBuf, 1, &dwRead, &dwAvail, NULL) || dwAvail <= 0)//PeekNamePipe用来预览一个管道中的数据,用来判断管道中是否为空
- {
- CString str;
- str.Format("错误码:%ld", GetLastError());
- MessageBox(str);
- CloseHandle(hRead);
- return FALSE;
- }
- DWORD nReadedBytesCount = 0;
- DWORD nBytesRead = 0;
- DWORD dReadLen = 1024;
- while (true)
- {
- if (dReadLen > iRetBufLen - nReadedBytesCount)
- {
- dReadLen = iRetBufLen - nReadedBytesCount;
- }
- if (!ReadFile(hRead, szRetBuf, dReadLen, &nBytesRead, NULL))
- {
- CString str;
- str.Format("错误码:%ld", GetLastError());
- MessageBox(str);
- break;
- }
- nReadedBytesCount += nBytesRead;
- if (nReadedBytesCount >= iRetBufLen)
- {
- break;
- }
- }
- // CloseHandle(hWrite); //如果hWrite句柄在这里关闭,会导致ReadFile无限阻塞
- CloseHandle(hRead);
- }
- return TRUE;
- }
- if (bRet)
- {
- CloseHandle(hRead);
- CloseHandle(hWrite);
- }
- return FALSE;
- }
复制代码 |
|