| Index: sandbox/win/src/registry_interception.cc
|
| diff --git a/sandbox/win/src/registry_interception.cc b/sandbox/win/src/registry_interception.cc
|
| index 936d4acc713a5053faddaacac57880c1a9e6fb92..4a1a8469848f3f41b757a8a92df523966cf9f5c1 100644
|
| --- a/sandbox/win/src/registry_interception.cc
|
| +++ b/sandbox/win/src/registry_interception.cc
|
| @@ -6,6 +6,8 @@
|
|
|
| #include "sandbox/win/src/crosscall_client.h"
|
| #include "sandbox/win/src/ipc_tags.h"
|
| +#include "sandbox/win/src/policy_params.h"
|
| +#include "sandbox/win/src/policy_target.h"
|
| #include "sandbox/win/src/sandbox_factory.h"
|
| #include "sandbox/win/src/sandbox_nt_util.h"
|
| #include "sandbox/win/src/sharedmem_ipc_client.h"
|
| @@ -56,6 +58,29 @@ NTSTATUS WINAPI TargetNtCreateKey(NtCreateKeyFunction orig_CreateKey,
|
| if (!NT_SUCCESS(ret) || NULL == name)
|
| break;
|
|
|
| + uint32 desired_access_uint32 = desired_access;
|
| + CountedParameterSet<OpenKey> params;
|
| + params[OpenKey::ACCESS] = ParamPickerMake(desired_access_uint32);
|
| +
|
| + wchar_t* full_name = NULL;
|
| +
|
| + if (root_directory) {
|
| + ret = sandbox::AllocAndGetFullPath(root_directory, name, &full_name);
|
| + if (!NT_SUCCESS(ret) || NULL == full_name)
|
| + break;
|
| + params[OpenKey::NAME] = ParamPickerMake(full_name);
|
| + } else {
|
| + params[OpenKey::NAME] = ParamPickerMake(name);
|
| + }
|
| +
|
| + bool query_broker = QueryBroker(IPC_NTCREATEKEY_TAG, params.GetBase());
|
| +
|
| + if (full_name != NULL)
|
| + operator delete(full_name, NT_ALLOC);
|
| +
|
| + if (!query_broker)
|
| + break;
|
| +
|
| SharedMemIPCClient ipc(memory);
|
| CrossCallReturn answer = {0};
|
|
|
| @@ -115,6 +140,29 @@ NTSTATUS WINAPI CommonNtOpenKey(NTSTATUS status, PHANDLE key,
|
| if (!NT_SUCCESS(ret) || NULL == name)
|
| break;
|
|
|
| + uint32 desired_access_uint32 = desired_access;
|
| + CountedParameterSet<OpenKey> params;
|
| + params[OpenKey::ACCESS] = ParamPickerMake(desired_access_uint32);
|
| +
|
| + wchar_t* full_name = NULL;
|
| +
|
| + if (root_directory) {
|
| + ret = sandbox::AllocAndGetFullPath(root_directory, name, &full_name);
|
| + if (!NT_SUCCESS(ret) || NULL == full_name)
|
| + break;
|
| + params[OpenKey::NAME] = ParamPickerMake(full_name);
|
| + } else {
|
| + params[OpenKey::NAME] = ParamPickerMake(name);
|
| + }
|
| +
|
| + bool query_broker = QueryBroker(IPC_NTOPENKEY_TAG, params.GetBase());
|
| +
|
| + if (full_name != NULL)
|
| + operator delete(full_name, NT_ALLOC);
|
| +
|
| + if (!query_broker)
|
| + break;
|
| +
|
| SharedMemIPCClient ipc(memory);
|
| CrossCallReturn answer = {0};
|
| ResultCode code = CrossCall(ipc, IPC_NTOPENKEY_TAG, name, attributes,
|
|
|