static HRESULT do_register_dll_server(IRegistrar *pRegistrar, LPCOLESTR wszDll, LPCOLESTR wszId, BOOL do_register, const struct _ATL_REGMAP_ENTRY* pMapEntries) { WCHAR buf[MAX_PATH]; HRESULT hres; const struct _ATL_REGMAP_ENTRY *pMapEntry; static const WCHAR wszModule[] = {'M','O','D','U','L','E',0}; static const WCHAR wszRegistry[] = {'R','E','G','I','S','T','R','Y',0}; static const WCHAR wszCLSID_ATLRegistrar[] = {'C','L','S','I','D','_','A','T','L','R','e','g','i','s','t','r','a','r',0}; if (!pRegistrar) Registrar_create(NULL, &IID_IRegistrar, (void**)&pRegistrar); IRegistrar_AddReplacement(pRegistrar, wszModule, wszDll); for (pMapEntry = pMapEntries; pMapEntry && pMapEntry->szKey; pMapEntry++) IRegistrar_AddReplacement(pRegistrar, pMapEntry->szKey, pMapEntry->szData); StringFromGUID2(&CLSID_ATLRegistrar, buf, sizeof(buf)/sizeof(buf[0])); IRegistrar_AddReplacement(pRegistrar, wszCLSID_ATLRegistrar, buf); if(do_register) hres = IRegistrar_ResourceRegisterSz(pRegistrar, wszDll, wszId, wszRegistry); else hres = IRegistrar_ResourceUnregisterSz(pRegistrar, wszDll, wszId, wszRegistry); IRegistrar_Release(pRegistrar); return hres; }
static HRESULT do_register_dll_server(IRegistrar *pRegistrar, LPCOLESTR wszDll, LPCOLESTR wszId, BOOL do_register, const struct _ATL_REGMAP_ENTRY* pMapEntries) { IRegistrar *registrar; HRESULT hres; const struct _ATL_REGMAP_ENTRY *pMapEntry; static const WCHAR wszModule[] = {'M','O','D','U','L','E',0}; static const WCHAR wszRegistry[] = {'R','E','G','I','S','T','R','Y',0}; if(pRegistrar) { registrar = pRegistrar; }else { hres = AtlCreateRegistrar(®istrar); if(FAILED(hres)) return hres; } IRegistrar_AddReplacement(registrar, wszModule, wszDll); for (pMapEntry = pMapEntries; pMapEntry && pMapEntry->szKey; pMapEntry++) IRegistrar_AddReplacement(registrar, pMapEntry->szKey, pMapEntry->szData); if(do_register) hres = IRegistrar_ResourceRegisterSz(registrar, wszDll, wszId, wszRegistry); else hres = IRegistrar_ResourceUnregisterSz(registrar, wszDll, wszId, wszRegistry); if(registrar != pRegistrar) IRegistrar_Release(registrar); return hres; }
/*********************************************************************** * AtlUpdateRegistryFromResourceD [atl100.@] */ HRESULT WINAPI AtlUpdateRegistryFromResourceD(HINSTANCE inst, LPCOLESTR res, BOOL bRegister, struct _ATL_REGMAP_ENTRY *pMapEntries, IRegistrar *pReg) { const struct _ATL_REGMAP_ENTRY *iter; WCHAR module_name[MAX_PATH]; IRegistrar *registrar; HRESULT hres; static const WCHAR moduleW[] = {'M','O','D','U','L','E',0}; static const WCHAR registryW[] = {'R','E','G','I','S','T','R','Y',0}; if(!GetModuleFileNameW(inst, module_name, MAX_PATH)) { FIXME("hinst %p: did not get module name\n", inst); return E_FAIL; } TRACE("%p (%s), %s, %d, %p, %p\n", inst, debugstr_w(module_name), debugstr_w(res), bRegister, pMapEntries, pReg); if(pReg) { registrar = pReg; }else { hres = AtlCreateRegistrar(®istrar); if(FAILED(hres)) return hres; } IRegistrar_AddReplacement(registrar, moduleW, module_name); for (iter = pMapEntries; iter && iter->szKey; iter++) IRegistrar_AddReplacement(registrar, iter->szKey, iter->szData); if(bRegister) hres = IRegistrar_ResourceRegisterSz(registrar, module_name, res, registryW); else hres = IRegistrar_ResourceUnregisterSz(registrar, module_name, res, registryW); if(registrar != pReg) IRegistrar_Release(registrar); return hres; }
static void register_fake_dll( const WCHAR *name, const void *data, size_t size ) { static const WCHAR atlW[] = {'a','t','l','.','d','l','l',0}; static const WCHAR moduleW[] = {'M','O','D','U','L','E',0}; static const WCHAR regtypeW[] = {'W','I','N','E','_','R','E','G','I','S','T','R','Y',0}; static const WCHAR manifestW[] = {'W','I','N','E','_','M','A','N','I','F','E','S','T',0}; const IMAGE_RESOURCE_DIRECTORY *resdir; LDR_RESOURCE_INFO info; HRESULT hr = S_OK; HMODULE module = (HMODULE)((ULONG_PTR)data | 1); HRSRC rsrc; if ((rsrc = FindResourceW( module, manifestW, MAKEINTRESOURCEW(RT_MANIFEST) ))) { char *manifest = LoadResource( module, rsrc ); register_manifest( name, manifest, SizeofResource( module, rsrc ), data, size ); } info.Type = (ULONG_PTR)regtypeW; if (LdrFindResourceDirectory_U( module, &info, 1, &resdir )) return; if (!registrar) { /* create the object by hand since we can't guarantee that atl and ole32 are registered */ IClassFactory *cf; HRESULT (WINAPI *pDllGetClassObject)( REFCLSID clsid, REFIID iid, LPVOID *ppv ); HMODULE atl = LoadLibraryW( atlW ); if ((pDllGetClassObject = (void *)GetProcAddress( atl, "DllGetClassObject" ))) { hr = pDllGetClassObject( &CLSID_Registrar, &IID_IClassFactory, (void **)&cf ); if (SUCCEEDED( hr )) { hr = IClassFactory_CreateInstance( cf, NULL, &IID_IRegistrar, (void **)®istrar ); IClassFactory_Release( cf ); } } if (!registrar) { ERR( "failed to create IRegistrar: %x\n", hr ); return; } } TRACE( "registering %s\n", debugstr_w(name) ); IRegistrar_ClearReplacements( registrar ); IRegistrar_AddReplacement( registrar, moduleW, name ); EnumResourceNamesW( module, regtypeW, register_resource, (LONG_PTR)&hr ); if (FAILED(hr)) ERR( "failed to register %s: %x\n", debugstr_w(name), hr ); }
static void register_fake_dll( const WCHAR *name, const void *data, size_t size ) { static const WCHAR atlW[] = {'a','t','l','1','0','0','.','d','l','l',0}; static const WCHAR moduleW[] = {'M','O','D','U','L','E',0}; static const WCHAR regtypeW[] = {'W','I','N','E','_','R','E','G','I','S','T','R','Y',0}; static const WCHAR manifestW[] = {'W','I','N','E','_','M','A','N','I','F','E','S','T',0}; const IMAGE_RESOURCE_DIRECTORY *resdir; LDR_RESOURCE_INFO info; HRESULT hr = S_OK; HMODULE module = (HMODULE)((ULONG_PTR)data | 1); HRSRC rsrc; if ((rsrc = FindResourceW( module, manifestW, MAKEINTRESOURCEW(RT_MANIFEST) ))) { char *manifest = LoadResource( module, rsrc ); register_manifest( name, manifest, SizeofResource( module, rsrc ), data, size ); } info.Type = (ULONG_PTR)regtypeW; if (LdrFindResourceDirectory_U( module, &info, 1, &resdir )) return; if (!registrar) { HRESULT (WINAPI *pAtlCreateRegistrar)(IRegistrar**); HMODULE atl = LoadLibraryW( atlW ); if ((pAtlCreateRegistrar = (void *)GetProcAddress( atl, "AtlCreateRegistrar" ))) hr = pAtlCreateRegistrar( ®istrar ); else hr = E_NOINTERFACE; if (!registrar) { ERR( "failed to create IRegistrar: %x\n", hr ); return; } } TRACE( "registering %s\n", debugstr_w(name) ); IRegistrar_ClearReplacements( registrar ); IRegistrar_AddReplacement( registrar, moduleW, name ); EnumResourceNamesW( module, regtypeW, register_resource, (LONG_PTR)&hr ); if (FAILED(hr)) ERR( "failed to register %s: %x\n", debugstr_w(name), hr ); }