From: Vibhav Pant vibhavp@gmail.com
--- dlls/rometadata/mdtables.c | 548 ++++++++++++++++++++++++++++++++++++- include/rometadataapi.idl | 267 ++++++++++++++++++ 2 files changed, 814 insertions(+), 1 deletion(-)
diff --git a/dlls/rometadata/mdtables.c b/dlls/rometadata/mdtables.c index b5804bd987b..8c9f4825584 100644 --- a/dlls/rometadata/mdtables.c +++ b/dlls/rometadata/mdtables.c @@ -1,5 +1,5 @@ /* - * IMetaDataTables implementation + * IMetaDataTables, IMetaDataImport implementation * * Copyright 2025 Vibhav Pant * @@ -33,6 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(rometadata); struct metadata_tables { IMetaDataTables IMetaDataTables_iface; + IMetaDataImport IMetaDataImport_iface; LONG ref;
assembly_t *assembly; @@ -45,6 +46,8 @@ static inline struct metadata_tables *impl_from_IMetaDataTables(IMetaDataTables
static HRESULT WINAPI tables_QueryInterface(IMetaDataTables *iface, REFIID iid, void **out) { + struct metadata_tables *impl = impl_from_IMetaDataTables(iface); + TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), out);
if (IsEqualGUID(&IID_IUnknown, iid) || IsEqualGUID(&IID_IMetaDataTables, iid)) @@ -52,6 +55,11 @@ static HRESULT WINAPI tables_QueryInterface(IMetaDataTables *iface, REFIID iid, IMetaDataTables_AddRef((*out = iface)); return S_OK; } + if (IsEqualGUID(&IID_IMetaDataImport, iid)) + { + IMetaDataImport_AddRef((*out = &impl->IMetaDataImport_iface)); + return S_OK; + }
FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); return E_NOINTERFACE; @@ -286,6 +294,543 @@ static const struct IMetaDataTablesVtbl tables_vtbl = tables_GetNextUserString, };
+static inline struct metadata_tables *impl_from_IMetaDataImport(IMetaDataImport *iface) +{ + return CONTAINING_RECORD(iface, struct metadata_tables, IMetaDataImport_iface); +} + +static HRESULT WINAPI import_QueryInterface(IMetaDataImport *iface, REFIID iid, void **out) +{ + struct metadata_tables *impl = impl_from_IMetaDataImport(iface); + return IMetaDataTables_QueryInterface(&impl->IMetaDataTables_iface, iid, out); +} + +static ULONG WINAPI import_AddRef(IMetaDataImport *iface) +{ + struct metadata_tables *impl = impl_from_IMetaDataImport(iface); + return IMetaDataTables_AddRef(&impl->IMetaDataTables_iface); +} + +static ULONG WINAPI import_Release(IMetaDataImport *iface) +{ + struct metadata_tables *impl = impl_from_IMetaDataImport(iface); + return IMetaDataTables_Release(&impl->IMetaDataTables_iface); +} + +static void WINAPI import_CloseEnum(IMetaDataImport *iface, HCORENUM henum) +{ + FIXME("(%p, %p): stub!\n", iface, henum); +} + +static HRESULT WINAPI import_CountEnum(IMetaDataImport *iface, HCORENUM henum, ULONG *count) +{ + FIXME("(%p, %p, %p): stub!\n", iface, henum, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_ResetEnum(IMetaDataImport *iface, HCORENUM henum, ULONG idx) +{ + FIXME("(%p, %p, %lu): stub\n", iface, henum, idx); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumTypeDefs(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef *typedefs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %p, %lu, %p): stub!\n", iface, henum, typedefs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumInterfaceImpls(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef type_def, + mdInterfaceImpl *impls, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, type_def, impls, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumTypeRefs(IMetaDataImport *iface, HCORENUM *henum, mdTypeRef *typerefs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %p, %lu, %p): stub!\n", iface, henum, typerefs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_FindTypeDefByName(IMetaDataImport *iface, const WCHAR *name, mdToken enclosing_class, mdTypeDef *type_def) +{ + FIXME("(%p, %p, %#x, %p): stub!\n", iface, debugstr_w(name), enclosing_class, type_def); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetScopeProps(IMetaDataImport *iface, WCHAR *name, ULONG len, ULONG *written, GUID *mvid) +{ + FIXME("(%p, %p, %lu, %p, %p): stub!\n", iface, name, len, written, mvid); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetModuleFromScope(IMetaDataImport *iface, mdModule *module) +{ + FIXME("(%p, %p): stub!\n", iface, module); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetTypeDefProps(IMetaDataImport *iface, mdTypeDef type_def, WCHAR *name, ULONG len, + ULONG *written, ULONG *flags, mdToken *base) +{ + FIXME("(%p, %#x, %p, %lu, %p, %p, %p): stub!\n", iface, type_def, name, len, written, flags, base); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetInterfaceImplProps(IMetaDataImport *iface, mdInterfaceImpl iface_impl, + mdTypeDef *class_token, mdToken *iface_token) +{ + FIXME("(%p, %#x, %p, %p): stub!\n", iface, iface_impl, class_token, iface_token); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetTypeRefProps(IMetaDataImport *iface, mdTypeRef typeref, mdToken *resolution_scope, + WCHAR *name, ULONG len, ULONG *written) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p): stub!\n", iface, typeref, resolution_scope, name, len, written); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_ResolveTypeRef(IMetaDataImport *iface, mdTypeRef typeref, const GUID *iid, + IUnknown **scope, mdTypeDef *type_def) +{ + FIXME("(%p, %#x, %s, %p, %p): stub!\n", iface, typeref, debugstr_guid(iid), scope, type_def); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumMembers(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef type_def, + mdToken *member_defs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, type_def, member_defs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumMembersWithName(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef token, + const WCHAR *name, mdToken *member_defs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %s, %p, %lu, %p): stub!\n", iface, henum, token, debugstr_w(name), member_defs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumMethods(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef type_def, + mdMethodDef *method_defs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, type_def, method_defs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumMethodsWithName(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef type_def, + const WCHAR *name, mdMethodDef *method_defs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %s, %p, %lu, %p): stub!\n", iface, henum, type_def, debugstr_w(name), method_defs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumFields(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef token, + mdFieldDef *field_defs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, token, field_defs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumFieldsWithName(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef token, + const WCHAR *name, mdFieldDef *field_defs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %s, %p, %lu, %p): stub!\n", iface, henum, token, debugstr_w(name), field_defs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumParams(IMetaDataImport *iface, HCORENUM *henum, mdMethodDef method_def, + mdParamDef *params, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, method_def, params, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumMemberRefs(IMetaDataImport *iface, HCORENUM *henum, mdToken parent, + mdMemberRef *members, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, parent, members, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumMethodImpls(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef token, + mdToken *body_tokens, mdToken *decl_tokens, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %p, %lu, %p): stub!\n", iface, henum, token, body_tokens, decl_tokens, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumPermissionSets(IMetaDataImport *iface, HCORENUM *henum, mdToken token, ULONG actions, + mdPermission *perms, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %#lx, %p, %lu, %p): stub!\n", iface, henum, token, actions, perms, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_FindMember(IMetaDataImport *iface, mdTypeDef type_def, const WCHAR *name, + const COR_SIGNATURE *sig_blob, ULONG len, mdToken *member_ref) +{ + FIXME("(%p, %#x, %s, %p, %lu, %p): stub!\n", iface, type_def, debugstr_w(name), sig_blob, len, member_ref); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_FindMethod(IMetaDataImport *iface, mdTypeDef type_def, const WCHAR *name, + const COR_SIGNATURE *sig_blob, ULONG len, mdMethodDef *method_def) +{ + FIXME("(%p, %#x, %s, %p, %lu, %p): stub!\n", iface, type_def, debugstr_w(name), sig_blob, len, method_def); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_FindField(IMetaDataImport *iface, mdTypeDef type_def, const WCHAR *name, + const COR_SIGNATURE *sig_blob, ULONG len, mdFieldDef *field_def) +{ + FIXME("(%p, %#x, %s, %p, %lu, %p): stub!\n", iface, type_def, debugstr_w(name), sig_blob, len, field_def); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_FindMemberRef(IMetaDataImport *iface, mdTypeRef typeref, const WCHAR *name, + const COR_SIGNATURE *sig_blob, ULONG len, mdMemberRef *member_ref) +{ + FIXME("(%p, %#x, %s, %p, %lu, %p): stub!\n", iface, typeref, debugstr_w(name), sig_blob, len, member_ref); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetMethodProps(IMetaDataImport *iface, mdMethodDef method_def, mdTypeDef *type_def, + WCHAR *method_name, ULONG name_len, ULONG *written, ULONG *method_flags, + const COR_SIGNATURE **sig_blob, ULONG *sig_len, ULONG *rva, + ULONG *impl_flags) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p, %p, %p, %p, %p, %p): stub!\n", iface, method_def, type_def, method_name, name_len, + written, method_flags, sig_blob, sig_len, rva, impl_flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetMemberRefProps(IMetaDataImport *iface, mdMemberRef member_ref, mdToken *token, + WCHAR *member_name, ULONG name_len, ULONG *written, + const COR_SIGNATURE **sig_blob, ULONG *sig_len) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p, %p, %p): stub!\n", iface, member_ref, token, member_name, name_len, written, + sig_blob, sig_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumProperties(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef type_def, + mdProperty *props, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, type_def, props, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumEvents(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef type_def, mdEvent *events, + ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, type_def, events, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetEventProps(IMetaDataImport *iface, mdEvent event, mdTypeDef *class_typedef, WCHAR *name, + ULONG name_len, ULONG *written, ULONG *event_flags, mdToken *event_type, + mdMethodDef *add_method, mdMethodDef *remove_method, + mdMethodDef *fire_method, mdMethodDef *other_methods, ULONG other_len, + ULONG *other_count) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p, %p, %p, %p, %p, %p, %p, %lu, %p): stub!\n", iface, event, class_typedef, name, + name_len, written, event_flags, event_type, add_method, remove_method, fire_method, other_methods, other_len, + other_count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumMethodSemantics(IMetaDataImport *iface, HCORENUM *henum, mdMethodDef method_def, + mdToken *event_props, ULONG len, ULONG *written) +{ + FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, method_def, event_props, len, written); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetMethodSemantics(IMetaDataImport *iface, mdMethodDef method_def, mdToken event_prop, + ULONG *semantics) +{ + FIXME("(%p, %#x, %#x, %p): stub!\n", iface, method_def, event_prop, semantics); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetClassLayout(IMetaDataImport *iface, mdTypeDef type_def, ULONG *pack_size, + COR_FIELD_OFFSET *offsets, ULONG len, ULONG *count, ULONG *class_size) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p, %p): stub!\n", iface, type_def, pack_size, offsets, len, count, class_size); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetFieldMarshal(IMetaDataImport *iface, mdToken token, + const COR_SIGNATURE **native_type_blob, ULONG *len) +{ + FIXME("(%p, %#x, %p, %p): stub!\n", iface, token, native_type_blob, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetRVA(IMetaDataImport *iface, mdToken token, ULONG *rva, ULONG *impl_flags) +{ + FIXME("(%p, %#x, %p, %p): stub!\n", iface, token, rva, impl_flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetPermissionSetProps(IMetaDataImport *iface, mdPermission perm, ULONG *decl_sec, + const BYTE **perm_blob, ULONG *len) +{ + FIXME("(%p, %#x, %p, %p, %p): stub!\n", iface, perm, decl_sec, perm_blob, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetSigFromToken(IMetaDataImport *iface, mdSignature signature, + const COR_SIGNATURE **sig_blob, ULONG *len) +{ + FIXME("(%p, %#x, %p, %p): stub!\n", iface, signature, sig_blob, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetModuleRefProps(IMetaDataImport *iface, mdModuleRef module_ref, WCHAR *name, ULONG len, + ULONG *written) +{ + FIXME("(%p, %#x, %p, %lu, %p): stub!\n", iface, module_ref, name, len, written); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumModuleRefs(IMetaDataImport *iface, HCORENUM *henum, mdModuleRef *module_refs, ULONG len, + ULONG *count) +{ + FIXME("(%p, %p, %p, %lu, %p): stub!\n", iface, henum, module_refs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetTypeSpecFromToken(IMetaDataImport *iface, mdTypeSpec typespec, + const COR_SIGNATURE **sig_blob, ULONG *len) +{ + FIXME("(%p, %#x, %p, %p): stub!\n", iface, typespec, sig_blob, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetNameFromToken(IMetaDataImport *iface, mdToken token, const char **name) +{ + FIXME("(%p, %#x, %p): stub!\n", iface, token, name); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumUnresolvedMethods(IMetaDataImport *iface, HCORENUM *henum, mdToken *method_defs, + ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %p, %lu, %p): stub!\n", iface, henum, method_defs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetUserString(IMetaDataImport *iface, mdString string_token, WCHAR *str, ULONG len, + ULONG *written) +{ + FIXME("(%p, %#x, %p, %lu, %p): stub!\n", iface, string_token, str, len, written); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetPinvokeMap(IMetaDataImport *iface, mdToken field_method_def, ULONG *map_flags, + WCHAR *import_name, ULONG len, ULONG *written, mdModuleRef *target) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p, %p): stub!\n", iface, field_method_def, map_flags, import_name, len, written, target); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumSignatures(IMetaDataImport *iface, HCORENUM *henum, mdSignature *sigs, ULONG len, + ULONG *count) +{ + FIXME("(%p, %p, %p, %lu, %p): stub!\n", iface, henum, sigs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumTypeSpecs(IMetaDataImport *iface, HCORENUM *henum, mdTypeSpec *typespecs, ULONG len, + ULONG *count) +{ + FIXME("(%p, %p, %p, %lu, %p): stub!\n", iface, henum, typespecs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumUserStrings(IMetaDataImport *iface, HCORENUM *henum, mdString *strings, ULONG len, + ULONG *count) +{ + FIXME("(%p, %p, %p, %lu, %p): stub!\n", iface, henum, strings, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetParamForMethodIndex(IMetaDataImport *iface, mdMethodDef token, ULONG param_seq, + mdParamDef *param_def) +{ + FIXME("(%p, %#x, %lu, %p): stub!\n", iface, token, param_seq, param_def); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_EnumCustomAttributes(IMetaDataImport *iface, HCORENUM *henum, mdToken token, + mdToken token_type, mdCustomAttribute *attrs, ULONG len, ULONG *count) +{ + FIXME("(%p, %p, %#x, %#x, %p, %lu, %p): stub!\n", iface, henum, token, token_type, attrs, len, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetCustomAttributeProps(IMetaDataImport *iface, mdCustomAttribute custom_attr, mdToken *obj, + mdToken *attr_type, const BYTE **blob, ULONG *len) +{ + FIXME("(%p, %#x, %p, %p, %p, %p): stub!\n", iface, custom_attr, obj, attr_type, blob, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_FindTypeRef(IMetaDataImport *iface, mdToken resolution_scope, const WCHAR *name, + mdTypeRef *typeref) +{ + FIXME("(%p, %#x, %s, %p): stub!\n", iface, resolution_scope, debugstr_w(name), typeref); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetMemberProps(IMetaDataImport *iface, mdToken member, mdTypeDef *type_def, WCHAR *name, + ULONG member_len, ULONG *member_written, ULONG *flags, + const COR_SIGNATURE **sig_blob, ULONG *blob_len, ULONG *rva, + ULONG *impl_flags, ULONG *value_type_flag, UVCP_CONSTANT *value, + ULONG *value_len) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p, %p, %p, %p, %p, %p, %p, %p, %p): stub!\n", iface, member, type_def, name, + member_len, member_written, flags, sig_blob, blob_len, rva, impl_flags, value_type_flag, value, value_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetFieldProps(IMetaDataImport *iface, mdFieldDef fielddef, mdTypeDef *type_def, + WCHAR *field_name, ULONG name_len, ULONG *name_written, ULONG *flags, + const COR_SIGNATURE **sig_blob, ULONG *sig_len, ULONG *value_type_flag, + UVCP_CONSTANT *value, ULONG *value_len) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p, %p, %p, %p, %p, %p, %p): stub!\n", iface, fielddef, type_def, field_name, + name_len, name_written, flags, sig_blob, sig_len, value_type_flag, value, value_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetPropertyProps(IMetaDataImport *iface, mdProperty prop, mdTypeDef *type_def, WCHAR *name, + ULONG name_len, ULONG *name_written, ULONG *prop_flags, + const COR_SIGNATURE **sig_blob, ULONG *sig_len, ULONG *value_type_flag, + UVCP_CONSTANT *default_value, ULONG *value_len, mdMethodDef *set_method, + mdMethodDef *get_method, mdMethodDef *other_methods, ULONG other_len, + ULONG *other_count) +{ + FIXME("(%p, %#x, %p, %p, %lu, %p, %p, %p, %p, %p, %p, %p, %p, %p, %p, %lu, %p): stub!\n", iface, prop, type_def, + name, name_len, name_written, prop_flags, sig_blob, sig_len, value_type_flag, default_value, value_len, + set_method, get_method, other_methods, other_len, other_count); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetParamProps(IMetaDataImport *iface, mdParamDef param_def, mdMethodDef *method_def, + ULONG *param_seq, WCHAR *name, ULONG name_len, ULONG *name_written, + ULONG *flags, ULONG *value_type_flag, UVCP_CONSTANT *value, ULONG *value_len) +{ + FIXME("(%p, %#x, %p, %p, %p, %lu, %p, %p, %p, %p, %p): stub!\n", iface, param_def, method_def, param_seq, name, + name_len, name_written, flags, value_type_flag, value, value_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetCustomAttributeByName(IMetaDataImport *iface, mdToken obj, const WCHAR *name, + const BYTE **data, ULONG *len) +{ + FIXME("(%p, %#x, %s, %p, %p): stub!\n", iface, obj, debugstr_w(name), data, len); + return E_NOTIMPL; +} + +static BOOL WINAPI import_IsValidToken(IMetaDataImport *iface, mdToken token) +{ + FIXME("(%p, %#x): stub!\n", iface, token); + return FALSE; +} + +static HRESULT WINAPI import_GetNestedClassProps(IMetaDataImport *iface, mdTypeDef nested_class, + mdTypeDef *enclosing_class) +{ + FIXME("(%p, %#x, %p): stub!\n", iface, nested_class, enclosing_class); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_GetNativeCallConvFromSig(IMetaDataImport *iface, const BYTE *sig_blob, ULONG len, + ULONG *call_conv) +{ + FIXME("(%p, %p, %lu, %p): stub!\n", iface, sig_blob, len, call_conv); + return E_NOTIMPL; +} + +static HRESULT WINAPI import_IsGlobal(IMetaDataImport *iface, mdToken token, int *is_global) +{ + FIXME("(%p, %#x, %p): stub!\n", iface, token, is_global); + return E_NOTIMPL; +} + +static const IMetaDataImportVtbl import_vtbl = { + import_QueryInterface, + import_AddRef, + import_Release, + import_CloseEnum, + import_CountEnum, + import_ResetEnum, + import_EnumTypeDefs, + import_EnumInterfaceImpls, + import_EnumTypeRefs, + import_FindTypeDefByName, + import_GetScopeProps, + import_GetModuleFromScope, + import_GetTypeDefProps, + import_GetInterfaceImplProps, + import_GetTypeRefProps, + import_ResolveTypeRef, + import_EnumMembers, + import_EnumMembersWithName, + import_EnumMethods, + import_EnumMethodsWithName, + import_EnumFields, + import_EnumFieldsWithName, + import_EnumParams, + import_EnumMemberRefs, + import_EnumMethodImpls, + import_EnumPermissionSets, + import_FindMember, + import_FindMethod, + import_FindField, + import_FindMemberRef, + import_GetMethodProps, + import_GetMemberRefProps, + import_EnumProperties, + import_EnumEvents, + import_GetEventProps, + import_EnumMethodSemantics, + import_GetMethodSemantics, + import_GetClassLayout, + import_GetFieldMarshal, + import_GetRVA, + import_GetPermissionSetProps, + import_GetSigFromToken, + import_GetModuleRefProps, + import_EnumModuleRefs, + import_GetTypeSpecFromToken, + import_GetNameFromToken, + import_EnumUnresolvedMethods, + import_GetUserString, + import_GetPinvokeMap, + import_EnumSignatures, + import_EnumTypeSpecs, + import_EnumUserStrings, + import_GetParamForMethodIndex, + import_EnumCustomAttributes, + import_GetCustomAttributeProps, + import_FindTypeRef, + import_GetMemberProps, + import_GetFieldProps, + import_GetPropertyProps, + import_GetParamProps, + import_GetCustomAttributeByName, + import_IsValidToken, + import_GetNestedClassProps, + import_GetNativeCallConvFromSig, + import_IsGlobal +}; + HRESULT IMetaDataTables_create(const WCHAR *path, IMetaDataTables **iface) { struct metadata_tables *impl; @@ -299,6 +844,7 @@ HRESULT IMetaDataTables_create(const WCHAR *path, IMetaDataTables **iface) }
impl->IMetaDataTables_iface.lpVtbl = &tables_vtbl; + impl->IMetaDataImport_iface.lpVtbl = &import_vtbl; impl->ref = 1; *iface = &impl->IMetaDataTables_iface; return S_OK; diff --git a/include/rometadataapi.idl b/include/rometadataapi.idl index 22e7a0d2085..ca96aa96c68 100644 --- a/include/rometadataapi.idl +++ b/include/rometadataapi.idl @@ -19,6 +19,31 @@ import "unknwn.idl"; import "cor.idl";
+cpp_quote("#if 0") + +typedef ULONG32 mdToken; + +typedef mdToken mdModule; +typedef mdToken mdTypeRef; +typedef mdToken mdTypeDef; +typedef mdToken mdFieldDef; +typedef mdToken mdMethodDef; +typedef mdToken mdParamDef; +typedef mdToken mdInterfaceImpl; +typedef mdToken mdMemberRef; +typedef mdToken mdCustomAttribute; +typedef mdToken mdPermission; +typedef mdToken mdSignature; +typedef mdToken mdEvent; +typedef mdToken mdProperty; +typedef mdToken mdModuleRef; +typedef mdToken mdAssembly; +typedef mdToken mdAssemblyRef; +typedef mdToken mdTypeSpec; +typedef mdToken mdString; + +cpp_quote("#endif") + [ local, object, @@ -67,3 +92,245 @@ interface IMetaDataTables : IUnknown
HRESULT GetNextUserString([in] ULONG idx, [out] ULONG *next); } + +typedef void *HCORENUM; +typedef BYTE COR_SIGNATURE; +typedef const char *UVCP_CONSTANT; + +typedef struct COR_FIELD_OFFSET +{ + mdFieldDef ridOfField; + UINT32 ulOffset; +} COR_FIELD_OFFSET; + +[ + local, + object, + uuid(7dac8207-d3ae-4c75-9b67-92801a497d44) +] +interface IMetaDataImport : IUnknown +{ + void CloseEnum([in] HCORENUM henum); + + HRESULT CountEnum([in] HCORENUM henum, [out, retval] ULONG *count); + + HRESULT ResetEnum([in] HCORENUM henum, [in] ULONG pos); + + HRESULT EnumTypeDefs([in, out] HCORENUM *henum, [out, size_is(len), length_is(*count)] mdTypeDef *typedefs, + [in] ULONG len, [out, retval] ULONG *count); + + HRESULT EnumInterfaceImpls([in, out] HCORENUM *henum, [in] mdTypeDef type_def, + [out, size_is(len), length_is(*count)] mdInterfaceImpl *impls, [in] ULONG len, + [out, retval] ULONG *count); + + HRESULT EnumTypeRefs([in, out] HCORENUM *henum, + [out, size_is(len), length_is(*count)] mdTypeRef *typerefs, [in] ULONG len, + [out, retval] ULONG *count); + + HRESULT FindTypeDefByName([in, string] const WCHAR *name, [in] mdToken enclosing_class, + [out, retval] mdTypeDef *type_def); + + HRESULT GetScopeProps([out, string, size_is(len), length_is(*written)] WCHAR *name, [in] ULONG len, + [out] ULONG *written, [out, unique] GUID *mvid); + + HRESULT GetModuleFromScope([out] mdModule *module_token); + + HRESULT GetTypeDefProps([in] mdTypeDef type_def, [out, string, size_is(len), length_is(*written)] WCHAR *name, + [in] ULONG len, [out] ULONG *written, [out] ULONG *flags, [out] mdToken *extends); + + HRESULT GetInterfaceImplProps([in] mdInterfaceImpl iface_impl, [out] mdTypeDef *class_token, [out] mdToken *iface); + + HRESULT GetTypeRefProps([in] mdTypeRef typeref, [out] mdToken *resolution_scope, + [out, string, size_is(len), length_is(*written)] WCHAR *name, [in] ULONG len, + [out] ULONG *written); + + HRESULT ResolveTypeRef([in] mdTypeRef typeref, [in] const GUID *iid, [out, iid_is(iid)] IUnknown **scope, + [out, retval] mdTypeDef *type_def); + + HRESULT EnumMembers([in, out] HCORENUM *henum, [in] mdTypeDef type_def, + [out, size_is(len), length_is(*count)] mdToken *member_defs, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumMembersWithName([in, out] HCORENUM *henum, [in] mdTypeDef token, [in, string] const WCHAR *name, + [out, size_is(len), length_is(*count)] mdToken *member_defs, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumMethods([in, out] HCORENUM *henum, [in] mdTypeDef type_def, + [out, size_is(len), length_is(*count)] mdMethodDef *method_defs, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumMethodsWithName([in, out] HCORENUM *henum, [in] mdTypeDef type_def, [in, string] const WCHAR *name, + [out, size_is(len), length_is(*count)] mdMethodDef *method_defs, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumFields([in, out] HCORENUM *henum, [in] mdTypeDef token, + [out, size_is(len), length_is(*count)] mdFieldDef *field_defs, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumFieldsWithName([in, out] HCORENUM *henum, [in] mdTypeDef token, [in, string] const WCHAR *name, + [out, size_is(len), length_is(*count)] mdFieldDef *field_defs, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumParams([in, out] HCORENUM *henum, [in] mdMethodDef method_def, + [out, size_is(len), length_is(*count)] mdParamDef *params, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumMemberRefs([in, out] HCORENUM *henum, [in] mdToken parent, + [out, size_is(len), length_is(*count)] mdMemberRef *members, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumMethodImpls([in, out] HCORENUM *henum, [in] mdTypeDef token, + [out, size_is(len), length_is(*count)] mdToken *body_tokens, + [out, size_is(len), length_is(*count)] mdToken *decl_tokens, [in] ULONG len, + [out] ULONG *count); + + HRESULT EnumPermissionSets([in, out] HCORENUM *henum, [in] mdToken token, [in] ULONG actions, + [out, size_is(len), length_is(*count)] mdPermission *permissions, [in] ULONG len, + [out] ULONG *count); + + HRESULT FindMember([in] mdTypeDef type_def, [in, string] const WCHAR *name, + [in, size_is(len)] const COR_SIGNATURE *sig_blob, [in] ULONG len, [out] mdToken *member_ref); + + HRESULT FindMethod([in] mdTypeDef type_def, [in, string] const WCHAR *name, + [in, size_is(len)] const COR_SIGNATURE *sig_blob, [in] ULONG len, + [out] mdMethodDef *method_def); + + HRESULT FindField([in] mdTypeDef type_def, [in, string] const WCHAR *name, + [in, size_is(len)] const COR_SIGNATURE *sig_blob, [in] ULONG len, [out] mdFieldDef *field_def); + + HRESULT FindMemberRef([in] mdTypeRef typeref, [in, string] const WCHAR *name, + [in, size_is(len)] const COR_SIGNATURE *sig_blob, [in] ULONG len, + [out] mdMemberRef *member_ref); + + HRESULT GetMethodProps([in] mdMethodDef method_def, [out] mdTypeDef *type_def, + [out, string, size_is(name_len), length_is(*written)] WCHAR *method_name, [in] ULONG name_len, + [out] ULONG *written, [out] ULONG *method_flags, + [out, size_is(, *sig_len)] const COR_SIGNATURE **sig_blob, [out] ULONG *sig_len, + [out] ULONG *rva, [out] ULONG *impl_flags); + + HRESULT GetMemberRefProps([in] mdMemberRef member_ref, [out] mdToken *token, + [out, string, size_is(name_len), length_is(*written)] WCHAR *member_name, + [in] ULONG name_len, [out] ULONG *written, + [out, size_is(, *sig_len)] const COR_SIGNATURE **sig_blob, [out] ULONG *sig_len); + + HRESULT EnumProperties([in, out] HCORENUM *henum, [in] mdTypeDef type_def, + [out, size_is(len), length_is(*count)] mdProperty *props, + [in] ULONG len, [out] ULONG *count); + + HRESULT EnumEvents([in, out] HCORENUM *henum, [in] mdTypeDef type_def, + [out, size_is(len), length_is(*count)] mdEvent *events, [in] ULONG len, [out] ULONG *count); + + HRESULT GetEventProps([in] mdEvent event, [out] mdTypeDef *class_typedef, + [out, string, size_is(name_len), length_is(*written)] WCHAR *name, [in] ULONG name_len, + [out] ULONG *written, [out] ULONG *event_flags, [out] mdToken *event_type, + [out] mdMethodDef *add_method, [out] mdMethodDef *remove_method, + [out] mdMethodDef *fire_method, + [out, size_is(other_len), length_is(*other_count)] mdMethodDef *other_methods, + [in] ULONG other_len, [out] ULONG *other_count); + + HRESULT EnumMethodSemantics([in, out] HCORENUM *henum, [in] mdMethodDef method_def, + [out, size_is(len), length_is(*written)] mdToken *event_props, [in] ULONG len, + [out] ULONG *written); + + HRESULT GetMethodSemantics([in] mdMethodDef method_def, [in] mdToken event_prop, [out] ULONG *semantics); + + HRESULT GetClassLayout([in] mdTypeDef type_def, [out] ULONG *pack_size, + [out, size_is(len), length_is(*count)] COR_FIELD_OFFSET *offsets, [in] ULONG len, + [out] ULONG *count, [out] ULONG *class_size); + + HRESULT GetFieldMarshal([in] mdToken token, [out, size_is(, *len)] const COR_SIGNATURE **native_type_blob, + [out] ULONG *len); + + HRESULT GetRVA([in] mdToken token, [out] ULONG *rva, [out] ULONG *impl_flags); + + HRESULT GetPermissionSetProps([in] mdPermission permission, [out] ULONG *decl_sec, + [out, size_is(, *len)] BYTE const **perm_blob, [out] ULONG *len); + + HRESULT GetSigFromToken([in] mdSignature signature, [out, size_is(, *len)] const COR_SIGNATURE **sig_blob, + [out] ULONG *len); + + HRESULT GetModuleRefProps([in] mdModuleRef module_ref, [out, string, size_is(len), length_is(*written)] WCHAR *name, + [in] ULONG len, [out] ULONG *written); + + HRESULT EnumModuleRefs([in, out] HCORENUM *henum, + [out, size_is(len), length_is(*count)] mdModuleRef *module_refs, [in] ULONG len, + [out] ULONG *count); + + HRESULT GetTypeSpecFromToken([in] mdTypeSpec typespec, [out, size_is(, *len)] const COR_SIGNATURE **sig_blob, + [out] ULONG *len); + + HRESULT GetNameFromToken([in] mdToken token, [out, string] const char **name); + + HRESULT EnumUnresolvedMethods([in, out] HCORENUM *henum, + [out, size_is(len), length_is(*count)] mdToken *method_defs, [in] ULONG len, + [out] ULONG *count); + + HRESULT GetUserString([in] mdString string_token, [out, string, size_is(len), length_is(*written)] WCHAR *str, + [in] ULONG len, [out] ULONG *written); + + HRESULT GetPinvokeMap([in] mdToken field_method_def, [out] ULONG *map_flags, + [out, string, size_is(len), length_is(*written)] WCHAR *import_name, [in] ULONG len, + [out] ULONG *written, [out] mdModuleRef *target); + + HRESULT EnumSignatures([in, out] HCORENUM *henum, [out, size_is(len), length_is(*count)] mdSignature *sigs, + [in] ULONG len, [out] ULONG *count); + + HRESULT EnumTypeSpecs([in, out] HCORENUM *henum, [out, size_is(len), length_is(*count)] mdTypeSpec *typespecs, + [in] ULONG len, [out] ULONG *count); + + HRESULT EnumUserStrings([in, out] HCORENUM *henum, [out, size_is(len), length_is(*count)] mdString *strings, + [in] ULONG len, [out] ULONG *count); + + HRESULT GetParamForMethodIndex([in] mdMethodDef token, [in] ULONG param_seq, [out] mdParamDef *param_def); + + HRESULT EnumCustomAttributes([in, out] HCORENUM *henum, [in] mdToken token, [in] mdToken token_type, + [out, size_is(len), length_is(*count)] mdCustomAttribute *attrs, [in] ULONG len, + [out] ULONG *count); + + HRESULT GetCustomAttributeProps([in] mdCustomAttribute custom_attr, [out, unique] mdToken *obj, + [out, unique] mdToken *attr_type, [out, size_is(, *len), unique] BYTE const **blob, + [out] ULONG *len); + + HRESULT FindTypeRef([in] mdToken resolution_scope, [in, string] const WCHAR *name, [out] mdTypeRef *typeref); + + HRESULT GetMemberProps([in] mdToken member, [out] mdTypeDef *type_def, + [out, string, size_is(member_len), length_is(*member_written)] WCHAR *name, + [in] ULONG member_len,[out] ULONG *member_written, [out] ULONG *flags, + [out, size_is(, *blob_len)] const COR_SIGNATURE **sig_blob, [out] ULONG *blob_len, + [out] ULONG *rva, [out] ULONG *impl_flags, [out] ULONG *value_type_flag, + [out, size_is(, *value_len)] UVCP_CONSTANT *value, [out] ULONG *value_len); + + HRESULT GetFieldProps([in] mdFieldDef fielddef, [out] mdTypeDef *type_def, + [out, string, size_is(name_len), length_is(*name_written)] WCHAR *field_name, + [in] ULONG name_len, [out] ULONG *name_written, [out] ULONG *flags, + [out, size_is(, *sig_len)] const COR_SIGNATURE **sig_blob, [out] ULONG *sig_len, + [out] ULONG *value_type_flag, + [out, size_is(, *value_len)] UVCP_CONSTANT *value, [out] ULONG *value_len); + + HRESULT GetPropertyProps([in] mdProperty prop, [out] mdTypeDef *type_def, + [out, string, size_is(name_len), length_is(*name_written)] WCHAR *name, + [in] ULONG name_len, [out] ULONG *name_written, [out] ULONG *prop_flags, + [out, size_is(, *sig_len)] const COR_SIGNATURE **sig_blob, [out] ULONG *sig_len, + [out] ULONG *value_type_flag, [out, size_is(, *value_len)] UVCP_CONSTANT *default_value, + [out] ULONG *value_len, [out] mdMethodDef *set_method, [out] mdMethodDef *get_method, + [out, size_is(other_len), length_is(*other_count)] mdMethodDef *other_methods, + [in] ULONG other_len, [out] ULONG *other_count); + + HRESULT GetParamProps([in] mdParamDef param_def, [out] mdMethodDef *method_def, + [out] ULONG *param_seq, + [out, string, size_is(name_len), length_is(*name_written)] WCHAR *name, [in] ULONG name_len, + [out] ULONG *name_written, [out] ULONG *flags, [out] ULONG *value_type_flag, + [out, size_is(, *value_len)] UVCP_CONSTANT *value, [out] ULONG *value_len); + + HRESULT GetCustomAttributeByName([in] mdToken obj, [in, string] const WCHAR *name, + [out, size_is(, *len)] BYTE const **data, [out] ULONG *len); + + BOOL IsValidToken([in] mdToken token); + + HRESULT GetNestedClassProps([in] mdTypeDef nested_class, [out] mdTypeDef *enclosing_class); + + HRESULT GetNativeCallConvFromSig([in, size_is(len)] BYTE const *sig_blob, [in] ULONG len, + [out] ULONG *call_conv); + + HRESULT IsGlobal([in] mdToken token, [out] int *is_global); +}