From a59698b0ebe1d0caa6a25a0167a59cbe2d16d936 Mon Sep 17 00:00:00 2001 From: DavidXanatos <3890945+DavidXanatos@users.noreply.github.com> Date: Sun, 21 Jul 2024 14:52:35 +0200 Subject: [PATCH] 1.14.5 --- Sandboxie/core/dll/sysinfo.c | 55 ++++++++++++------- .../SandMan/Windows/OptionsAdvanced.cpp | 4 +- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/Sandboxie/core/dll/sysinfo.c b/Sandboxie/core/dll/sysinfo.c index a5df709a..4ea3e1da 100644 --- a/Sandboxie/core/dll/sysinfo.c +++ b/Sandboxie/core/dll/sysinfo.c @@ -216,42 +216,59 @@ _FX NTSTATUS SysInfo_NtQuerySystemInformation( PSYSTEM_FIRMWARE_TABLE_INFORMATION firmwareTableInfo = (PSYSTEM_FIRMWARE_TABLE_INFORMATION)Buffer; - if (firmwareTableInfo->ProviderSignature == FIRMWARE_TABLE_PROVIDER_SMBIOS && firmwareTableInfo->Action == SystemFirmwareTable_Get) - { - typedef LSTATUS(*ROK)(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult); - typedef LSTATUS(*RQVEW)(HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData); - typedef LSTATUS(*RCK)(HKEY hKey); - ROK RegOpenKeyExW = (ROK)GetProcAddress(LoadLibraryW(DllName_advapi32), "RegOpenKeyExW"); - RQVEW RegQueryValueExW = (RQVEW)GetProcAddress(LoadLibraryW(DllName_advapi32), "RegQueryValueExW"); - RCK RegCloseKey = (RCK)GetProcAddress(LoadLibraryW(DllName_advapi32), "RegCloseKey"); + if (firmwareTableInfo->ProviderSignature == FIRMWARE_TABLE_PROVIDER_SMBIOS && firmwareTableInfo->Action == SystemFirmwareTable_Get) { + + typedef LSTATUS(*RegOpenKeyExW_t)(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult); + typedef LSTATUS(*RegQueryValueExW_t)(HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData); + typedef LSTATUS(*RegCloseKey_t)(HKEY hKey); + + HMODULE advapi32 = LoadLibraryW(DllName_advapi32); + if (!advapi32) return STATUS_UNSUCCESSFUL; + + RegOpenKeyExW_t RegOpenKeyExW = (RegOpenKeyExW_t)GetProcAddress(advapi32, "RegOpenKeyExW"); + RegQueryValueExW_t RegQueryValueExW = (RegQueryValueExW_t)GetProcAddress(advapi32, "RegQueryValueExW"); + RegCloseKey_t RegCloseKey = (RegCloseKey_t)GetProcAddress(advapi32, "RegCloseKey"); + + if (!RegOpenKeyExW || !RegQueryValueExW || !RegCloseKey) { + FreeLibrary(advapi32); + return STATUS_UNSUCCESSFUL; + } HKEY hKey = NULL; DWORD dwLen = 0x10000; PVOID lpData = Dll_AllocTemp(dwLen); - DWORD type; - if (!lpData) + if (!lpData) { + FreeLibrary(advapi32); return STATUS_UNSUCCESSFUL; + } + DWORD type = 0; // if not set we return no information, 0 length - if (RegOpenKeyExW && RegOpenKeyExW(HKEY_CURRENT_USER, L"System\\SbieCustom", 0, KEY_READ, &hKey) == 0) { - - RegQueryValueExW(hKey, L"SMBiosTable", 0, &type, lpData, &dwLen); - + if (RegOpenKeyExW(HKEY_CURRENT_USER, L"System\\SbieCustom", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + if (RegQueryValueExW(hKey, L"SMBiosTable", NULL, &type, (LPBYTE)lpData, &dwLen) != ERROR_SUCCESS) { + dwLen = 0; + } RegCloseKey(hKey); } *ReturnLength = dwLen; if (dwLen > 0) { - if (dwLen + sizeof(PSYSTEM_FIRMWARE_TABLE_INFORMATION) > BufferLength) - return STATUS_BUFFER_TOO_SMALL; - + if (dwLen + sizeof(SYSTEM_FIRMWARE_TABLE_INFORMATION) > BufferLength) { + status = STATUS_BUFFER_TOO_SMALL; + goto cleanup; + } + firmwareTableInfo->TableBufferLength = dwLen; memcpy(firmwareTableInfo->TableBuffer, lpData, dwLen); } - Dll_Free(lpData); + status = STATUS_SUCCESS; - return STATUS_SUCCESS; + cleanup: + Dll_Free(lpData); + FreeLibrary(advapi32); + + return status; } } diff --git a/SandboxiePlus/SandMan/Windows/OptionsAdvanced.cpp b/SandboxiePlus/SandMan/Windows/OptionsAdvanced.cpp index d9d4a5c7..7dfc8513 100644 --- a/SandboxiePlus/SandMan/Windows/OptionsAdvanced.cpp +++ b/SandboxiePlus/SandMan/Windows/OptionsAdvanced.cpp @@ -1391,9 +1391,9 @@ retry: { HKEY hKey; DWORD disposition; - if(RegCreateKeyExW(HKEY_CURRENT_USER, L"System\\SbieCustom", 0, 0, 0, KEY_WRITE, NULL, &hKey, &disposition) == 0) + if(RegCreateKeyExW(HKEY_CURRENT_USER, L"System\\SbieCustom", 0, 0, 0, KEY_WRITE, NULL, &hKey, &disposition) == ERROR_SUCCESS) { - if(RegSetValueExW(hKey, L"SMBiosTable", 0, REG_BINARY, firmwareTableInfo->TableBuffer, firmwareTableInfo->TableBufferLength) == 0) + if(RegSetValueExW(hKey, L"SMBiosTable", 0, REG_BINARY, firmwareTableInfo->TableBuffer, firmwareTableInfo->TableBufferLength) == ERROR_SUCCESS) CSandMan::ShowMessageBox(this, QMessageBox::Information, tr("Firmware table saved successfully to host registry: HKEY_CURRENT_USER\\System\\SbieCustom
you can copy it to the sandboxed registry to have a different value for each box.")); RegCloseKey(hKey);