This commit is contained in:
DavidXanatos 2023-05-08 09:39:27 +02:00
parent 8391574061
commit 8399c6ad65
3 changed files with 80 additions and 37 deletions

View File

@ -9,6 +9,12 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Added
- added setting to disable overlay icons
- added ability to specify sandboxie.ini location in registry
- open "HKLM\SYSTEM\CurrentControlSet\Services\SbieDrv" and set "IniPath"
- use a for the path like "\??\C:\my_path\my_sandboxie.ini"
### Changed
- improved hadling of dll injection failure
### Fixed
- fixed issue with command lines [#2858](https://github.com/sandboxie-plus/Sandboxie/issues/2858)
@ -16,6 +22,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
## [1.9.2 / 5.64.2] - 2023-04-24
### Added

View File

@ -1,6 +1,6 @@
/*
* Copyright 2004-2020 Sandboxie Holdings, LLC
* Copyright 2020-2021 David Xanatos, xanasoft.com
* Copyright 2020-2023 David Xanatos, xanasoft.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -64,7 +64,8 @@ typedef struct _CONF_DATA {
#ifdef USE_CONF_MAP
HASH_MAP sections_map;
#endif
BOOLEAN home; // TRUE if configuration read from Driver_Home_Path
ULONG home; // 1 if configuration read from Driver_Home_Path
WCHAR* path;
ULONG encoding; // 0 - unicode, 1 - utf8, 2 - unicode (byte swapped)
volatile ULONG use_count;
@ -203,7 +204,7 @@ _FX NTSTATUS Conf_Read(ULONG session_id)
WCHAR linenum_str[32];
ULONG path_len;
WCHAR *path = NULL;
BOOLEAN path_home;
ULONG path_home;
STREAM *stream = NULL;
POOL *pool;
@ -212,29 +213,59 @@ _FX NTSTATUS Conf_Read(ULONG session_id)
// or (Home Path)\Sandboxie.ini
//
path_len = 32; // room for \SystemRoot
if (path_len < wcslen(Driver_HomePathDos) * sizeof(WCHAR))
path_len = wcslen(Driver_HomePathDos) * sizeof(WCHAR);
path_len += 64; // room for \Sandboxie.ini
path_len = 260 * sizeof(WCHAR);
//path_len = 32; // room for \SystemRoot
if (path_len < wcslen(Driver_HomePathDos) * sizeof(WCHAR) + 64)
path_len = wcslen(Driver_HomePathDos) * sizeof(WCHAR) + 64;
//path_len += 64; // room for \Sandboxie.ini
path = ExAllocatePoolWithTag(PagedPool, path_len, tzuk);
if (! path)
pool = Pool_Create();
if (! pool)
return STATUS_INSUFFICIENT_RESOURCES;
path = Mem_Alloc(pool, path_len);
if (! path) {
Pool_Delete(pool);
return STATUS_INSUFFICIENT_RESOURCES;
}
//
// try open a custom configuration file, if set
//
UNICODE_STRING IniPath = { 0, (USHORT)path_len - (4 * sizeof(WCHAR)), path };
status = GetRegString(RTL_REGISTRY_ABSOLUTE, Driver_RegistryPath, L"IniPath", &IniPath);
if (NT_SUCCESS(status)) {
if (path[0] != L'\\') {
wmemmove(path + 4, path, (IniPath.Length / sizeof(WCHAR)) + 1);
wmemcpy(path, L"\\??\\", 4);
}
path_home = 2;
status = Stream_Open(
&stream, path,
FILE_GENERIC_READ, 0, FILE_SHARE_READ, FILE_OPEN, 0);
}
//
// open the configuration file, try both places, home first
//
path_home = TRUE; // = FALSE;
RtlStringCbPrintfW(path, path_len, path_sandboxie, Driver_HomePathDos); // , SystemRoot);
if (!NT_SUCCESS(status)) {
path_home = 1;
RtlStringCbPrintfW(path, path_len, path_sandboxie, Driver_HomePathDos);
status = Stream_Open(
&stream, path, FILE_GENERIC_READ, 0, FILE_SHARE_READ, FILE_OPEN, 0);
}
if (status == STATUS_OBJECT_NAME_NOT_FOUND) {
path_home = FALSE; // = TRUE;
RtlStringCbPrintfW(path, path_len, path_sandboxie, SystemRoot); // , Driver_HomePathDos);
path_home = 0;
RtlStringCbPrintfW(path, path_len, path_sandboxie, SystemRoot);
status = Stream_Open(
&stream, path,
@ -256,7 +287,7 @@ _FX NTSTATUS Conf_Read(ULONG session_id)
}
if (! NT_SUCCESS(status)) {
ExFreePoolWithTag(path, tzuk);
Pool_Delete(pool);
return status;
}
@ -264,12 +295,6 @@ _FX NTSTATUS Conf_Read(ULONG session_id)
// read data from the file
//
pool = Pool_Create();
if (! pool)
status = STATUS_INSUFFICIENT_RESOURCES;
else {
data.pool = pool;
List_Init(&data.sections);
#ifdef USE_CONF_MAP
@ -280,6 +305,10 @@ _FX NTSTATUS Conf_Read(ULONG session_id)
map_resize(&data.sections_map, 16); // prepare some buckets for better performance
#endif
data.home = path_home;
if (path_home == 2)
data.path = Mem_AllocStringEx(data.pool, path, TRUE);
else
data.path = NULL;
data.use_count = 0;
if (stream) {
@ -292,7 +321,6 @@ _FX NTSTATUS Conf_Read(ULONG session_id)
if (status == STATUS_END_OF_FILE)
status = STATUS_SUCCESS;
}
}
if (stream) Stream_Close(stream);
@ -370,6 +398,7 @@ _FX NTSTATUS Conf_Read(ULONG session_id)
}
}
Mem_Free(path, path_len);
if (pool)
Pool_Delete(pool); // may be either data.pool or old Conf_Data.pool
@ -399,7 +428,6 @@ _FX NTSTATUS Conf_Read(ULONG session_id)
}
}
ExFreePoolWithTag(path, tzuk);
return status;
}
@ -1225,7 +1253,8 @@ _FX const WCHAR *Conf_Get(
// return "H" if configuration file was found in the Sandboxie
// home directory, or "W" if it was found in Windows directory
value = (Conf_Data.home) ? Conf_H : Conf_W;
if (Conf_Data.path) value = Conf_Data.path;
else value = (Conf_Data.home) ? Conf_H : Conf_W;
} else if ((!have_section) && have_setting &&
_wcsicmp(setting, L"IniEncoding") == 0) {
@ -1426,6 +1455,7 @@ _FX NTSTATUS Conf_Api_Reload(PROCESS *proc, ULONG64 *parms)
#endif
Conf_Data.home = FALSE;
Conf_Data.path = NULL;
Conf_Data.encoding = 0;
ExReleaseResourceLite(Conf_Lock);
@ -1664,6 +1694,7 @@ _FX BOOLEAN Conf_Init(void)
#endif
Conf_Data.home = FALSE;
Conf_Data.path = NULL;
Conf_Data.encoding = 0;
if (! Mem_GetLockResource(&Conf_Lock, TRUE))

View File

@ -2135,8 +2135,13 @@ bool SbieIniServer::GetIniPath(WCHAR **IniPath,
*IsUTF8 = TRUE;
}
LONG rc = SbieApi_QueryConfAsIs(NULL, L"IniLocation", 0, path, 8);
if (rc == 0 && *path == L'H') {
LONG rc = SbieApi_QueryConfAsIs(NULL, L"IniLocation", 0, path, 260 * sizeof(WCHAR));
if (rc == 0 && *path == L'\\') {
if (wcsnicmp(path, L"\\??\\", 4) == 0)
wmemmove(path, path + 4, wcslen(path)+1 - 4);
}
else if (rc == 0 && *path == L'H') {
//
// Sandboxie.ini was last read from Sandboxie home directory