Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

304 lines
7.4 KiB

//+----------------------------------------------------------------------------
// File: dllreg.cxx
//
// Synopsis:
//
//-----------------------------------------------------------------------------
// Includes -------------------------------------------------------------------
#include <core.hxx>
// Prototypes -----------------------------------------------------------------
static const TCHAR * DeleteSubkeys(HKEY hkeyParent, const TCHAR * pszKey);
static const TCHAR * RegisterKey(HKEY hkeyParent, const TCHAR * pszKey);
//+----------------------------------------------------------------------------
// Function: DllRegisterServer
//
// Synopsis:
//
//-----------------------------------------------------------------------------
STDAPI
DllRegisterServer()
{
const TCHAR ** ppszKey;
const TCHAR * pszKey;
HKEY hkey;
LONG lError;
HRESULT hr;
hr = EnsureThreadState();
if (hr)
goto Cleanup;
for (ppszKey=g_aszKeys; *ppszKey; ppszKey++)
{
pszKey = *ppszKey;
lError = ::RegOpenKeyEx(HKEY_CLASSES_ROOT,
pszKey, 0, KEY_ALL_ACCESS,
&hkey);
if (lError != ERROR_SUCCESS)
{
hr = E_FAIL;
break;
}
pszKey += _tcslen(pszKey) + 1;
Assert(*pszKey);
if (!RegisterKey(hkey, pszKey))
{
hr = E_FAIL;
break;
}
#ifdef _DEBUG
Verify(::RegCloseKey(hkey) == ERROR_SUCCESS);
#else
::RegCloseKey(hkey);
#endif
}
Cleanup:
return hr;
}
//+----------------------------------------------------------------------------
// Function: DllUnregisterServer
//
// Synopsis:
//
//-----------------------------------------------------------------------------
STDAPI
DllUnregisterServer()
{
const TCHAR ** ppszKey;
const TCHAR * pszKey;
HKEY hkey;
LONG lError;
HRESULT hr;
hr = EnsureThreadState();
if (hr)
goto Cleanup;
for (ppszKey=g_aszKeys; *ppszKey; ppszKey++)
{
pszKey = *ppszKey;
lError = ::RegOpenKeyEx(HKEY_CLASSES_ROOT,
pszKey, 0, KEY_ALL_ACCESS,
&hkey);
if (lError != ERROR_SUCCESS)
{
hr = E_FAIL;
break;
}
pszKey += _tcslen(pszKey) + 1;
Assert(*pszKey);
if (!DeleteSubkeys(hkey, pszKey) ||
::RegDeleteKey(hkey, pszKey) != ERROR_SUCCESS)
{
hr = E_FAIL;
}
#ifdef _DEBUG
Verify(::RegCloseKey(hkey) == ERROR_SUCCESS);
#else
::RegCloseKey(hkey);
#endif
if (hr)
goto Cleanup;
}
Cleanup:
return hr;
}
//+----------------------------------------------------------------------------
// Function: DeleteSubkeys
//
// Synopsis:
//
//-----------------------------------------------------------------------------
const TCHAR *
DeleteSubkeys(
HKEY hkeyParent,
const TCHAR * pszKey)
{
const TCHAR * psz;
HKEY hkey = NULL;
LONG lError;
lError = ::RegOpenKeyEx(hkeyParent, pszKey, 0, KEY_ALL_ACCESS, &hkey);
if (lError != ERROR_SUCCESS)
goto Error;
pszKey += _tcslen(pszKey) + 1;
while (*pszKey)
{
switch (*pszKey)
{
case chDEFAULT_SECTION:
pszKey++;
pszKey += _tcslen(pszKey) + 1;
break;
case chVALUES_SECTION:
pszKey++;
while (*pszKey)
{
pszKey += _tcslen(pszKey) + 1;
pszKey += _tcslen(pszKey) + 1;
}
pszKey++;
break;
case chSUBKEY_SECTION:
pszKey++;
psz = pszKey;
pszKey = DeleteSubkeys(hkey, pszKey);
if (!pszKey)
goto Error;
lError = ::RegDeleteKey(hkey, psz);
if (lError != ERROR_SUCCESS)
goto Error;
break;
#ifdef _DEBUG
default:
AssertF("Invalid section in registry key data");
#endif
}
}
pszKey++;
Cleanup:
if (hkey)
{
#ifdef _DEBUG
Verify(::RegCloseKey(hkey) == ERROR_SUCCESS);
#else
::RegCloseKey(hkey);
#endif
}
return pszKey;
Error:
pszKey = NULL;
goto Cleanup;
}
//+----------------------------------------------------------------------------
// Function: RegisterKey
//
// Synopsis:
//
//-----------------------------------------------------------------------------
const TCHAR *
RegisterKey(
HKEY hkeyParent,
const TCHAR * pszKey)
{
const TCHAR * psz;
HKEY hkey = NULL;
DWORD dwDisposition;
LONG lError;
lError = ::RegCreateKeyEx(hkeyParent, pszKey, 0, _T(""),
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL,
&hkey, &dwDisposition);
if (lError != ERROR_SUCCESS)
goto Error;
pszKey += _tcslen(pszKey) + 1;
while (*pszKey)
{
switch (*pszKey)
{
case chDEFAULT_SECTION:
pszKey++;
if (!::lstrcmpi(pszKey, szMODULE_PATH))
{
TCHAR szModule[MAX_PATH+1];
Verify(::GetModuleFileName((HMODULE)g_hinst, szModule, ARRAY_SIZE(szModule)));
lError = ::RegSetValueEx(hkey, NULL, 0,
REG_SZ,
(const BYTE *)szModule,
sizeof(TCHAR) * (_tcslen(szModule) + 1));
}
else
{
lError = ::RegSetValueEx(hkey, NULL, 0,
REG_SZ,
(const BYTE *)pszKey,
sizeof(TCHAR) * (_tcslen(pszKey) + 1));
}
if (lError != ERROR_SUCCESS)
goto Error;
pszKey += _tcslen(pszKey) + 1;
break;
case chVALUES_SECTION:
pszKey++;
while (*pszKey)
{
psz = pszKey;
pszKey += _tcslen(pszKey) + 1;
lError = ::RegSetValueEx(hkey, psz, 0,
REG_SZ,
(const BYTE *)pszKey,
sizeof(TCHAR) * (_tcslen(pszKey) + 1));
if (lError != ERROR_SUCCESS)
goto Error;
pszKey += _tcslen(pszKey) + 1;
}
pszKey++;
break;
case chSUBKEY_SECTION:
pszKey++;
pszKey = RegisterKey(hkey, pszKey);
if (!pszKey)
goto Error;
break;
#ifdef _DEBUG
default:
AssertF("Invalid section in registry key data");
#endif
}
}
pszKey++;
Cleanup:
if (hkey)
{
#ifdef _DEBUG
Verify(::RegCloseKey(hkey) == ERROR_SUCCESS);
#else
::RegCloseKey(hkey);
#endif
}
return pszKey;
Error:
pszKey = NULL;
goto Cleanup;
}