Index: ipc/handle_attachment_win.h |
diff --git a/ipc/handle_attachment_win.h b/ipc/handle_attachment_win.h |
index ef3b89652caf8c2e0fa332b3af659d6a3571545a..cfe56a36bd81c95373b70d9f43f905f259d8f236 100644 |
--- a/ipc/handle_attachment_win.h |
+++ b/ipc/handle_attachment_win.h |
@@ -8,16 +8,48 @@ |
#include <stdint.h> |
#include "base/process/process_handle.h" |
+#include "ipc/brokerable_attachment.h" |
#include "ipc/handle_win.h" |
#include "ipc/ipc_export.h" |
-#include "ipc/ipc_message_attachment.h" |
namespace IPC { |
namespace internal { |
// This class represents a Windows HANDLE attached to a Chrome IPC message. |
-class IPC_EXPORT HandleAttachmentWin : public MessageAttachment { |
+class IPC_EXPORT HandleAttachmentWin : public BrokerableAttachment { |
public: |
+ // The wire format for this handle. |
+ struct IPC_EXPORT WireFormat { |
+ // IPC translation requires that classes passed through IPC have a default |
+ // constructor. |
+ WireFormat() |
+ : handle(0), |
+ destination_process(0), |
+ permissions(HandleWin::INVALID) {} |
+ |
+ WireFormat(int32_t handle, |
+ const base::ProcessId& destination_process, |
+ HandleWin::Permissions permissions) |
+ : handle(handle), |
+ destination_process(destination_process), |
+ permissions(permissions) {} |
+ |
+ // The HANDLE that is intended for duplication, or the HANDLE that has been |
+ // duplicated, depending on context. |
+ // The type is int32_t instead of HANDLE because HANDLE gets typedefed to |
+ // void*, whose size varies between 32 and 64-bit processes. Using a |
+ // int32_t means that 64-bit processes will need to perform both up-casting |
+ // and down-casting. This is performed using the appropriate Windows APIs. |
+ // A value of 0 is equivalent to an invalid handle. |
+ int32_t handle; |
+ |
+ // The id of the destination process that the handle is duplicated into. |
+ base::ProcessId destination_process; |
+ |
+ // The permissions to use when duplicating the handle. |
+ HandleWin::Permissions permissions; |
+ }; |
+ |
// This constructor makes a copy of |handle| and takes ownership of the |
// result. Should only be called by the sender of a Chrome IPC message. |
HandleAttachmentWin(const HANDLE& handle, HandleWin::Permissions permissions); |
@@ -29,7 +61,14 @@ |
// receiver of a Chrome IPC message. |
HandleAttachmentWin(const HANDLE& handle, FromWire from_wire); |
- Type GetType() const override; |
+ // This constructor takes ownership of |wire_format.handle| without making a |
+ // copy. Should only be called by the receiver of a Chrome IPC message. |
+ explicit HandleAttachmentWin(const WireFormat& wire_format); |
+ |
+ BrokerableType GetBrokerableType() const override; |
+ |
+ // Returns the wire format of this attachment. |
+ WireFormat GetWireFormat(const base::ProcessId& destination) const; |
HANDLE get_handle() const { return handle_; } |