README.md
Rendering markdown...
#ifndef _BINDER_H_
#define _BINDER_H_
#include "base.h"
#include "uapi_binder.h"
#define CONST_MAPPED_SIZE 131072UL
#define MAX_SERVICE_NAME 0x20
#define BINDER_DEVICE "/dev/binder"
#define DEFAULT_MAX_BINDER_THREADS 0xFF
#define BINDER_SUCCESS 0
#define BINDER_VERSION_ERROR -15
#define BINDER_MAPPED_ERROR (BINDER_VERSION_ERROR - 1)
#define BINDER_SET_MAX_THREADS_ERROR (BINDER_MAPPED_ERROR - 1)
#define TR_FIELD_DEFINE(name, arg) \
void (*name)(struct __TR_BUILDER* this, arg)
#define BINDER_OBJECT_FIELD_DEFINE(name, arg) \
void (*name)(struct __BINDER_OBJECT_BUILDER* this, arg)
#define SET_FIELD(o, name) \
o.name##_ = name
typedef void (*BINDER_PARSE_CALLBACK)(
uint32_t,
struct binder_transaction_data,
binder_uintptr_t,
BOOL
);
enum {
/* Must match definitions in IBinder.h and IServiceManager.h */
PING_TRANSACTION = B_PACK_CHARS('_','P','N','G'),
SVC_MGR_GET_SERVICE = 1,
SVC_MGR_CHECK_SERVICE,
SVC_MGR_ADD_SERVICE,
SVC_MGR_LIST_SERVICES,
};
typedef struct __BINDER_INFO
{
int fd_;
void* mapped_;
size_t mapsize_;
}BINDER_INFO, *PBINDER_INFO;
typedef struct __BINDER_OBJECT_BUILDER{
struct flat_binder_object obj_;
BINDER_OBJECT_FIELD_DEFINE(set_fbo_flags_, uint32_t flags);
BINDER_OBJECT_FIELD_DEFINE(set_fbo_cookie_, binder_uintptr_t cookie);
BINDER_OBJECT_FIELD_DEFINE(set_fbo_binder_, binder_uintptr_t binder);
BINDER_OBJECT_FIELD_DEFINE(set_fbo_handle_, uint32_t handle);
BINDER_OBJECT_FIELD_DEFINE(set_fbo_hdr_type_, uint32_t type);
}BINDER_OBJECT_BUILDER, *PBINDER_OBJECT_BUILDER;
typedef struct __TR_BUILDER{
struct binder_transaction_data tr_;
TR_FIELD_DEFINE(set_tr_target_handle_, uint32_t handle);
TR_FIELD_DEFINE(set_tr_target_ptr_, binder_uintptr_t ptr);
TR_FIELD_DEFINE(set_tr_cookie_, binder_uintptr_t cookie);
TR_FIELD_DEFINE(set_tr_code_, uint32_t code);
TR_FIELD_DEFINE(set_tr_flags_, uint32_t flags);
TR_FIELD_DEFINE(set_tr_sender_pid_, pid_t sender_pid);
TR_FIELD_DEFINE(set_tr_sender_euid_, uid_t sender_euid);
TR_FIELD_DEFINE(set_tr_data_size_, binder_size_t data_size);
TR_FIELD_DEFINE(set_tr_offsets_size_, binder_size_t offsets_size);
TR_FIELD_DEFINE(set_tr_data_ptr_buffer_, binder_uintptr_t buffer);
TR_FIELD_DEFINE(set_tr_data_ptr_offsets_, binder_uintptr_t offsets);
}TR_BUILDER, *PTR_BUILDER;
#define NEW_TR_BUILDER(o) \
TR_BUILDER o; \
memset(&o, 0, sizeof(o)); \
do{ \
SET_FIELD(o, set_tr_target_handle); \
SET_FIELD(o, set_tr_target_ptr); \
SET_FIELD(o, set_tr_cookie); \
SET_FIELD(o, set_tr_code); \
SET_FIELD(o, set_tr_flags); \
SET_FIELD(o, set_tr_sender_pid); \
SET_FIELD(o, set_tr_sender_euid); \
SET_FIELD(o, set_tr_data_size); \
SET_FIELD(o, set_tr_offsets_size); \
SET_FIELD(o, set_tr_data_ptr_buffer); \
SET_FIELD(o, set_tr_data_ptr_offsets); \
}while(0)
#define NEW_BINDER_OBJECT_BUILDER(o) \
BINDER_OBJECT_BUILDER o; \
memset(&o, 0, sizeof(o)); \
do{ \
SET_FIELD(o, set_fbo_binder); \
SET_FIELD(o, set_fbo_cookie); \
SET_FIELD(o, set_fbo_flags); \
SET_FIELD(o, set_fbo_handle); \
SET_FIELD(o, set_fbo_hdr_type); \
}while(0)
size_t binder_read(PBINDER_INFO info, BYTE* buffer, size_t size);
int binder_write(PBINDER_INFO info, BYTE* buffer, size_t size);
int binder_increfs(PBINDER_INFO info, uint32_t target);
int binder_acquire(PBINDER_INFO info, uint32_t target);
int binder_release(PBINDER_INFO info, uint32_t target);
int binder_decrefs(PBINDER_INFO info, uint32_t target);
int binder_open(PBINDER_INFO info, size_t mapsize);
int binder_close(PBINDER_INFO info);
int binder_free_buffer(
PBINDER_INFO info,
binder_uintptr_t buffer
);
int binder_freeze(
PBINDER_INFO info,
uint32_t pid,
uint32_t enable,
uint32_t timeout_ms
);
int binder_request_death_notification(
PBINDER_INFO info,
uint32_t target,
binder_uintptr_t cookie);
int binder_clear_death_notification(
PBINDER_INFO info,
uint32_t target,
binder_uintptr_t cookie);
int binder_become_context_manager(
PBINDER_INFO info,
binder_uintptr_t cookie,
binder_uintptr_t binder,
BOOL ext);
size_t binder_read_write(
PBINDER_INFO info,
BYTE* wbuffer,
size_t wsize,
BYTE* rbuffer,
size_t rsize
);
size_t binder_transaction(
PBINDER_INFO info,
BYTE* reply,
size_t rsize,
struct binder_transaction_data tr
);
size_t binder_transaction_sg(
PBINDER_INFO info,
BYTE* reply,
size_t rsize,
struct binder_transaction_data_sg tr
);
void* parse_binder_message(
BYTE* rbuffer,
size_t rsize
);
void binder_reg_looper(
PBINDER_INFO info
);
void binder_set_looper(
PBINDER_INFO info
);
int binder_reply(
PBINDER_INFO info,
BYTE* rbuffer,
size_t rsize,
struct binder_transaction_data tr
);
int binder_reply_sg(
PBINDER_INFO info,
BYTE* rbuffer,
size_t rsize,
struct binder_transaction_data tr
);
/**
* TR_BUILDER members function
*/
void set_tr_target_handle(
PTR_BUILDER this,
uint32_t handle
);
void set_tr_target_ptr(
PTR_BUILDER this,
binder_uintptr_t ptr
);
void set_tr_cookie(
PTR_BUILDER this,
binder_uintptr_t cookie
);
void set_tr_code(
PTR_BUILDER this,
uint32_t code
);
void set_tr_flags(
PTR_BUILDER this,
uint32_t flags
);
void set_tr_sender_pid(
PTR_BUILDER this,
pid_t sender_pid
);
void set_tr_sender_euid(
PTR_BUILDER this,
uid_t sender_euid
);
void set_tr_data_size(
PTR_BUILDER this,
binder_size_t data_size
);
void set_tr_offsets_size(
PTR_BUILDER this,
binder_size_t offsets_size
);
void set_tr_data_ptr_buffer(
PTR_BUILDER this,
binder_uintptr_t buffer
);
void set_tr_data_ptr_offsets(
PTR_BUILDER this,
binder_uintptr_t offsets
);
/**
* BINDER_OBJECT_BUILDER members function
*/
void set_fbo_flags(
PBINDER_OBJECT_BUILDER this,
uint32_t flags
);
void set_fbo_cookie(
PBINDER_OBJECT_BUILDER this,
binder_uintptr_t cookie
);
void set_fbo_binder(
PBINDER_OBJECT_BUILDER this,
binder_uintptr_t binder
);
void set_fbo_handle(
PBINDER_OBJECT_BUILDER this,
uint32_t handle
);
void set_fbo_hdr_type(
PBINDER_OBJECT_BUILDER this,
uint32_t type
);
#endif