Как стать автором
Обновить

Виртуализация файловой системы и реестра внутри единственного приложения

Время на прочтение2 мин
Количество просмотров1.1K
Здравствуйте, Хабровчане и Хабровчанки!

Я — главный разработчик проекта boxedapp.com и хотел бы немного рассказать о нем, т.к. почему-то очень мало русскоязычных пользователей интересуется нашей разработкой.

Наверняка многие слышали о thinstall. Это инструмент, который позволяет упаковать exe вместе со всеми файлами и ключами реестра, которые ему требуются, в единственный exe, который можно потом запускать где угодно.

Мы решили создать нечто подобное, но непосредственно для разработчиков. Некий SDK, который позволяет создавать виртуальные файлы, ключи реестра и т.д.

А, собственно, зачем это может потребоваться?



Например, у нас есть несколько dll-ек, которые используются в программе. Стоит задача продолжать их использование, но скрыть факт наличия этих файлов. Вариант сохранить dll-ки во TEMP не годится — некрасиво, может не хватить прав, да мало ли что. С помощью BoxedApp можно создать виртуальный файл с DLL-кой, загрузить в нее содержимое (откуда угодно):

HANDLE hFile__DLL1 = 
	BoxedAppSDK_CreateVirtualFile(
		_T("Z:\\DLL1.dll"), 
		GENERIC_WRITE, 
		FILE_SHARE_READ, 
		NULL, 
		CREATE_NEW, 
		0, 
		NULL
	);

DWORD dwTemp;
WriteFile(hFile__DLL1, pBuffer, dwSize, &dwTemp, NULL);

CloseHandle(hFile__DLL1);



Теперь используем dll-ку, как если бы она реально существовала:

HMODULE hModule = LoadLibrary(_T("Z:\\DLL1.dll"));

typedef void (WINAPI *P_Function)();
P_Function pFunction = (P_Function)GetProcAddress(hModule, "Function");

pFunction();

FreeLibrary(hModule);



Это простой пример.

Куда интереснее, когда мы хотим использовать ActiveX, но по ряду причин не можем развернуть его на клиентском компьютере. Например, мы пишем т.н. portable-приложение. И тут может помочь BoxedApp:

void CreateVirtualFlashOCX()
{
	LPVOID pBuffer;
	DWORD dwSize;
...
	HANDLE hVirtualFile1 = 
		BoxedAppSDK_CreateVirtualFile(
			_T("C:\\Flash9e.ocx"), 
			GENERIC_READ, 
			FILE_SHARE_READ, 
			NULL, 
			CREATE_NEW, 
			0, 
			NULL);

	DWORD dwTemp;
	WriteFile(hVirtualFile1, pBuffer, dwSize, &dwTemp, NULL);

	CloseHandle(hVirtualFile1);

	BoxedAppSDK_RegisterCOMLibraryInVirtualRegistry(_T("C:\\Flash9e.ocx"));
}



BoxedAppSDK_RegisterCOMLibraryInVirtualRegistry загружает указанный в качестве аргумента модуль и регистрирует его в виртуальном реестре. Реальный реестр при этом не изменяется, а все изменения сохраняются локально внутри текущего процесса. Когда позже какая-то функция позовет CoCreateInstance, и из недр COM подсистемы произойдет обращение к реестру — BoxedApp предоставит нужные ключи, и COM-объект будет успешно создан.

BoxedApp может еще очень многое (например, упаковывать .net runtime), а будет уметь еще больше :)

Если дочитали, то спасибо за внимание!
Теги:
Хабы:
Всего голосов 20: ↑19 и ↓1+18
Комментарии13

Публикации

Истории

Ближайшие события

Конференция HR API 2024
Дата14 – 15 июня
Время10:00 – 18:00
Место
Санкт-ПетербургОнлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область