/*********************************************************************** * NdrDllUnregisterProxy [RPCRT4.@] */ HRESULT WINAPI NdrDllUnregisterProxy(HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid) { static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0}; static const WCHAR interfaceW[] = {'I','n','t','e','r','f','a','c','e','\\',0}; WCHAR keyname[50]; TRACE("(%p,%p,%s)\n", hDll, pProxyFileList, debugstr_guid(pclsid)); /* unregister interfaces */ while (*pProxyFileList) { unsigned u; for (u=0; u<(*pProxyFileList)->TableSize; u++) { CInterfaceStubVtbl *proxy = (*pProxyFileList)->pStubVtblList[u]; PCInterfaceName name = (*pProxyFileList)->pNamesArray[u]; TRACE("unregistering %s %s\n", debugstr_a(name), debugstr_guid(proxy->header.piid)); strcpyW( keyname, interfaceW ); format_clsid( keyname + strlenW(keyname), proxy->header.piid ); RegDeleteTreeW(HKEY_CLASSES_ROOT, keyname); } pProxyFileList++; } /* unregister clsid */ strcpyW( keyname, clsidW ); format_clsid( keyname + strlenW(keyname), pclsid ); RegDeleteTreeW(HKEY_CLASSES_ROOT, keyname); return S_OK; }
/*********************************************************************** * NdrDllRegisterProxy [RPCRT4.@] */ HRESULT WINAPI NdrDllRegisterProxy(HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid) { static const WCHAR bothW[] = {'B','o','t','h',0}; static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0}; static const WCHAR clsid32W[] = {'P','r','o','x','y','S','t','u','b','C','l','s','i','d','3','2',0}; static const WCHAR interfaceW[] = {'I','n','t','e','r','f','a','c','e','\\',0}; static const WCHAR psfactoryW[] = {'P','S','F','a','c','t','o','r','y','B','u','f','f','e','r',0}; static const WCHAR numformatW[] = {'%','u',0}; static const WCHAR nummethodsW[] = {'N','u','m','M','e','t','h','o','d','s',0}; static const WCHAR inprocserverW[] = {'I','n','P','r','o','c','S','e','r','v','e','r','3','2',0}; static const WCHAR threadingmodelW[] = {'T','h','r','e','a','d','i','n','g','M','o','d','e','l',0}; WCHAR clsid[39], keyname[50], module[MAX_PATH]; HKEY key, subkey; DWORD len; TRACE("(%p,%p,%s)\n", hDll, pProxyFileList, debugstr_guid(pclsid)); if (!hDll) return E_HANDLE; if (!*pProxyFileList) return E_NOINTERFACE; if (pclsid) format_clsid( clsid, pclsid ); else if ((*pProxyFileList)->TableSize > 0) format_clsid( clsid,(*pProxyFileList)->pStubVtblList[0]->header.piid); else return E_NOINTERFACE; /* register interfaces to point to clsid */ while (*pProxyFileList) { unsigned u; for (u=0; u<(*pProxyFileList)->TableSize; u++) { CInterfaceStubVtbl *proxy = (*pProxyFileList)->pStubVtblList[u]; PCInterfaceName name = (*pProxyFileList)->pNamesArray[u]; TRACE("registering %s %s => %s\n", debugstr_a(name), debugstr_guid(proxy->header.piid), debugstr_w(clsid)); strcpyW( keyname, interfaceW ); format_clsid( keyname + strlenW(keyname), proxy->header.piid ); if (RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key) == ERROR_SUCCESS) { WCHAR num[10]; if (name) RegSetValueExA(key, NULL, 0, REG_SZ, (const BYTE *)name, strlen(name)+1); RegSetValueW( key, clsid32W, REG_SZ, clsid, 0 ); sprintfW(num, numformatW, proxy->header.DispatchTableCount); RegSetValueW( key, nummethodsW, REG_SZ, num, 0 ); RegCloseKey(key); } } pProxyFileList++; } /* register clsid to point to module */ strcpyW( keyname, clsidW ); strcatW( keyname, clsid ); len = GetModuleFileNameW(hDll, module, sizeof(module)/sizeof(WCHAR)); if (len && len < sizeof(module)) { TRACE("registering CLSID %s => %s\n", debugstr_w(clsid), debugstr_w(module)); if (RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key) == ERROR_SUCCESS) { RegSetValueExW(key, NULL, 0, REG_SZ, (const BYTE *)psfactoryW, sizeof(psfactoryW)); if (RegCreateKeyW(key, inprocserverW, &subkey) == ERROR_SUCCESS) { RegSetValueExW(subkey, NULL, 0, REG_SZ, (LPBYTE)module, (strlenW(module)+1)*sizeof(WCHAR)); RegSetValueExW(subkey, threadingmodelW, 0, REG_SZ, (const BYTE *)bothW, sizeof(bothW)); RegCloseKey(subkey); } RegCloseKey(key); } } return S_OK; }