Something went wrong. Try again.
Reactos
Something went wrong. Try again.
5.0 kB · 160 lines
C
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161#define WIN32_NO_STATUS#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <shellapi.h>#include <shlobj.h>#include <setupapi.h>
#define NT_PARAMS L"NT3.51 Intel Params"#define MSSETUP_PATH L"~MSSETUP.T\\"
static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2){ FILE_IN_CABINET_INFO_W *pInfo; FILEPATHS_W *pFilePaths;
DBG_UNREFERENCED_LOCAL_VARIABLE(pFilePaths);
switch(Notification) { case SPFILENOTIFY_FILEINCABINET: pInfo = (FILE_IN_CABINET_INFO_W*)Param1; wcscpy(pInfo->FullTargetName, (LPCWSTR)Context); wcscat(pInfo->FullTargetName, pInfo->NameInCabinet); return FILEOP_DOIT; case SPFILENOTIFY_FILEEXTRACTED: pFilePaths = (FILEPATHS_W*)Param1; return NO_ERROR; } return NO_ERROR;}
BOOL DeleteDirectory(LPWSTR lpszDir){ SHFILEOPSTRUCT fileop; DWORD len = wcslen(lpszDir); WCHAR *pszFrom = HeapAlloc(GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR)); int ret;
wcscpy(pszFrom, lpszDir); pszFrom[len] = 0; pszFrom[len+1] = 0;
fileop.hwnd = NULL; fileop.wFunc = FO_DELETE; fileop.pFrom = pszFrom; fileop.pTo = NULL; fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT; fileop.fAnyOperationsAborted = FALSE; fileop.lpszProgressTitle = NULL; fileop.hNameMappings = NULL;
ret = SHFileOperation(&fileop); HeapFree(GetProcessHeap(), 0, pszFrom); return (ret == 0);}
VOID GetSystemDrive(LPWSTR lpszDrive){ WCHAR szWindir[MAX_PATH]; GetWindowsDirectoryW(szWindir, MAX_PATH); _wsplitpath(szWindir, lpszDrive, NULL, NULL, NULL); wcscat(lpszDrive, L"\\");}
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow){ WCHAR szSetupPath[MAX_PATH]; WCHAR szFileName[MAX_PATH]; WCHAR szCabFileName[MAX_PATH]; WCHAR szCabFilePath[MAX_PATH]; WCHAR szTempDirName[50]; WCHAR szCmdLine[MAX_PATH]; WCHAR szTempCmdLine[MAX_PATH]; WCHAR szTempPath[MAX_PATH]; WCHAR szFullTempPath[MAX_PATH]; WCHAR szDrive[4]; DWORD dwAttrib; PROCESS_INFORMATION processInfo; STARTUPINFO startupInfo; UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(nCmdShow);
GetCurrentDirectory(MAX_PATH, szSetupPath); wcscat(szSetupPath, L"\\"); wcscpy(szFileName, szSetupPath); wcscat(szFileName, L"setup.lst");
if (GetFileAttributes(szFileName) == INVALID_FILE_ATTRIBUTES) { MessageBoxW(0, L"Cannot find Setup.lst file", L"Error", MB_OK | MB_ICONERROR); return 1; }
/* read information from setup.lst */ GetPrivateProfileStringW(NT_PARAMS, L"CabinetFile", NULL, szCabFileName, MAX_PATH, szFileName); GetPrivateProfileStringW(NT_PARAMS, L"TmpDirName", NULL, szTempDirName, 50, szFileName); GetPrivateProfileStringW(NT_PARAMS, L"CmdLine", NULL, szCmdLine, MAX_PATH, szFileName);
wcscpy(szCabFilePath, szSetupPath); wcscat(szCabFilePath, szCabFileName);
/* ceate temp directory */ GetSystemDrive(szDrive); wcscpy(szTempPath, szDrive); wcscat(szTempPath, MSSETUP_PATH); wcscpy(szFullTempPath, szTempPath); wcscat(szFullTempPath, szTempDirName); wcscat(szFullTempPath, L"\\");
if (SHCreateDirectoryEx(0, szFullTempPath, NULL) != ERROR_SUCCESS) { MessageBoxW(0, L"Could not create Temp Directory.", L"Error", MB_OK | MB_ICONERROR); return 1; }
dwAttrib = GetFileAttributes(szTempPath); SetFileAttributes(szTempPath, dwAttrib | FILE_ATTRIBUTE_HIDDEN);
/* extract files */ if (!SetupIterateCabinetW(szCabFilePath, 0, ExtCabCallback, szFullTempPath)) { MessageBoxW(0, L"Could not extract cab file", L"Error", MB_OK | MB_ICONERROR); DeleteDirectory(szTempPath); return 1; }
/* prepare command line */ wsprintf(szTempCmdLine, szCmdLine, szFullTempPath, lpCmdLine); wcscpy(szCmdLine, szFullTempPath); wcscat(szCmdLine, szTempCmdLine);
/* execute the 32-Bit installer */ ZeroMemory(&processInfo, sizeof(processInfo)); ZeroMemory(&startupInfo, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); if (CreateProcessW(NULL, szCmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, szFullTempPath, &startupInfo, &processInfo)) { WaitForSingleObject(processInfo.hProcess, INFINITE); CloseHandle(processInfo.hProcess); CloseHandle(processInfo.hThread); } else { WCHAR szMsg[MAX_PATH]; wsprintf(szMsg, L"Failed to load the installer. Error %lu", GetLastError()); MessageBoxW(0, szMsg, L"Error", MB_OK | MB_ICONERROR); DeleteDirectory(szTempPath); return 1; }
/* cleanup */ DeleteDirectory(szTempPath);
return 0;}
/* EOF */