STDAPI DllRegisterServer(void) { HKEY hKey, hSubKey; LPOLESTR pStr; WCHAR szName[MAX_PATH] = L"CLSID\\"; if (FAILED(StringFromCLSID(&CLSID_CNetCfg, &pStr))) return SELFREG_E_CLASS; wcscpy(&szName[6], pStr); CoTaskMemFree(pStr); if (RegCreateKeyExW(HKEY_CLASSES_ROOT, szName, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) return SELFREG_E_CLASS; if (RegCreateKeyExW(hKey, L"InProcServer32", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS) { if (!GetModuleFileNameW(netcfgx_hInstance, szName, sizeof(szName)/sizeof(WCHAR))) { RegCloseKey(hSubKey); RegCloseKey(hKey); return SELFREG_E_CLASS; } szName[(sizeof(szName)/sizeof(WCHAR))-1] = L'\0'; RegSetValueW(hSubKey, NULL, REG_SZ, szName, (wcslen(szName)+1) * sizeof(WCHAR)); RegSetValueExW(hSubKey, L"ThreadingModel", 0, REG_SZ, (LPBYTE)L"Both", 10); RegCloseKey(hSubKey); } RegCloseKey(hKey); return S_OK; }
LONG SetKey(LPCWSTR lpSubKey, LPCWSTR lpData, DWORD dwSize) const { if (!IsValidHandle()) return ERROR_INVALID_HANDLE; return RegSetValueW(hKey(), lpSubKey, REG_SZ, lpData, dwSize); }
BOOL My_RegSetValueW() { HKEY hKey=NULL; LPCWSTR lpSubKey=NULL; DWORD dwType=NULL; LPCWSTR lpData=NULL; DWORD cbData=NULL; LONG returnVal_Real = NULL; LONG returnVal_Intercepted = NULL; DWORD error_Real = 0; DWORD error_Intercepted = 0; disableInterception(); returnVal_Real = RegSetValueW (hKey,lpSubKey,dwType,lpData,cbData); error_Real = GetLastError(); enableInterception(); returnVal_Intercepted = RegSetValueW (hKey,lpSubKey,dwType,lpData,cbData); error_Intercepted = GetLastError(); return ((returnVal_Real == returnVal_Intercepted) && (error_Real == error_Intercepted)); }
/* * SetupRegisterClass() */ static HRESULT SetupRegisterClass(HKEY clsid, LPCWSTR szCLSID, LPCWSTR szDescription, LPCWSTR szFileName, LPCWSTR szServerType, LPCWSTR szThreadingModel) { HKEY hkey, hsubkey; LONG ret = RegCreateKeyW(clsid, szCLSID, &hkey); if (ERROR_SUCCESS != ret) return HRESULT_FROM_WIN32(ret); /* set description string */ ret = RegSetValueW(hkey, NULL, REG_SZ, szDescription, sizeof(WCHAR) * (lstrlenW(szDescription) + 1)); if (ERROR_SUCCESS != ret) goto err_out; /* create CLSID\\{"CLSID"}\\"ServerType" key, using key to CLSID\\{"CLSID"} passed back by last call to RegCreateKeyW(). */ ret = RegCreateKeyW(hkey, szServerType, &hsubkey); if (ERROR_SUCCESS != ret) goto err_out; /* set server path */ ret = RegSetValueW(hsubkey, NULL, REG_SZ, szFileName, sizeof(WCHAR) * (lstrlenW(szFileName) + 1)); if (ERROR_SUCCESS != ret) goto err_out; /* set threading model */ ret = RegSetValueExW(hsubkey, tmodel_keyname, 0L, REG_SZ, (const BYTE*)szThreadingModel, sizeof(WCHAR) * (lstrlenW(szThreadingModel) + 1)); err_out: if (hsubkey) RegCloseKey(hsubkey); RegCloseKey(hkey); return HRESULT_FROM_WIN32(ret); }
STDAPI DllRegisterServer(void) { HKEY hKey, hSubKey; WCHAR szName[MAX_PATH+20] = {0}; WCHAR szNet[20]; UINT Length, Offset; if (RegCreateKeyExW(HKEY_CLASSES_ROOT, szNetConnectClass, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) return SELFREG_E_CLASS; if (LoadStringW(netshell_hInstance, IDS_NETWORKCONNECTION, szName, MAX_PATH)) { szName[MAX_PATH-1] = L'\0'; RegSetValueW(hKey, NULL, REG_SZ, szName, (wcslen(szName)+1) * sizeof(WCHAR)); } if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szNamespaceKey, 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS) { RegSetValueW(hSubKey, NULL, REG_SZ, szName, (wcslen(szName)+1) * sizeof(WCHAR)); RegCloseKey(hSubKey); } Length = swprintf(szNet, L",-%u", IDS_NETWORKCONNECTION); Offset = GetModuleFileNameW(netshell_hInstance, &szName[1], (sizeof(szName)/sizeof(WCHAR))-1); if (Offset + Length + 2 < MAX_PATH) { /* set localized name */ szName[0] = L'@'; wcscpy(&szName[Offset+1], szNet); RegSetValueExW(hKey, L"LocalizedString", 0, REG_SZ, (const LPBYTE)szName, (wcslen(szName)+1) * sizeof(WCHAR)); } szName[Offset+1] = L'\0'; /* store default icon */ if (RegCreateKeyExW(hKey, L"DefaultIcon", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS) { RegSetValueW(hSubKey, NULL, REG_SZ, &szName[1], (Offset+1) * sizeof(WCHAR)); RegCloseKey(hSubKey); } if (RegCreateKeyExW(hKey, L"InProcServer32", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS) { RegSetValueW(hSubKey, NULL, REG_SZ, &szName[1], (Offset+1) * sizeof(WCHAR)); RegSetValueExW(hSubKey, L"ThreadingModel", 0, REG_SZ, (LPBYTE)L"Both", 10); RegCloseKey(hSubKey); } if (RegCreateKeyExW(hKey, L"ShellFolder", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS) { DWORD dwAttributes = SFGAO_FOLDER; RegSetValueExW(hSubKey, L"Attributes",0, REG_BINARY, (const LPBYTE)&dwAttributes, sizeof(DWORD)); } RegCloseKey(hKey); if (RegCreateKeyExW(HKEY_CLASSES_ROOT, szLanConnectUI, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) return SELFREG_E_CLASS; if (RegCreateKeyExW(hKey, L"InProcServer32", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS) { RegSetValueW(hSubKey, NULL, REG_SZ, &szName[1], (Offset+1) * sizeof(WCHAR)); RegSetValueExW(hSubKey, L"ThreadingModel", 0, REG_SZ, (LPBYTE)L"Both", 10); RegCloseKey(hSubKey); } RegCloseKey(hKey); if (RegCreateKeyExW(HKEY_CLASSES_ROOT, szLanConnectStatusUI, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) return SELFREG_E_CLASS; if (RegCreateKeyExW(hKey, L"InProcServer32", 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) == ERROR_SUCCESS) { RegSetValueW(hSubKey, NULL, REG_SZ, &szName[1], (Offset+1) * sizeof(WCHAR)); RegSetValueExW(hSubKey, L"ThreadingModel", 0, REG_SZ, (LPBYTE)L"Both", 10); RegCloseKey(hSubKey); } RegCloseKey(hKey); 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; }