/* return object attributes from the current request */ const struct object_attributes *get_req_object_attributes( const struct security_descriptor **sd, struct unicode_str *name, struct object **root ) { static const struct object_attributes empty_attributes; const struct object_attributes *attr = get_req_data(); data_size_t size = get_req_data_size(); if (root) *root = NULL; if (!size) { *sd = NULL; name->len = 0; return &empty_attributes; } if ((size < sizeof(*attr)) || (size - sizeof(*attr) < attr->sd_len) || (size - sizeof(*attr) - attr->sd_len < attr->name_len)) { set_error( STATUS_ACCESS_VIOLATION ); return NULL; } if (attr->sd_len && !sd_is_valid( (const struct security_descriptor *)(attr + 1), attr->sd_len )) { set_error( STATUS_INVALID_SECURITY_DESCR ); return NULL; } if ((attr->name_len & (sizeof(WCHAR) - 1)) || attr->name_len >= 65534) { set_error( STATUS_OBJECT_NAME_INVALID ); return NULL; } if (root && attr->rootdir && attr->name_len) { if (!(*root = get_directory_obj( current->process, attr->rootdir ))) return NULL; } *sd = attr->sd_len ? (const struct security_descriptor *)(attr + 1) : NULL; name->len = attr->name_len; name->str = (const WCHAR *)(attr + 1) + attr->sd_len / sizeof(WCHAR); return attr; }
/* open a new handle to an existing object */ obj_handle_t open_object( struct process *process, obj_handle_t parent, unsigned int access, const struct object_ops *ops, const struct unicode_str *name, unsigned int attributes ) { obj_handle_t handle = 0; struct directory *root = NULL; struct object *obj; if (name->len >= 65534) { set_error( STATUS_OBJECT_NAME_INVALID ); return 0; } if (parent && !(root = get_directory_obj( process, parent, 0 ))) return 0; if ((obj = open_object_dir( root, name, attributes, ops ))) { handle = alloc_handle( process, obj, access, attributes ); release_object( obj ); } if (root) release_object( root ); return handle; }