📄 regsvr.c
字号:
KEY_READ | KEY_WRITE, &coclass_key);
if (res == ERROR_FILE_NOT_FOUND) return S_OK;
if (res != ERROR_SUCCESS) goto error_return;
for (; res == ERROR_SUCCESS && list->clsid; ++list) {
WCHAR buf[39];
StringFromGUID2(list->clsid, buf, 39);
res = recursive_delete_keyW(coclass_key, buf);
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
if (list->progid) {
res = recursive_delete_keyA(HKEY_CLASSES_ROOT, list->progid);
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
}
if (list->viprogid) {
res = recursive_delete_keyA(HKEY_CLASSES_ROOT, list->viprogid);
if (res != ERROR_SUCCESS) goto error_close_coclass_key;
}
}
error_close_coclass_key:
RegCloseKey(coclass_key);
error_return:
return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
}
/***********************************************************************
* regsvr_key_guid
*/
static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) {
WCHAR buf[39];
StringFromGUID2(guid, buf, 39);
return register_key_defvalueW(base, name, buf);
}
/***********************************************************************
* regsvr_key_defvalueW
*/
static LONG register_key_defvalueW(
HKEY base,
WCHAR const *name,
WCHAR const *value) {
LONG res;
HKEY key;
res = RegCreateKeyExW(base, name, 0, NULL, 0,
KEY_READ | KEY_WRITE, NULL, &key, NULL);
if (res != ERROR_SUCCESS) return res;
res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
(lstrlenW(value) + 1) * sizeof(WCHAR));
RegCloseKey(key);
return res;
}
/***********************************************************************
* regsvr_key_defvalueA
*/
static LONG register_key_defvalueA(
HKEY base,
WCHAR const *name,
char const *value) {
LONG res;
HKEY key;
res = RegCreateKeyExW(base, name, 0, NULL, 0,
KEY_READ | KEY_WRITE, NULL, &key, NULL);
if (res != ERROR_SUCCESS) return res;
res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
lstrlenA(value) + 1);
RegCloseKey(key);
return res;
}
/***********************************************************************
* regsvr_progid
*/
static LONG register_progid(
WCHAR const *clsid,
char const *progid,
char const *curver_progid,
char const *name,
char const *extra) {
LONG res;
HKEY progid_key;
res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0,
NULL, 0, KEY_READ | KEY_WRITE, NULL,
&progid_key, NULL);
if (res != ERROR_SUCCESS) return res;
if (name) {
res = RegSetValueExA(progid_key, NULL, 0, REG_SZ,
(CONST BYTE*)name, strlen(name) + 1);
if (res != ERROR_SUCCESS) goto error_close_progid_key;
}
if (clsid) {
res = register_key_defvalueW(progid_key, clsid_keyname, clsid);
if (res != ERROR_SUCCESS) goto error_close_progid_key;
}
if (curver_progid) {
res = register_key_defvalueA(progid_key, curver_keyname,
curver_progid);
if (res != ERROR_SUCCESS) goto error_close_progid_key;
}
if (extra) {
HKEY extra_key;
res = RegCreateKeyExA(progid_key, extra, 0,
NULL, 0, KEY_READ | KEY_WRITE, NULL,
&extra_key, NULL);
if (res == ERROR_SUCCESS)
RegCloseKey(extra_key);
}
error_close_progid_key:
RegCloseKey(progid_key);
return res;
}
/***********************************************************************
* recursive_delete_key
*/
static LONG recursive_delete_key(HKEY key) {
LONG res;
WCHAR subkey_name[MAX_PATH];
DWORD cName;
HKEY subkey;
for (;;) {
cName = sizeof(subkey_name) / sizeof(WCHAR);
res = RegEnumKeyExW(key, 0, subkey_name, &cName,
NULL, NULL, NULL, NULL);
if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) {
res = ERROR_SUCCESS; /* presumably we're done enumerating */
break;
}
res = RegOpenKeyExW(key, subkey_name, 0,
KEY_READ | KEY_WRITE, &subkey);
if (res == ERROR_FILE_NOT_FOUND) continue;
if (res != ERROR_SUCCESS) break;
res = recursive_delete_key(subkey);
RegCloseKey(subkey);
if (res != ERROR_SUCCESS) break;
}
if (res == ERROR_SUCCESS) res = RegDeleteKeyW(key, 0);
return res;
}
/***********************************************************************
* recursive_delete_keyA
*/
static LONG recursive_delete_keyA(HKEY base, char const *name) {
LONG res;
HKEY key;
res = RegOpenKeyExA(base, name, 0, KEY_READ | KEY_WRITE, &key);
if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS;
if (res != ERROR_SUCCESS) return res;
res = recursive_delete_key(key);
RegCloseKey(key);
return res;
}
/***********************************************************************
* recursive_delete_keyW
*/
static LONG recursive_delete_keyW(HKEY base, WCHAR const *name) {
LONG res;
HKEY key;
res = RegOpenKeyExW(base, name, 0, KEY_READ | KEY_WRITE, &key);
if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS;
if (res != ERROR_SUCCESS) return res;
res = recursive_delete_key(key);
RegCloseKey(key);
return res;
}
/***********************************************************************
* coclass list
*/
static struct regsvr_coclass const coclass_list[] = {
{
&CLSID_IMsiServer,
"Msi install server",
"ole32.dll",
NULL,
"msi.dll",
"Apartment",
PROGID_CLSID,
"IMsiServer",
NULL
},
{
&CLSID_IMsiServerMessage,
"Wine Installer Message RPC",
NULL,
NULL,
"msi.dll",
NULL,
PROGID_CLSID,
"WindowsInstaller.Message",
NULL
},
{
&CLSID_IMsiServerX1,
"Msi install server",
"ole32.dll",
NULL,
"msi.dll",
"Apartment",
0,
"WindowsInstaller.Installer",
NULL
},
{
&CLSID_IMsiServerX2,
"Msi install server",
"ole32.dll",
NULL,
"msi.dll",
"Apartment",
PROGID_CLSID,
"WindowsInstaller.Installer",
NULL
},
{
&CLSID_IMsiServerX3,
"Msi install server",
"ole32.dll",
NULL,
"msi.dll",
"Apartment",
0,
"WindowsInstaller.Installer",
NULL
},
{ NULL } /* list terminator */
};
/***********************************************************************
* interface list
*/
/*
* we should declare: (@see ole32/regsvr.c for examples)
[-HKEY_CLASSES_ROOT\Interface\{000C101C-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C101D-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C1025-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C1033-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C1090-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C1093-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C1095-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C109A-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C109B-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C109C-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C109D-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C109E-0000-0000-C000-000000000046}]
[-HKEY_CLASSES_ROOT\Interface\{000C109F-0000-0000-C000-000000000046}]
*/
static struct regsvr_interface const interface_list[] = {
{ NULL } /* list terminator */
};
static HRESULT register_msiexec(void)
{
static const WCHAR key[] = {
'S','o','f','t','w','a','r','e',
'\\','M','i','c','r','o','s','o','f','t',
'\\','W','i','n','d','o','w','s',
'\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',
'\\','I','n','s','t','a','l','l','e','r',0 };
static const WCHAR val[] = {
'I','n','s','t','a','l','l','e','r','L','o','c','a','t','i','o','n',0 };
WCHAR path[MAX_PATH];
HKEY hkey;
LONG res;
INT len;
len = GetSystemDirectoryW(path, MAX_PATH);
if (!len || len > MAX_PATH)
return E_FAIL;
res = RegCreateKeyExW(HKEY_LOCAL_MACHINE, key, 0,
NULL, 0, KEY_READ | KEY_WRITE, NULL,
&hkey, NULL);
if (res != ERROR_SUCCESS)
return E_FAIL;
res = RegSetValueExW(hkey, val, 0, REG_SZ,
(BYTE*)path, (len + 1)*sizeof(WCHAR));
RegCloseKey(hkey);
return (res == ERROR_SUCCESS) ? S_OK : E_FAIL;
}
/***********************************************************************
* DllRegisterServer (MSI.@)
*/
HRESULT WINAPI DllRegisterServer(void)
{
HRESULT hr;
TRACE("\n");
hr = register_coclasses(coclass_list);
if (SUCCEEDED(hr))
hr = register_interfaces(interface_list);
if (SUCCEEDED(hr))
hr = register_msiexec();
return hr;
}
/***********************************************************************
* DllUnregisterServer (MSI.@)
*/
HRESULT WINAPI DllUnregisterServer(void)
{
HRESULT hr;
TRACE("\n");
hr = unregister_coclasses(coclass_list);
if (SUCCEEDED(hr))
hr = unregister_interfaces(interface_list);
return hr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -