単一アプリケーション内のファイルシステムとレジストリの仮想化

こんにちは、KhabrovchansとKhabrovchanks!



私はboxedapp.comプロジェクトのメイン開発者であり、それについて少しお話ししたいと思います。 何らかの理由で、ロシア語を話すユーザーが私たちの開発に興味を持っていることはほとんどありません。



確かに多くの人がthinstallのことを聞いています。 これは、必要なすべてのファイルとレジストリキーと共にexeをパックして、どこでも実行できる単一のexeにすることができるツールです。



似たようなものを、開発者向けに直接作成することにしました。 仮想ファイル、レジストリキーなどを作成できるSDKの一種



そして実際、なぜこれが必要なのでしょうか?







たとえば、プログラムで使用される複数のdllがあります。 タスクはそれらを引き続き使用することですが、これらのファイルの存在の事実を隠すことです。 TEMPにdllを保存するオプションは良くありません-い、十分な権限を持っていない可能性がありますが、あなたは何を知っているのでしょう。 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); 
      





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); 
      





HMODULE hModule = LoadLibrary(_T("Z:\\DLL1.dll")); typedef void (WINAPI *P_Function)(); P_Function pFunction = (P_Function)GetProcAddress(hModule, "Function"); pFunction(); FreeLibrary(hModule);









これは簡単な例です。



ActiveXを使用したい場合はさらに興味深いですが、多くの理由でクライアントコンピューターにActiveXを展開できません。 たとえば、いわゆる ポータブルアプリケーション。 そして、ここで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")); } 
      





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ランタイム)が、さらに多くのことができます:)



読んだら、あなたの注意をありがとう!



All Articles