windows-nt/Source/XPSP1/NT/net/rras/cm/cmsetup/extractcm.cpp

77 lines
2.3 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include <windows.h>
#include <shellapi.h>
//+----------------------------------------------------------------------------
//
// Function: ExtractCmBinsFromExe
//
// Synopsis: Launches cmbins.exe to extract the cm binaries from the executable
// cab file.
//
// Arguments: LPTSTR pszPathToExtractFrom -- path where cmbins.exe lives
// LPTSTR pszPathToExtractTo -- path to where cm binaries are extracted to
//
// Returns: HRESULT - standard COM error codes
//
// History: quintinb Created 03/14/2001
//
//+----------------------------------------------------------------------------
HRESULT ExtractCmBinsFromExe(LPTSTR pszPathToExtractFrom, LPTSTR pszPathToExtractTo)
{
HRESULT hr = E_INVALIDARG;
if (pszPathToExtractTo && (TEXT('\0') != pszPathToExtractTo[0]) &&
pszPathToExtractFrom && (TEXT('\0') != pszPathToExtractFrom[0]))
{
TCHAR szFile[MAX_PATH+1] = {0};
TCHAR szParams[MAX_PATH+1] = {0};
LPCTSTR c_pszParamsFmt = TEXT("/c /q /t:%s");
LPCTSTR c_pszFileFmt = TEXT("%scmbins.exe");
LPCTSTR c_pszFileFmtWithSlash = TEXT("%s\\cmbins.exe");
wsprintf(szParams, c_pszParamsFmt, pszPathToExtractTo);
if (TEXT('\\') == pszPathToExtractFrom[lstrlen(pszPathToExtractFrom) - 1])
{
wsprintf(szFile, c_pszFileFmt, pszPathToExtractFrom);
}
else
{
wsprintf(szFile, c_pszFileFmtWithSlash, pszPathToExtractFrom);
}
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
sei.nShow = SW_SHOWNORMAL;
sei.lpFile = szFile;
sei.lpParameters = szParams;
sei.lpDirectory = pszPathToExtractFrom;
if (ShellExecuteEx(&sei))
{
if (sei.hProcess)
{
WaitForSingleObject(sei.hProcess, 1000*60*1); // wait for one minute.
CloseHandle(sei.hProcess);
}
hr = S_OK;
}
else
{
hr = HRESULT_FROM_WIN32(GetLastError());
//
// Make sure to return failure
//
if (SUCCEEDED(hr))
{
hr = E_UNEXPECTED;
}
}
}
return hr;
}