Beispiel #1
0
    virtual ActionStatus SetDefaultEntry(const ConstManagedPointer<AIBootConfigurationEntry> &pEntry)
    {
        if (!pEntry)
            return MAKE_STATUS(InvalidParameter);
        ManagedPointer<BootEntry> pBootEntry = pEntry;
        if (!pBootEntry || !pBootEntry->Valid())
            return MAKE_STATUS(InvalidParameter);

        BCDObject globalSettings = m_Store.GetFirstObjectOfType(BCDObject::GlobalSettings);
        if (!globalSettings.Valid())
            return MAKE_STATUS(UnknownError);

        return globalSettings.SetElement(BcdBootMgrObject_DefaultObject, pBootEntry->m_Object);
    }
Beispiel #2
0
    virtual ManagedPointer<AIBootConfigurationEntry> CopyEntry(const ConstManagedPointer<AIBootConfigurationEntry> &pEntry, bool AddToSelectionList = true, ActionStatus *pStatus = NULL)
    {
        if (!pEntry)
        {
            ASSIGN_STATUS(pStatus, InvalidParameter);
            return NULL;
        }
        ManagedPointer<BootEntry> pBootEntry = pEntry;
        if (!pBootEntry->Valid())
        {
            ASSIGN_STATUS(pStatus, InvalidParameter);
            return NULL;
        }


        BCDObject newObj = m_Store.CopyObject(pBootEntry->m_Object, pStatus);
        if (!newObj.Valid())
        {
            ASSIGN_SUBSTATUS(pStatus, *pStatus, UnknownError);
            return NULL;
        }

        if (AddToSelectionList)
        {
            BCDObject globalSettings = m_Store.GetFirstObjectOfType(BCDObject::GlobalSettings);
            if (!globalSettings.Valid())
            {
                ASSIGN_STATUS(pStatus, UnknownError);
                return NULL;
            }
            BCDObjectList selectionList = globalSettings.GetElement(BcdBootMgrObjectList_DisplayOrder).GetObjectList();
            if (!selectionList.Valid())
            {
                ASSIGN_STATUS(pStatus, UnknownError);
                return NULL;
            }

            ActionStatus st = selectionList.InsertObject(newObj);
            if (!st.Successful())
            {
                ASSIGN_SUBSTATUS(pStatus, st, UnknownError);
                return NULL;
            }
        }

        ASSIGN_STATUS(pStatus, Success);
        return new BootEntry(newObj);
    }
Beispiel #3
0
ActionStatus CreateVirtualKDBootEntry(bool CreateNewEntry, bool SetNewEntryDefault, LPCWSTR lpEntryName, unsigned Timeout)
{
	ManagedPointer<AIBootConfigurationEditor> pEditor = CreateConfigurationEditor();
	if (!pEditor)	
		return MAKE_STATUS(UnknownError);

	bool alreadyInstalled = false;
	ManagedPointer<AIBootConfigurationEntry> pEntry;

	ActionStatus st = FindBestOSEntry(&pEntry, &alreadyInstalled, pEditor);
	if (!st.Successful())
		return st;

	if (!pEntry)
		return MAKE_STATUS(NotSupported);

	if (CreateNewEntry && !alreadyInstalled)
		pEntry = pEditor->CopyEntry(pEntry, true, &st);

	if (!pEntry)
		return MAKE_STATUS(NotSupported);

	st = pEntry->EnableCustomKD(L"kdbazis.dll");
	if (!st.Successful())
		return COPY_STATUS(st);

	if (!st.Successful())
		return COPY_STATUS(st);
	if (!pEntry)
		return MAKE_STATUS(UnknownError);

	if (lpEntryName)
	{
		st = pEntry->SetDescription(lpEntryName);
		if (!st.Successful())
			return COPY_STATUS(st);
	}

	if (SetNewEntryDefault)
	{
		st = pEditor->SetDefaultEntry(pEntry);
		if (!st.Successful())
			return COPY_STATUS(st);
	}

	if (Timeout != -1)
	{
		st = pEditor->SetTimeout(Timeout);
		if (!st.Successful())
			return COPY_STATUS(st);
	}

	return pEditor->FinishEditing();
}
Beispiel #4
0
ActionStatus FindBestOSEntry(ManagedPointer<AIBootConfigurationEntry> *ppEntry, bool *pbAlreadyInstalled, ManagedPointer<AIBootConfigurationEditor> pEditor)
{
	ASSERT(ppEntry);

	*ppEntry = NULL;

	if (!pEditor)
		pEditor = CreateConfigurationEditor();
	if (!pEditor)
		return MAKE_STATUS(UnknownError);

	ActionStatus st = pEditor->StartEnumeration();
	if (!st.Successful())
		return st;

	if (pbAlreadyInstalled)
		*pbAlreadyInstalled = false;

	ManagedPointer<AIBootConfigurationEntry> pEntry, pCurrentOSEntry;
	while (pEntry = pEditor->GetNextEntry())
	{
		if (pEntry->IsCurrentOS())
		{
			if (!pCurrentOSEntry)
				pCurrentOSEntry = pEntry;

			if ((pEntry->GetDebuggerMode() == kdCustom) && (!pEntry->GetCustomKDName().icompare(_T("kdbazis.dll"))))
			{
				pCurrentOSEntry = pEntry;
				if (pbAlreadyInstalled)
					*pbAlreadyInstalled = true;
				break;
			}
		}
	}
	
	*ppEntry = pCurrentOSEntry;
	
	if (!pCurrentOSEntry)
		return MAKE_STATUS(NotSupported);
	return MAKE_STATUS(Success);
}
Beispiel #5
0
int AppMain()
{
	int argc;
	LPCWSTR lpCmdLine = GetCommandLineW();
	LPWSTR *ppArgv = CommandLineToArgvW(lpCmdLine, &argc);
	LPCWSTR lpDiskPath = NULL;
	bool ShowSettingsDialog = false, ForceMountOptions = false, AdminModeOnNetworkShare = false;
	bool bDisableUAC = false;
	char DriveLetterToRemount = 0;
	BazisLib::String tmpString;

	for (int i = 1; i < argc; i++)
	{
		if (ppArgv[i][0] != '/')
		{
			if (!lpDiskPath)
				lpDiskPath = ppArgv[i];
		}
		else
		{
			if (!_wcsicmp(ppArgv[i], L"/settings"))
				ShowSettingsDialog = true;
			else if (!_wcsicmp(ppArgv[i], L"/ltrselect"))
				ForceMountOptions = true;
			else if (!_wcsicmp(ppArgv[i], L"/uac_on_network_share"))
				AdminModeOnNetworkShare = true;
			else if (!_wcsicmp(ppArgv[i], L"/uacdisable"))
				bDisableUAC = true;
			else if (!_wcsicmp(ppArgv[i], L"/createiso") || !_wcsicmp(ppArgv[i], L"/isofromfolder"))
			{
				if (argc < (i + 2))
				{
					MessageBox(HWND_DESKTOP, _TR(IDS_BADCMDLINE, "Invalid command line!"), NULL, MB_ICONERROR);
					return 1;
				}
				ActionStatus st;
				if (!_wcsicmp(ppArgv[i], L"/isofromfolder"))
				{
					wchar_t *pwszFolder = ppArgv[i + 1];
					if (pwszFolder[0] && pwszFolder[wcslen(pwszFolder) - 1] == '\"')
						pwszFolder[wcslen(pwszFolder) - 1] = '\\';

					st = BuildISOFromFolder(pwszFolder);
				}
				else
					st = CreateISOFile(ppArgv[i + 1]);

				if (!st.Successful() && st.GetErrorCode() != OperationAborted)
					MessageBox(HWND_DESKTOP, st.GetMostInformativeText().c_str(), NULL, MB_ICONERROR);
				return !st.Successful();
			}
			else if (!_wcsnicmp(ppArgv[i], L"/remount:", 9))
				DriveLetterToRemount = (char)ppArgv[i][9];
		}
	}

	if (bDisableUAC)
	{
		RegistryKey driverParametersKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\BazisVirtualCDBus\\Parameters"));
		int prevVal = driverParametersKey[_T("GrantAccessToEveryone")];
		int newVal = 1;
		driverParametersKey[_T("GrantAccessToEveryone")] = newVal;

		if (prevVal != newVal)
			VirtualCDClient::RestartDriver();

		return 0;
	}

	if (GetKeyState(VK_SHIFT) & (1 << 31))
		ForceMountOptions = true;

	if (!lpDiskPath && DriveLetterToRemount)
	{
		const TCHAR *pwszFilter = _TR(IDS_ISOFILTER, "ISO images (*.iso)|*.iso|All files (*.*)|*.*");
		TCHAR tszFilter[128] = { 0, };
		_tcsncpy(tszFilter, pwszFilter, _countof(tszFilter) - 1);
		for (size_t i = 0; i < _countof(tszFilter); i++)
		if (tszFilter[i] == '|')
			tszFilter[i] = '\0';

		CFileDialog dlg(true, _T("iso"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, tszFilter);
		dlg.m_ofn.lpstrTitle = _TR(IDS_MOUNTIMAGE, "Mount a disc image");

		if (dlg.DoModal() != IDOK)
			return 1;

		tmpString.assign(dlg.m_szFileName);
		lpDiskPath = tmpString.c_str();
	}

	if ((argc < 2) || !ppArgv || !lpDiskPath || ShowSettingsDialog)
	{
		return ::ShowSettingsDialog();
	}

	MMCProfile detectedProfile = mpInvalid;
	bool bFileOnNetworkShare = false;

	{
		TCHAR tszFullPath[MAX_PATH] = {0,};
		GetFullPathName(lpDiskPath, __countof(tszFullPath), tszFullPath, NULL);
		TCHAR tszRoot[4] = {tszFullPath[0], ':', '\\', 0};
		if (GetDriveType(tszRoot) == DRIVE_REMOTE)
			bFileOnNetworkShare = true;

		ImageFormatDatabase imageFormatDB;
		ManagedPointer<AIParsedCDImage> pImage = imageFormatDB.OpenCDImage(ManagedPointer<AIFile>(new ACFile(tszFullPath, FileModes::OpenReadOnly.ShareAll())), tszFullPath);
		if (!pImage)
		{
			if (AdminModeOnNetworkShare)
				MessageBox(HWND_DESKTOP, _TR(IDS_UACNETWORKWARNING, "Cannot open image file. To mount images from network drives, go to WinCDEmu settings and allow mounting drives without administrator privileges."), NULL, MB_ICONERROR);
			else
				MessageBox(HWND_DESKTOP, _TR(ISD_CORRUPTIMAGE, "Unknown or corrupt image file!"), NULL, MB_ICONERROR);
			return 1;
		}
		if (pImage->GetTrackCount() != 1)
			detectedProfile = mpCdrom;
		else
		{
			UDFAnalysisResult result = AnalyzeUDFImage(pImage);
			if (!result.isUDF)
				detectedProfile = mpInvalid;
			else if (result.foundBDMV)
				detectedProfile = mpBDRSequentialWritable;
			else if (result.foundVIDEO_TS)
				detectedProfile = mpDvdRecordable;
		}

		/*if ((detectedProfile == mpCdrom) || (detectedProfile == mpInvalid))
		{
			if (pImage->GetSectorCount() >= ((10LL * 1024LL * 1024LL * 1024LL / 2048)))
				detectedProfile = mpBDRSequentialWritable;
			else if (pImage->GetSectorCount() >= ((1LL * 1024LL * 1024LL * 1024LL / 2048)))
				detectedProfile = mpDvdRecordable;
		}*/
	}

	wchar_t wszKernelPath[512];
	if (!VirtualCDClient::Win32FileNameToKernelFileName(lpDiskPath, wszKernelPath, __countof(wszKernelPath)))
	{
		MessageBox(HWND_DESKTOP, _TR(IDS_BADIMGFN, "Invalid image file name!"), NULL, MB_ICONERROR);
		return 1;
	}

	bool bDiskConnected = false;
	ActionStatus status;

	{
		VirtualCDClient clt(&status);
		if (!clt.Valid())
		{
			if (status.GetErrorCode() == BazisLib::AccessDenied)
			{
				if (bFileOnNetworkShare)
					return (int)CUACInvokerDialog((String(GetCommandLine()) + L" /uac_on_network_share").c_str()).DoModal();
				else
					return (int)CUACInvokerDialog(GetCommandLine()).DoModal();
			}

			MessageBox(HWND_DESKTOP, _TR(IDS_NOBUS, "Cannot connect to BazisVirtualCD.sys!"), NULL, MB_ICONERROR);
			return 1;
		}


		bDiskConnected = clt.IsDiskConnected(wszKernelPath);
	}

	if (DriveLetterToRemount != 0)
	{
		if (bDiskConnected)
		{
			MessageBox(HWND_DESKTOP, String::sFormat(_TR(IDS_ALREADYMOUNTED, "%s is already mounted."), lpDiskPath).c_str(), NULL, MB_ICONERROR);
			status = MAKE_STATUS(OperationAborted);
		}
		else
			status = VirtualCDClient::MountImageOnExistingDrive(wszKernelPath, DriveLetterToRemount);
	}
	else if (!bDiskConnected)
	{
		RegistryParams params;

		char driveLetter = 0;
		bool disableAutorun = false, persistent = false;
		if ((params.DriveLetterPolicy == drvlAskEveryTime) || ForceMountOptions)
		{
			CLetterSelectionDialog dlg(ForceMountOptions, detectedProfile);
			if (dlg.DoModal() != IDOK)
				return 3;
			driveLetter = dlg.GetDriveLetter();
			disableAutorun = dlg.IsAutorunDisabled();
			persistent = dlg.IsPersistent();
			detectedProfile = dlg.GetMMCProfile();

#ifdef WINCDEMU_DEBUG_LOGGING_SUPPORT
			if (dlg.IsDebugLoggingEnabled())
			{
				FilePath fpDir = FilePath::GetSpecialDirectoryLocation(SpecialDirFromCSIDL(CSIDL_APPDATA)).PlusPath(L"WinCDEmu.debug");
				bool cancel = false;
				if (!Directory::Exists(fpDir))
					cancel = MessageBox(0, String::sFormat(L"WinCDEmu will create a directory for debugging log files (%s). If you encounter problems using WinCDEmu, please submit the most recent log file to [email protected]. Continue?", fpDir.c_str()).c_str() , L"Information", MB_OKCANCEL | MB_ICONINFORMATION) != IDOK;
				if (!cancel)
				{
					CreateDirectory(fpDir.c_str(), NULL);
					wchar_t wszKernelDirPath[512];
					if (VirtualCDClient::Win32FileNameToKernelFileName(fpDir.c_str(), wszKernelDirPath, __countof(wszKernelDirPath)))
						VirtualCDClient().SetDebugLogDirectory(wszKernelDirPath);
				}
			}
			else
				VirtualCDClient().SetDebugLogDirectory(NULL);
#endif
		}
		else
		{
			disableAutorun = params.DisableAutorun;
			persistent = params.PersistentDefault;
			if (detectedProfile == mpInvalid)
				detectedProfile = (MMCProfile)params.DefaultMMCProfile;
			if (params.DriveLetterPolicy == drvlStartingFromGiven)
			{
				DWORD dwMask = GetLogicalDrives();
				unsigned char ch = 'A' + params.StartingDriveLetterIndex;
				for (unsigned i = (1 << (ch - 'A')); ch <= 'Z'; ch++, i <<= 1)
					if (!(dwMask & i))
					{
						driveLetter = ch;
						break;
					}

			}
		}
		status = VirtualCDClient().ConnectDisk(wszKernelPath, driveLetter, 0, disableAutorun, persistent, AutorunErrorHandler, detectedProfile);
	}
	else
		status = VirtualCDClient().DisconnectDisk(wszKernelPath);

	if (!status.Successful())
	{
		if (status.GetErrorCode() != OperationAborted)
			MessageBox(HWND_DESKTOP, status.GetMostInformativeText().c_str(), NULL, MB_ICONERROR);
		return 1;
	}
	return 0;
}
Beispiel #6
0
bool LocalizableStringManager::ParseSourceFile( const BazisLib::String &fp )
{
	ManagedPointer<TextANSIFileReader> pRdr = new TextANSIFileReader(new ACFile(fp, FileModes::OpenReadOnly));
	if (!pRdr->Valid())
	{
		_tprintf(_T("ERROR: cannot open %s\n"), fp.c_str());
		return false;
	}
	_tprintf(_T("  %s\n"), Path::GetFileName(fp).c_str());

	bool insideCCommentBlock = false;
	bool insideStringConstant = false;

	unsigned lineNum = 0;

	DynamicString currentDialogID;

	while (!pRdr->IsEOF())
	{
		size_t LocalizationTokenStart = -1;
		enum
		{
			ltUnknown = 0,
			ltTR,
			ltDIALOG,
			ltDLGITEM,
		} localizationTokenType;

		lineNum++;
		DynamicStringA line = pRdr->ReadLine();

		if (line[0] == '#')
			break;
			
		unsigned backslashCount = 0;
		char prevChar = 0, ch = 0;

		size_t lastStringStart = -1, lastStringLen = 0;

		for (size_t i = 0; i < line.length(); i++, prevChar = ch)
		{
			//Even amount of backslashes followed by quotation mark toggles string constant flag (outside comment block)
			//The "/*" and "*/" sequences outside string block change the comment flag.
			//The "//" sequence skips everything till the end of the string
			//At the end of each line inside the string block there should be a backslash
			ch = line[i];

			bool isLastChar = (i == (line.length() - 1));

			if (insideCCommentBlock)
			{
				if ((ch == '/') && (prevChar == '*'))
					insideCCommentBlock = false;
			}
			else	//Outside comment block - detect string literals
			{
				if (ch == '\\')
					backslashCount++;
				else 
				{
					if (((ch == '\"') || (ch == '\'')) && !(backslashCount % 2))
					{
						if (!insideStringConstant)
							lastStringStart = i + 1, lastStringLen = 0;
						else
							lastStringLen = i - lastStringStart;

						insideStringConstant = !insideStringConstant;
					}
					backslashCount = 0;
				}

				if (!insideStringConstant)	//Outside comment and string blocks - check for comment start
				{
					if ((ch == '*') && (prevChar == '/'))
						insideCCommentBlock = true;
					if ((ch == '/') && (prevChar == '/'))
						break;
				}
				else	//Inside string block
				{
					if (isLastChar && (ch != '\\'))
					{
						_tprintf(_T("%s(%d) : error: Unterminated string"), GetFullPath(fp).c_str(), lineNum);
						return false;
					}
				}
			}

			//Here, both insideCCommentBlock and insideStringConstant reflect the real file context. So, let's find "_TR()" and LOCALIZE_DIALOG()/LOCALIZE_DLGITEM()
			if (!insideCCommentBlock && !insideStringConstant)
			{
				if (!IsValidCTokenChar(prevChar))
				{
					size_t newTokenStart = -1;
					size_t remaining = line.length() - i;
					if ((remaining > 4) && (line.substr(i, 3) == "_TR") && !IsValidCTokenChar(line[i + 3]))
						newTokenStart = i + 3, localizationTokenType = ltTR;
					else if ((remaining > 16) && (line.substr(i, 15) == "LOCALIZE_DIALOG") && !IsValidCTokenChar(line[i + 15]))
						newTokenStart = i + 15, localizationTokenType = ltDIALOG;
					else if ((remaining > 17) && (line.substr(i, 16) == "LOCALIZE_DLGITEM") && !IsValidCTokenChar(line[i + 16]))
						newTokenStart = i + 16, localizationTokenType = ltDLGITEM;

					if (newTokenStart != -1)
					{
						if (LocalizationTokenStart != -1)
						{
							_tprintf(_T("%s(%d) : error: Localization token used recursively"), GetFullPath(fp).c_str(), lineNum);
							return false;
						}
						LocalizationTokenStart = newTokenStart;
						
						lastStringStart = -1;
						lastStringLen = 0;
					}

				}
				if (ch == '}')
					currentDialogID.clear();

				if ((ch == ')') && (LocalizationTokenStart != -1))
				{
					size_t tokenParamsStart = line.find_first_not_of(" \t()", LocalizationTokenStart);
					TempStringA tokenParams = line.substr(tokenParamsStart, i - LocalizationTokenStart);
					if (tokenParams.empty())
					{
						_tprintf(_T("%s(%d) : error: Empty localization macro"), GetFullPath(fp).c_str(), lineNum);
						return false;
					}
					if (localizationTokenType == ltTR)
					{
						if ((lastStringStart == -1) || !lastStringLen)
						{
							_tprintf(_T("%s(%d) : error: Invalid _TR() statement - default string not found"), GetFullPath(fp).c_str(), lineNum);
							return false;
						}
						DynamicString lastString = ANSIStringToString(line.substr(lastStringStart, lastStringLen));

						size_t idEnd = tokenParams.find_first_of(" ,");
						DynamicString id = ANSIStringToString(tokenParams.substr(0, (idEnd == -1) ? 0 : idEnd));
						if (id.empty())
						{
							_tprintf(_T("%s(%d) : error: Invalid _TR() statement - cannot determine string ID"), GetFullPath(fp).c_str(), lineNum);
							return false;
						}

						const DynamicString &existingValue = m_Strings[id].Value;
						if (!existingValue.empty() && (existingValue != lastString))
							_tprintf(_T("%s(%d) : warning: %s redefined with different value\n"), GetFullPath(fp).c_str(), lineNum, id.c_str());

						m_Strings[id].Value = lastString;
					}
					else
					{
						_FixedSetOfCharsSplitString<2, TempStringA> params(tokenParams, ", \t");
						if (params.count() < 2)
						{
							_tprintf(_T("%s(%d) : error: Invalid LOCALIZE_xxx() statement - less than 2 arguments\n"), GetFullPath(fp).c_str(), lineNum);
							return false;
						}

						DynamicString stringId = ANSIStringToString(params[0]);
						if (stringId.empty())
						{
							_tprintf(_T("%s(%d) : error: Invalid LOCALIZE_xxx() statement - empty string ID\n"), GetFullPath(fp).c_str(), lineNum);
							return false;
						}

						if (localizationTokenType == ltDIALOG)
						{
							DynamicString dlgID = ANSIStringToString(params[1]);
							if (m_Dialogs.find(dlgID) == m_Dialogs.end())
							{
								_tprintf(_T("%s(%d) : error: Cannot find dialog %s\n"), GetFullPath(fp).c_str(), lineNum, dlgID.c_str());
								return false;
							}
							m_Dialogs[dlgID].Localized = true;
							m_Dialogs[dlgID].LocalizationFileAndLine.Format(_T("%s(%d)"), GetFullPath(fp).c_str(), lineNum);
							m_Strings[stringId].Value = m_Dialogs[dlgID].Caption;
							currentDialogID = dlgID;
						}
						else if (localizationTokenType == ltDLGITEM)
						{
							if (currentDialogID.empty())
							{
								_tprintf(_T("%s(%d) : error: LOCALIZE_DLGITEM() used outside LOCALIZE_DIALOG() block\n"), GetFullPath(fp).c_str(), lineNum);
								return false;
							}
							DynamicString itemID = ANSIStringToString(params[1]);
							std::map<BazisLib::String, DialogMember>::iterator it = m_Dialogs[currentDialogID].DialogMembers.find(itemID);
							if ((stringId == _T("0")) || !stringId.icompare(_T("NULL")))
							{
								it->second.Skipped = true;
								continue;
							}
							if (it == m_Dialogs[currentDialogID].DialogMembers.end())
							{
								_tprintf(_T("%s(%d) : error: %s is not defined in %s\n"), GetFullPath(fp).c_str(), lineNum, itemID.c_str(), currentDialogID.c_str());
								return false;
							}
							m_Strings[stringId].Value = it->second.Name;
							it->second.Localized = true;
						}

					}
					LocalizationTokenStart = -1;
				}
			}
		}

	}
	return true;
}
Beispiel #7
0
bool LocalizableStringManager::ParseResourceFile( const BazisLib::String &fp )
{
	ManagedPointer<TextANSIFileReader> pRdr = new TextANSIFileReader(new ACFile(fp, FileModes::OpenReadOnly));
	if (!pRdr->Valid())
	{
		_tprintf(_T("ERROR: cannot open %s\n"), fp.c_str());
		return false;
	}
	_tprintf(_T("  %s\n"), DynamicString(Path::GetFileName((fp))).c_str());

	DynamicString dialogName;
	bool insideDialogDescription = false;
	size_t spacingBeforeDlgitem = -1;

	unsigned lineNum = 0;

	while (!pRdr->IsEOF())
	{
		lineNum++;
		DynamicStringA line = pRdr->ReadLine();
		_FixedCharacterSplitString<2, TempStringA> tokens(line, ' ');
		if (!tokens.count())
			continue;
		if (!tokens[0].icompare("BEGIN"))
			insideDialogDescription = true;
		else if (!tokens[0].icompare("END"))
			dialogName.clear(), insideDialogDescription = false;
		else if (!tokens[1].icompare("DIALOGEX"))
		{
			dialogName = ANSIStringToString(tokens[0]), insideDialogDescription = false;
			m_Dialogs[dialogName].FileAndLine.Format(_T("%s(%d)"), GetFullPath(fp).c_str(), lineNum);
		}
		else if (!line.substr(0, 8).icompare("CAPTION ") && !dialogName.empty() && !insideDialogDescription)
		{
			TempStringA dlgCaption = line.substr(9);
			size_t lastQuote = dlgCaption.find_last_of('\"');
			if (lastQuote != -1)
				dlgCaption = dlgCaption.substr(0, lastQuote);

			DynamicString translatedCaption = ANSIStringToString(dlgCaption);
			for (size_t idx = 0; idx < (translatedCaption.length() - 1); idx++)
			{
				if ((translatedCaption[idx] == '\"') && (translatedCaption[idx + 1] == '\"'))
					translatedCaption.erase(idx, 1);
			}
			m_Dialogs[dialogName].Caption = FormatStringASCString(translatedCaption);
		}
		else if (insideDialogDescription && !dialogName.empty())
		{
			if (spacingBeforeDlgitem == -1)
				spacingBeforeDlgitem = line.find_first_not_of(" \t");
			if (spacingBeforeDlgitem == -1)
				continue;

			if ((line.length() <= spacingBeforeDlgitem) || (line[spacingBeforeDlgitem] == ' ') || (line[spacingBeforeDlgitem] == '\t'))
				continue;

			_FixedSetOfCharsSplitString<1, TempStringA> tokens2(line.substr(spacingBeforeDlgitem), " \t");
			if (tokens2.count() < 1)
				continue;

			if (!tokens2[0].length())
				continue;

			size_t nameStart = tokens2.GetRemainderOffset();
			if (nameStart == -1)
				continue;

			nameStart = line.find_first_not_of(" \t", nameStart + spacingBeforeDlgitem);

			if ((nameStart == -1) || (line[nameStart] != '\"'))
				continue;

			nameStart++;

			char prevChar = 0;
			size_t nameEnd;
			for (nameEnd = nameStart; nameEnd < line.length(); nameEnd++)
			{
				if (line[nameEnd] == '\"')
				{
					if (((nameEnd + 1) < line.length()) && (line[nameEnd + 1] == '\"'))
					{
						nameEnd++;
						continue;
					}
					else
						break;
				}
			}

			DynamicStringA itemText = line.substr(nameStart, nameEnd - nameStart);

			for (size_t idx = 0; (idx + 1) < itemText.length(); idx++)
			{
				if ((itemText[idx] == '\"') && (itemText[idx + 1] == '\"'))
					itemText.erase(idx, 1);
			}


			size_t IDOffset = line.find_first_not_of(" \t,", nameEnd + 1);
			if (IDOffset == -1)
				continue;
			size_t IDEnd = line.find_first_of(" \t,", IDOffset);

			TempStringA itemID = line.substr(IDOffset, (IDEnd == -1) ? -1 : IDEnd - IDOffset);

			m_Dialogs[dialogName].DialogMembers[ANSIStringToString(itemID)].Name = FormatStringASCString(ANSIStringToString(itemText));
			
		}
	}
	return true;
}
Beispiel #8
0
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
	// center the dialog on the screen
	CenterWindow();

	// set icons
	HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
		IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
	SetIcon(hIcon, TRUE);
	HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
		IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
	SetIcon(hIconSmall, FALSE);

	bHandled = FALSE;

	DlgResize_Init();

	ManagedPointer<AIBootConfigurationEntry> pEntry;
	bool bAlreadyInstalled = false;

	ManagedPointer<AIBootConfigurationEditor> pEditor = CreateConfigurationEditor();
	if (!pEditor)
	{
		::MessageBox(HWND_DESKTOP,
			_T("Cannot access boot configuration data"),
			NULL,
			MB_ICONERROR);
		EndDialog(0);
		return 0;
	}

	ActionStatus st = FindBestOSEntry(&pEntry, &bAlreadyInstalled, pEditor);
	if (!st.Successful())	
	{
		::MessageBox(HWND_DESKTOP,
				   String::sFormat(_T("Cannot access boot configuration data: %s"), st.GetMostInformativeText().c_str()).c_str(),
				   NULL,
				   MB_ICONERROR);
		EndDialog(0);
		return 0;
	}

	m_ExistingEntryName = pEntry->GetDescription();
	SetDlgItemText(IDC_REUSEENTRY, String::sFormat(_T("Use existing entry (%s)"), m_ExistingEntryName.c_str()).c_str());
	SendDlgItemMessage(IDC_SETDEFAULT, BM_SETCHECK, BST_CHECKED);
	SendDlgItemMessage(IDC_KDCOM, BM_SETCHECK, BST_CHECKED);

	SendDlgItemMessage(bAlreadyInstalled ? IDC_REUSEENTRY : IDC_NEWENTRY, BM_SETCHECK, BST_CHECKED);
	::EnableWindow(GetDlgItem(IDC_ENTRYNAME), !bAlreadyInstalled);

	if (m_ExistingEntryName.ifind(_T("[VirtualKD]")) != -1)
	{
		SendDlgItemMessage(IDC_ADDSUFFIX, BM_SETCHECK, BST_UNCHECKED);
		::EnableWindow(GetDlgItem(IDC_ADDSUFFIX), FALSE);
		SetDlgItemText(IDC_ENTRYNAME, m_ExistingEntryName.c_str());
	}
	else
	{
		SendDlgItemMessage(IDC_ADDSUFFIX, BM_SETCHECK, BST_CHECKED);
		if (IsWin8OrLater())
			SetDlgItemText(IDC_ENTRYNAME, _T("Disable Signature Enforcement Manually!!! (Press F8) [VirtualKD]"));
		else
			SetDlgItemText(IDC_ENTRYNAME, (m_ExistingEntryName + _T(" [VirtualKD]")).c_str());
	}

	SetDlgItemInt(IDC_TIMEOUT, pEditor->GetTimeout());

#ifdef SUPPORT_VISUALDDK
	SendDlgItemMessage(IDC_INSTALLVDDK, BM_SETCHECK, BST_CHECKED);

	TCHAR tszWinDir[MAX_PATH] = {0,};
	GetWindowsDirectory(tszWinDir, _countof(tszWinDir));

	TCHAR *p = _tcschr(tszWinDir, '\\');
	if (p)
		p[1] = 0;

	SetDlgItemText(IDC_VDDKLOCATION, tszWinDir);

	SetWindowText(_T("Install VirtualKD and VisualDDK Monitor on Virtual Machine"));

#else
	::EnableWindow(GetDlgItem(IDC_INSTALLVDDK), FALSE);
	::EnableWindow(GetDlgItem(IDC_VDDKLOCATION), FALSE);
#endif

	if (_tcsstr(GetCommandLine(), _T("/AUTO")))
		PostMessage(WM_COMMAND, IDOK);

	return TRUE;
}
Beispiel #9
0
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	// center the dialog on the screen
	CenterWindow();

	m_ComboBox.m_hWnd = GetDlgItem(IDC_COMBO1);

	TCHAR tsz[MAX_PATH] = {0,};
	GetModuleFileName(GetModuleHandle(NULL), tsz, __countof(tsz));
	String samplesDir = Path::GetDirectoryName(TempStrPointerWrapper(tsz));

	for (BazisLib::Directory::enumerator itPlatform = Directory(samplesDir).FindFirstFile(L"*"); itPlatform.Valid(); itPlatform.Next())
	{
		if (!itPlatform.IsDirectory())
			continue;
		if (itPlatform.GetRelativePath().c_str()[0] == '.')
			continue;

		for (BazisLib::Directory::enumerator itSample = Directory(itPlatform.GetFullPath()).FindFirstFile(L"*"); itSample.Valid(); itSample.Next())
		{
			if (!itSample.IsDirectory())
				continue;
			if (itSample.GetRelativePath().c_str()[0] == '.')
				continue;

			for (BazisLib::Directory::enumerator it = Directory(itSample.GetFullPath()).FindFirstFile(L"*.inf"); it.Valid(); it.Next())
			{
				ManagedPointer<AIFile> pFile = new ACFile(it.GetFullPath(), FileModes::OpenReadOnly);
				ManagedPointer<BazisLib::TextANSIUNIXFileReader> pReader = new BazisLib::TextANSIUNIXFileReader(pFile);
				if (!pReader->Valid())
					continue;

				String description;

				while (!pReader->IsEOF())
				{
					DynamicStringA str = pReader->ReadLine();
					if (str.length() && str[0] != ';')
						break;
					description += ANSIStringToString(str.substr(1));
					description += L"\r\n";
				}

				ProjectDescription desc;
				desc.SampleName = Path::GetFileNameWithoutExtension(it.GetFullPath());
				desc.SampleDescription = description;
				desc.INFFile = it.GetFullPath();

				m_Projects.push_back(desc);
				m_ComboBox.InsertString(-1, String::sFormat(L"%s - %s", desc.SampleName.c_str(), itPlatform.GetRelativePath().c_str()).c_str());
			}
		}
	}

	// set icons
	HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
		IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
	SetIcon(hIcon, TRUE);
	HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
		IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
	SetIcon(hIconSmall, FALSE);

	::EnableWindow(GetDlgItem(IDC_BUTTON1), FALSE);
	::EnableWindow(GetDlgItem(IDC_BUTTON2), FALSE);

	// register object for message filtering and idle updates
// 	CMessageLoop* pLoop = _Module.GetMessageLoop();
// 	ATLASSERT(pLoop != NULL);
// 	pLoop->AddMessageFilter(this);
// 	pLoop->AddIdleHandler(this);

	UIAddChildWindowContainer(m_hWnd);

	return TRUE;
}