Sandboxie/SandboxiePlus/SbieShell/SbieShell/main.cpp

194 lines
7.6 KiB
C++

#include <windows.h>
//#include <appmodel.h>
#include <winrt/Windows.Management.Deployment.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.ApplicationModel.h>
//#pragma comment(lib, "windowsapp.lib")
HMODULE g_combase = NULL;
extern "C"
{
int32_t __stdcall WINRT_GetRestrictedErrorInfo(void** info) noexcept {
typedef int32_t(__stdcall* FUNC)(void** info);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "GetRestrictedErrorInfo");
return Func(info);
}
int32_t __stdcall WINRT_RoGetActivationFactory(void* classId, winrt::guid const& iid, void** factory) noexcept {
typedef int32_t(__stdcall* FUNC)(void* classId, winrt::guid const& iid, void** factory);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "RoGetActivationFactory");
return Func(classId, iid, factory);
}
int32_t __stdcall WINRT_RoOriginateLanguageException(int32_t error, void* message, void* exception) noexcept {
typedef int32_t(__stdcall* FUNC)(int32_t error, void* message, void* exception);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "RoOriginateLanguageException");
return Func(error, message, exception);
}
int32_t __stdcall WINRT_SetRestrictedErrorInfo(void* info) noexcept {
typedef int32_t(__stdcall* FUNC)(void* info);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "SetRestrictedErrorInfo");
return Func(info);
}
int32_t __stdcall WINRT_WindowsCreateString(wchar_t const* sourceString, uint32_t length, void** string) noexcept {
typedef int32_t(__stdcall* FUNC)(wchar_t const* sourceString, uint32_t length, void** string);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "WindowsCreateString");
return Func(sourceString, length, string);
}
int32_t __stdcall WINRT_WindowsCreateStringReference(wchar_t const* sourceString, uint32_t length, void* hstringHeader, void** string) noexcept {
typedef int32_t(__stdcall* FUNC)(wchar_t const* sourceString, uint32_t length, void* hstringHeader, void** string);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "WindowsCreateStringReference");
return Func(sourceString, length, hstringHeader, string);
}
int32_t __stdcall WINRT_WindowsDeleteString(void* string) noexcept {
typedef int32_t(__stdcall* FUNC)(void* string);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "WindowsDeleteString");
return Func(string);
}
int32_t __stdcall WINRT_WindowsPreallocateStringBuffer(uint32_t length, wchar_t** charBuffer, void** bufferHandle) noexcept {
typedef int32_t(__stdcall* FUNC)(uint32_t length, wchar_t** charBuffer, void** bufferHandle);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "WindowsPreallocateStringBuffer");
return Func(length, charBuffer, bufferHandle);
}
int32_t __stdcall WINRT_WindowsDeleteStringBuffer(void* bufferHandle) noexcept {
typedef int32_t(__stdcall* FUNC)(void* bufferHandle);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "WindowsDeleteStringBuffer");
return Func(bufferHandle);
}
int32_t __stdcall WINRT_WindowsPromoteStringBuffer(void* bufferHandle, void** string) noexcept {
typedef int32_t(__stdcall* FUNC)(void* bufferHandle, void** string);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "WindowsPromoteStringBuffer");
return Func(bufferHandle, string);
}
wchar_t const* __stdcall WINRT_WindowsGetStringRawBuffer(void* string, uint32_t* length) noexcept {
typedef wchar_t const* (__stdcall* FUNC)(void* string, uint32_t* length);
static FUNC Func = NULL;
if (Func == NULL) Func = (FUNC)GetProcAddress(g_combase, "WindowsGetStringRawBuffer");
return Func(string, length);
}
}
int RegisterSparsePackage(const std::wstring& sparseExtPath, const std::wstring& sparsePackagePath)
{
winrt::Windows::Management::Deployment::PackageManager manager;
winrt::Windows::Management::Deployment::AddPackageOptions options;
winrt::Windows::Foundation::Uri externalUri(sparseExtPath.c_str());
winrt::Windows::Foundation::Uri packageUri(sparsePackagePath.c_str());
options.ExternalLocationUri(externalUri);
auto deploymentOperation = manager.AddPackageByUriAsync(packageUri, options);
auto deployResult = deploymentOperation.get();
if (!SUCCEEDED(deployResult.ExtendedErrorCode()))
{
// Deployment failed
std::wstring error = L"AddPackageByUriAsync failed (Errorcode: ";
error += std::to_wstring(deployResult.ExtendedErrorCode());
error += L"):\n";
error += deployResult.ErrorText();
return -1;
}
return 0;
}
int UnregisterSparsePackage(const std::wstring & sparsePackageName)
{
winrt::Windows::Management::Deployment::PackageManager manager;
winrt::Windows::Foundation::Collections::IIterable<winrt::Windows::ApplicationModel::Package> packages;
try
{
packages = manager.FindPackagesForUser(L"");
}
catch (winrt::hresult_error const& ex)
{
std::wstring error = L"FindPackagesForUser failed (Errorcode: ";
error += std::to_wstring(ex.code().value);
error += L"):\n";
error += ex.message();
return -1;
}
for (const auto& package : packages)
{
if (package.Id().Name() != sparsePackageName)
continue;
winrt::hstring fullName = package.Id().FullName();
auto deploymentOperation = manager.RemovePackageAsync(fullName, winrt::Windows::Management::Deployment::RemovalOptions::None);
auto deployResult = deploymentOperation.get();
if (SUCCEEDED(deployResult.ExtendedErrorCode()))
break;
// Undeployment failed
std::wstring error = L"RemovePackageAsync failed (Errorcode: ";
error += std::to_wstring(deployResult.ExtendedErrorCode());
error += L"):\n";
error += deployResult.ErrorText();
return -1;
}
return 0;
}
int wmain(int argc, wchar_t* argv[])
{
/*g_combase = LoadLibraryW(L"combase.dll");
if (argc < 2)
{
//wchar_t PackageName[MAX_PATH];
//UINT32 Length = MAX_PATH;
//NTSTATUS status = GetCurrentPackageFullName(&Length, PackageName);
//if (status >= 0)
// printf("%S", PackageName);
return 0;
}
if (wcsicmp(argv[1], L"-install") == 0)
{
wchar_t path[MAX_PATH];
GetModuleFileName(NULL, path, MAX_PATH);
wchar_t* ptr = wcsrchr(path, L'\\');
*ptr = L'\0';
std::wstring sparseExtPath = path;
wcscat(path, L"\\SbieShellPkg.msix");
std::wstring sparsePackagePath = path;
return RegisterSparsePackage(sparseExtPath, sparsePackagePath);
}
else if (wcsicmp(argv[1], L"-uninstall") == 0)
{
std::wstring sparsePackageName = L"SandboxieShell";
return UnregisterSparsePackage(sparsePackageName);
}*/
HMODULE ext = LoadLibraryW(L"SbieShellExt.dll");
typedef int (*FUNC)();
if (wcsicmp(argv[1], L"-install") == 0)
{
FUNC func = (FUNC)GetProcAddress(ext, "RegisterPackage");
func();
}
else if (wcsicmp(argv[1], L"-uninstall") == 0)
{
FUNC func = (FUNC)GetProcAddress(ext, "RemovePackage");
func();
}
return 0;
}