|
|
/*************************************************************************/ /* Copyright (C) 1999 Microsoft Corporation */ /* File: MSDVDAdm.cpp */ /* Description: DImplementation of CMSDVDAdm */ /* Author: Fang Wang */ /*************************************************************************/ #include "stdafx.h"
#include "MSWebDVD.h"
#include "MSDVDAdm.h"
#include "iso3166.h"
#include <stdio.h>
#include <errors.h>
#include <wincrypt.h>
const TCHAR g_szRegistryKey[] = TEXT("Software\\Microsoft\\Multimedia\\DVD"); const TCHAR g_szPassword[] = TEXT("DVDAdmin.password"); const TCHAR g_szSalt[] = TEXT("DVDAdmin.ps"); // password salt
const TCHAR g_szUserSalt[] = TEXT("DVDAdmin.us"); // username salt
const TCHAR g_szUsername[] = TEXT("DVDAdmin.username"); const TCHAR g_szPlayerLevel[] = TEXT("DVDAdmin.playerLevel"); const TCHAR g_szPlayerCountry[] = TEXT("DVDAdmin.playerCountry"); const TCHAR g_szDisableScrnSvr[] = TEXT("DVDAdmin.disableScreenSaver"); const TCHAR g_szBookmarkOnClose[] = TEXT("DVDAdmin.bookmarkOnClose"); const TCHAR g_szBookmarkOnStop[] = TEXT("DVDAdmin.bookmarkOnStop"); const TCHAR g_szDefaultAudio[] = TEXT("DVDAdmin.defaultAudioLCID"); const TCHAR g_szDefaultSP[] = TEXT("DVDAdmin.defaultSPLCID"); const TCHAR g_szDefaultMenu[] = TEXT("DVDAdmin.defaultMenuLCID");
/*************************************************************/ /* Helper functions */ /*************************************************************/
/*************************************************************/ /* Function: LoadStringFromRes */ /* Description: load a string from resource */ /*************************************************************/ LPTSTR LoadStringFromRes(DWORD redId){
TCHAR *string = new TCHAR[MAX_PATH];
if(NULL == string){
return(NULL); }
::ZeroMemory(string, sizeof(TCHAR) * MAX_PATH); ::LoadString(_Module.GetModuleInstance(), redId, string, MAX_PATH); return string; }/* end of if statement */
/*************************************************************/ /* Function: lstrlenWInternal */ /*************************************************************/ int WINAPI lstrlenWInternal(LPCWSTR lpString){
int length = 0; while (*lpString++ != L'\0') length++; return length; }/* end of function lstrlenWInternal */
/*************************************************************/ /* Name: GetRegistryDword
/* Description:
/*************************************************************/ BOOL GetRegistryDword(const TCHAR *pKey, DWORD* dwRet, DWORD dwDefault) { HKEY hKey; LONG lRet; *dwRet = dwDefault;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, g_szRegistryKey, 0, KEY_QUERY_VALUE, &hKey); if (lRet == ERROR_SUCCESS) {
DWORD dwType, dwLen; dwLen = sizeof(DWORD);
if (ERROR_SUCCESS != RegQueryValueEx(hKey, pKey, NULL, &dwType, (LPBYTE)dwRet, &dwLen)){ *dwRet = dwDefault; RegCloseKey(hKey); return FALSE; } RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: SetRegistryDword
/* Description:
/*************************************************************/ BOOL SetRegistryDword(const TCHAR *pKey, DWORD dwRet) { HKEY hKey; LONG lRet;
lRet = RegCreateKey(HKEY_LOCAL_MACHINE, g_szRegistryKey, &hKey); if (lRet == ERROR_SUCCESS) {
lRet = RegSetValueEx(hKey, pKey, NULL, REG_DWORD, (LPBYTE)&dwRet, sizeof(dwRet)); RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: GetRegistryString
/* Description:
/*************************************************************/ BOOL GetRegistryString(const TCHAR *pKey, TCHAR* szRet, DWORD* dwLen, TCHAR* szDefault) { HKEY hKey; LONG lRet; DWORD dwTempLen = 0; lstrcpyn(szRet, szDefault, *dwLen);
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, g_szRegistryKey, 0, KEY_QUERY_VALUE, &hKey); if (lRet == ERROR_SUCCESS) {
DWORD dwType; dwTempLen = (*dwLen) * sizeof(TCHAR); if (ERROR_SUCCESS != RegQueryValueEx(hKey, pKey, NULL, &dwType, (LPBYTE)szRet, &dwTempLen)) { lstrcpyn(szRet, szDefault, *dwLen); *dwLen = 0; } *dwLen = dwTempLen/sizeof(TCHAR); RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: SetRegistryString
/* Description:
/*************************************************************/ BOOL SetRegistryString(const TCHAR *pKey, TCHAR *szString, DWORD dwLen) { HKEY hKey; LONG lRet;
lRet = RegCreateKey(HKEY_LOCAL_MACHINE, g_szRegistryKey, &hKey); if (lRet == ERROR_SUCCESS) {
lRet = RegSetValueEx(hKey, pKey, NULL, REG_SZ, (LPBYTE)szString, dwLen*sizeof(TCHAR)); RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: GetRegistryByte
/* Description:
/*************************************************************/ BOOL GetRegistryBytes(const TCHAR *pKey, BYTE* szRet, DWORD* dwLen) { HKEY hKey; LONG lRet;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, g_szRegistryKey, 0, KEY_QUERY_VALUE, &hKey); if (lRet == ERROR_SUCCESS) {
DWORD dwType; if (ERROR_SUCCESS != RegQueryValueEx(hKey, pKey, NULL, &dwType, (LPBYTE)szRet, dwLen)) { *dwLen = 0; } RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: SetRegistryBytes
/* Description:
/*************************************************************/ BOOL SetRegistryBytes(const TCHAR *pKey, BYTE *szString, DWORD dwLen) { HKEY hKey; LONG lRet;
lRet = RegCreateKey(HKEY_LOCAL_MACHINE, g_szRegistryKey, &hKey);
BOOL bRet = TRUE; if (lRet == ERROR_SUCCESS) {
if (szString == NULL) { lRet = RegDeleteValue(hKey, pKey); bRet = (lRet == ERROR_SUCCESS) || (lRet == ERROR_FILE_NOT_FOUND); } else { lRet = RegSetValueEx(hKey, pKey, NULL, REG_BINARY, (LPBYTE)szString, dwLen); bRet = (lRet == ERROR_SUCCESS); }
RegCloseKey(hKey); } return (bRet); }
// Start not so lame functions
/*************************************************************/ /* Name: GetRegistryDwordCU
/* Description:
/*************************************************************/ BOOL GetRegistryDwordCU(const TCHAR *pKey, DWORD* dwRet, DWORD dwDefault) { HKEY hKey; LONG lRet; *dwRet = dwDefault;
lRet = RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegistryKey, 0, KEY_QUERY_VALUE, &hKey); if (lRet == ERROR_SUCCESS) {
DWORD dwType, dwLen; dwLen = sizeof(DWORD);
if (ERROR_SUCCESS != RegQueryValueEx(hKey, pKey, NULL, &dwType, (LPBYTE)dwRet, &dwLen)){ *dwRet = dwDefault; RegCloseKey(hKey); return FALSE; }
RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: SetRegistryDwordCU
/* Description:
/*************************************************************/ BOOL SetRegistryDwordCU(const TCHAR *pKey, DWORD dwRet) { HKEY hKey; LONG lRet;
lRet = RegCreateKey(HKEY_CURRENT_USER, g_szRegistryKey, &hKey); if (lRet == ERROR_SUCCESS) {
lRet = RegSetValueEx(hKey, pKey, NULL, REG_DWORD, (LPBYTE)&dwRet, sizeof(dwRet)); RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: GetRegistryStringCU
/* Description:
/*************************************************************/ BOOL GetRegistryStringCU(const TCHAR *pKey, TCHAR* szRet, DWORD* dwLen, TCHAR* szDefault) { HKEY hKey; LONG lRet; DWORD dwTempLen = 0; lstrcpyn(szRet, szDefault, *dwLen);
lRet = RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegistryKey, 0, KEY_QUERY_VALUE, &hKey); if (lRet == ERROR_SUCCESS) {
DWORD dwType; dwTempLen = (*dwLen) * sizeof(TCHAR); if (ERROR_SUCCESS != RegQueryValueEx(hKey, pKey, NULL, &dwType, (LPBYTE)szRet, &dwTempLen)) { lstrcpyn(szRet, szDefault, sizeof(szRet) / sizeof(szRet[0])); *dwLen = 0; } *dwLen = dwTempLen/sizeof(TCHAR); RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: SetRegistryStringCU
/* Description:
/*************************************************************/ BOOL SetRegistryStringCU(const TCHAR *pKey, TCHAR *szString, DWORD dwLen) { HKEY hKey; LONG lRet;
lRet = RegCreateKey(HKEY_CURRENT_USER, g_szRegistryKey, &hKey); if (lRet == ERROR_SUCCESS) {
lRet = RegSetValueEx(hKey, pKey, NULL, REG_SZ, (LPBYTE)szString, dwLen*sizeof(TCHAR)); RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: GetRegistryByteCU
/* Description:
/*************************************************************/ BOOL GetRegistryBytesCU(const TCHAR *pKey, BYTE* szRet, DWORD* dwLen) { HKEY hKey; LONG lRet;
lRet = RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegistryKey, 0, KEY_QUERY_VALUE, &hKey); if (lRet == ERROR_SUCCESS) {
DWORD dwType; if (ERROR_SUCCESS != RegQueryValueEx(hKey, pKey, NULL, &dwType, (LPBYTE)szRet, dwLen)) { *dwLen = 0; } RegCloseKey(hKey); } return (lRet == ERROR_SUCCESS); }
/*************************************************************/ /* Name: SetRegistryBytesCU
/* Description:
/*************************************************************/ BOOL SetRegistryBytesCU(const TCHAR *pKey, BYTE *szString, DWORD dwLen) { HKEY hKey; LONG lRet;
lRet = RegCreateKey(HKEY_CURRENT_USER, g_szRegistryKey, &hKey);
BOOL bRet = TRUE; if (lRet == ERROR_SUCCESS) {
if (szString == NULL) { lRet = RegDeleteValue(hKey, pKey); bRet = (lRet == ERROR_SUCCESS) || (lRet == ERROR_FILE_NOT_FOUND); } else { lRet = RegSetValueEx(hKey, pKey, NULL, REG_BINARY, (LPBYTE)szString, dwLen); bRet = (lRet == ERROR_SUCCESS); }
RegCloseKey(hKey); } return (bRet); }
// end not so lame functions
/*************************************************************/ /* Function: CMSDVDAdm */ /*************************************************************/ CMSDVDAdm::CMSDVDAdm(){
DWORD temp; GetRegistryDword(g_szPlayerLevel, &temp, (DWORD)LEVEL_ADULT); m_lParentctrlLevel = temp;
GetRegistryDword(g_szPlayerCountry, &temp, (DWORD)0); m_lParentctrlCountry = temp;
GetRegistryDword(g_szDisableScrnSvr, &temp, (DWORD)VARIANT_TRUE); m_fDisableScreenSaver = (VARIANT_BOOL)temp; SaveScreenSaver(); if (m_fDisableScreenSaver != VARIANT_FALSE) DisableScreenSaver();
GetRegistryDword(g_szBookmarkOnStop, &temp, (DWORD)VARIANT_FALSE); m_fBookmarkOnStop = (VARIANT_BOOL)temp; GetRegistryDword(g_szBookmarkOnClose, &temp, (DWORD)VARIANT_TRUE); m_fBookmarkOnClose = (VARIANT_BOOL)temp; }/* end of function CMSDVDAdm */
/*************************************************************/ /* Function: ~CMSDVDAdm */ /*************************************************************/ CMSDVDAdm::~CMSDVDAdm(){ RestoreScreenSaver(); }/* end of function ~CMSDVDAdm */
/*************************************************************/ /* Name: EncryptPassword */ /* Description: Hash the password */ /* Params: */ /* lpPassword: password to hash */ /* lpAssaultedHash: hashed password, */ /* allocated by this fucntion, released by caller */ /* p_dwAssault: salt, save with hash; or salt passed in */ /* genAssault: TRUE = generate salt; FALSE = salt passed in */ /*************************************************************/ HRESULT CMSDVDAdm::EncryptPassword(LPTSTR lpPassword, BYTE **lpAssaultedHash, DWORD *p_dwCryptLen, DWORD *p_dwAssault, BOOL genAssault){ if(!lpPassword || !lpAssaultedHash || !p_dwAssault || !p_dwCryptLen){ return E_POINTER; } if( lstrlen(lpPassword) > MAX_PASSWD){ return E_INVALIDARG; } HCRYPTPROV hProv = NULL; // Handle to Crypto Context
HCRYPTHASH hHash = NULL; // Handle to Hash Function
DWORD dwAssault = 0; // As(Sa)u(lt) for hash
DWORD dwAssaultedHash = 0; // Length of Assaulted hash
// Init Crypto Context
if(!CryptAcquireContext(&hProv, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)){ return E_UNEXPECTED; } // Store the Salt in dwAssault, either generate it or copy the user passed value
if(genAssault){ if(!CryptGenRandom(hProv, sizeof(DWORD), reinterpret_cast<BYTE *>(&dwAssault))){ if(hProv) CryptReleaseContext(hProv, 0); return E_UNEXPECTED; } *p_dwAssault = dwAssault; } else{ dwAssault = *p_dwAssault; } // Create the handle to the Hash function
if(!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)){ if(hProv) CryptReleaseContext(hProv, 0); if(hHash) CryptDestroyHash(hHash); return E_UNEXPECTED; } // Hash the password
if(!CryptHashData(hHash, reinterpret_cast<BYTE *>(lpPassword), lstrlen(lpPassword)*sizeof(lpPassword[0]), 0)){ if(hProv) CryptReleaseContext(hProv, 0); if(hHash) CryptDestroyHash(hHash); return E_UNEXPECTED; } // Add the salt
if(!CryptHashData(hHash, reinterpret_cast<BYTE *>(&dwAssault), sizeof(DWORD), 0)){ if(hProv) CryptReleaseContext(hProv, 0); if(hHash) CryptDestroyHash(hHash); return E_UNEXPECTED; } // Get the size of the hashed data
if(!CryptGetHashParam(hHash, HP_HASHVAL, 0, &dwAssaultedHash, 0)){ if(hProv) CryptReleaseContext(hProv, 0); if(hHash) CryptDestroyHash(hHash); return E_UNEXPECTED; } // Allocate a string large enough to hold the hash data and a null
*lpAssaultedHash = new BYTE[dwAssaultedHash]; if(!lpAssaultedHash){ if(hProv) CryptReleaseContext(hProv, 0); if(hHash) CryptDestroyHash(hHash); return E_UNEXPECTED; } // Zero the string
ZeroMemory(*lpAssaultedHash, dwAssaultedHash); // Copy length of Encrypted bytes to return value
*p_dwCryptLen = dwAssaultedHash; // Get the hash data and store it in a string
if(!CryptGetHashParam(hHash, HP_HASHVAL, *lpAssaultedHash, &dwAssaultedHash, 0)){ if(hProv) CryptReleaseContext(hProv, 0); if(hHash) CryptDestroyHash(hHash); if(lpAssaultedHash){ delete[] *lpAssaultedHash; *lpAssaultedHash = NULL; } return E_UNEXPECTED; } // Clean up
if(hProv) CryptReleaseContext(hProv, 0); if(hHash) CryptDestroyHash(hHash);
return S_OK;
}/* end of function EncryptPassword */
/*************************************************************/ /* Function: ConfirmPassword */ /* Description: */ /* There is no need for a user to confirm passwords unless */ /* they are hacking the password. */ /* ConfirmPassword always fails (and waits five seconds) */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::ConfirmPassword(BSTR strUserName, BSTR strPassword, VARIANT_BOOL *pVal){ Sleep(1000); return E_FAIL; } /*************************************************************/ /* Function: _ConfirmPassword */ /* Description: comfired a password with the one saved */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::_ConfirmPassword(BSTR /*strUserName*/, BSTR strPassword, VARIANT_BOOL *fRight){
HRESULT hr = S_OK;
try {
USES_CONVERSION;
if(!strPassword || !fRight){ throw E_POINTER; } UINT bStrLen = lstrlen(strPassword); if(bStrLen >= MAX_PASSWD){ throw E_INVALIDARG; }
LPTSTR szPassword = OLE2T(strPassword); BYTE szSavedPasswd[MAX_PASSWD]; DWORD dwLen = MAX_PASSWD; BOOL bFound = GetRegistryBytes(g_szPassword, szSavedPasswd, &dwLen);
// if no password has been set yet
if (!bFound || dwLen == 0) { // so in this case accept only an empty string
if(lstrlen(szPassword) <= 0){ *fRight = VARIANT_TRUE; } else { *fRight = VARIANT_FALSE; } throw (hr); }
DWORD dwAssault = 0; bFound = GetRegistryDword(g_szSalt, &dwAssault, 0); if(!bFound ){ // Old style password since there is no salt
// ignore current password until it is reset
*fRight = VARIANT_TRUE; throw(hr); }
// if password is 0 len and password is set don't even try to encrypt just return false
if(lstrlen(szPassword) <= 0){ *fRight = VARIANT_FALSE; throw(hr); }
// Encrypt the password with the salt from the registry
BYTE *pszEncrypted = NULL; DWORD dwCryptLen = 0; hr = EncryptPassword(szPassword, &pszEncrypted, &dwCryptLen, &dwAssault, FALSE); if(FAILED(hr)){ throw (hr); }
// Compare the Encrypted input password with the saved password
if(memcmp(pszEncrypted, szSavedPasswd, (dwAssault <= dwLen?dwAssault:dwLen) ) == 0) *fRight = VARIANT_TRUE; else *fRight = VARIANT_FALSE; delete[] pszEncrypted; } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
if(FAILED(hr)){ Sleep(1000); }
return (HandleError(hr)); }/* end of function ConfirmPassword */
/*************************************************************/ /* Function: ChangePassword */ /* Description: password change requested */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::ChangePassword(BSTR strUserName, BSTR strOldPassword, BSTR strNewPassword){
HRESULT hr = S_OK;
try {
USES_CONVERSION; if(!strUserName || !strOldPassword || !strNewPassword){ return E_POINTER; } // check the size of the string so we do not overwrite
// or write a very big chunk into registry
if(lstrlen(strNewPassword) >= MAX_PASSWD){ throw(E_FAIL); }
LPTSTR szNewPassword = OLE2T(strNewPassword);
// Confirm old password first
VARIANT_BOOL temp; _ConfirmPassword(strUserName, strOldPassword, &temp); if (temp == VARIANT_FALSE){ throw E_ACCESSDENIED; }
DWORD dwAssault = 0; DWORD dwCryptLen = 0; BYTE *pszEncrypted = NULL; hr = EncryptPassword(szNewPassword, &pszEncrypted, &dwCryptLen, &dwAssault, TRUE); if(FAILED(hr)){ throw E_FAIL; }
BOOL bSuccess = SetRegistryBytes(g_szPassword, pszEncrypted, dwCryptLen); if (!bSuccess){ hr = E_FAIL; }
delete[] pszEncrypted;
// If storing the password hash failed, don't store the salt
if(SUCCEEDED(hr)){ bSuccess = SetRegistryDword(g_szSalt, dwAssault); if (!bSuccess){ hr = E_FAIL; } } } catch(HRESULT hrTmp){ hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }/* end of function ChangePassword */
/*************************************************************/ /* Function: SaveParentalLevel */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::SaveParentalLevel(long lParentalLevel, BSTR strUserName, BSTR strPassword){ HRESULT hr = S_OK;
try {
if (lParentalLevel != LEVEL_DISABLED && (lParentalLevel < LEVEL_G || lParentalLevel > LEVEL_ADULT)) {
throw (E_INVALIDARG); } /* end of if statement */
if (m_lParentctrlLevel != lParentalLevel) {
// Confirm password first
VARIANT_BOOL temp; _ConfirmPassword(strUserName, strPassword, &temp); if (temp == VARIANT_FALSE) throw (E_ACCESSDENIED);
} BOOL bSuccess = SetRegistryDword(g_szPlayerLevel, (DWORD) lParentalLevel); if (!bSuccess){ throw E_FAIL; }
m_lParentctrlLevel = lParentalLevel;
} catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }/* end of function SaveParentalLevel */
/*************************************************************/ /* Name: SaveParentalCountry */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::SaveParentalCountry(long lCountry, BSTR strUserName,BSTR strPassword){
HRESULT hr = S_OK;
try {
if(lCountry < 0 && lCountry > 0xffff){
throw(E_INVALIDARG); }/* end of if statement */
BYTE bCountryCode[2];
bCountryCode[0] = BYTE(lCountry>>8); bCountryCode[1] = BYTE(lCountry);
// convert the input country code to upper case by applying ToUpper to each letter
WORD wCountry = ISO3166::PackCode( (char *)bCountryCode ); BOOL bFound = FALSE;
for( unsigned i=0; i<ISO3166::GetNumCountries(); i++ ) { if( ISO3166::PackCode(ISO3166::GetCountry(i).Code) == wCountry ) { bFound = TRUE; } }
// Not a valid country code
if (!bFound) {
throw(E_INVALIDARG); }/* end of if statement */
if (m_lParentctrlCountry != lCountry) {
// Confirm password first
VARIANT_BOOL temp; _ConfirmPassword(strUserName, strPassword, &temp); if (temp == VARIANT_FALSE) throw(E_ACCESSDENIED); } BOOL bSuccess = SetRegistryDword(g_szPlayerCountry, (DWORD) lCountry); if (!bSuccess){ throw E_FAIL; } m_lParentctrlCountry = lCountry; } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return (HandleError(hr)); }/* end of function SaveParentalCountry */
/*************************************************************/ /* Function: put_DisableScreenSaver */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::put_DisableScreenSaver(VARIANT_BOOL fDisable){
HRESULT hr = S_OK;
try {
if (fDisable == VARIANT_FALSE) RestoreScreenSaver(); else DisableScreenSaver();
SetRegistryDword(g_szDisableScrnSvr, (DWORD) fDisable); m_fDisableScreenSaver = fDisable; } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }/* end of function put_DisableScreenSaver */
/*************************************************************/ /* Function: get_DisableScreenSaver */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::get_DisableScreenSaver(VARIANT_BOOL *fDisable){
HRESULT hr = S_OK;
try { if(NULL == fDisable){
hr = E_POINTER; throw(hr); }/* end of if statement */ *fDisable = m_fDisableScreenSaver; } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }/* end of function get_DisableScreenSaver */
/*************************************************************/ /* Function: SaveScreenSaver */ /*************************************************************/ HRESULT CMSDVDAdm::SaveScreenSaver(){
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_bScrnSvrOld, 0); SystemParametersInfo(SPI_GETLOWPOWERACTIVE, 0, &m_bPowerlowOld, 0); SystemParametersInfo(SPI_GETPOWEROFFACTIVE, 0, &m_bPowerOffOld, 0);
return S_OK; } /*************************************************************/ /* Function: DisableScreenSaver */ /*************************************************************/ HRESULT CMSDVDAdm::DisableScreenSaver(){
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); SystemParametersInfo(SPI_SETLOWPOWERACTIVE, FALSE, NULL, 0); SystemParametersInfo(SPI_SETPOWEROFFACTIVE, FALSE, NULL, 0);
return S_OK; }/* end of function DisableScreenSaver */
/*************************************************************/ /* Function: RestoreScreenSaver */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::RestoreScreenSaver(){
HRESULT hr = S_OK;
try {
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, m_bScrnSvrOld, NULL, 0); SystemParametersInfo(SPI_SETLOWPOWERACTIVE, m_bPowerlowOld, NULL, 0); SystemParametersInfo(SPI_SETPOWEROFFACTIVE, m_bPowerOffOld, NULL, 0);
} catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }/* end of function RestoreScreenSaver */
/*************************************************************/ /* Function: GetParentalLevel */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::GetParentalLevel(long *lLevel){
HRESULT hr = S_OK;
try { if(NULL == lLevel){
hr = E_POINTER; throw(hr); }/* end of if statement */
*lLevel = m_lParentctrlLevel;
} catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }/* end of function GetParentalLevel */
/*************************************************************/ /* Function: GetParentalCountry */ /*************************************************************/ STDMETHODIMP CMSDVDAdm::GetParentalCountry(long *lCountry){
HRESULT hr = S_OK;
try { if(NULL == lCountry){
hr = E_POINTER; throw(hr); }/* end of if statement */
*lCountry = m_lParentctrlCountry; } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }/* end of function GetParentalCountry */
/*************************************************************/ /* Name: get_DefaultAudioLCID
/* Description: -1 means title default
/*************************************************************/ STDMETHODIMP CMSDVDAdm::get_DefaultAudioLCID(long *pVal){
HRESULT hr = S_OK;
try {
if(NULL == pVal){
hr = E_POINTER; throw(hr); }/* end of if statement */ BOOL bSuccess = GetRegistryDwordCU(g_szDefaultAudio, (DWORD*) pVal, (DWORD)-1); } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); } /* end of function get_DefaultAudioLCID */
/*************************************************************/ /* Name: put_DefaultAudioLCID
/* Description: -1 means title default
/*************************************************************/ STDMETHODIMP CMSDVDAdm::put_DefaultAudioLCID(long newVal) { HRESULT hr = S_OK;
try {
if (!::IsValidLocale(newVal, LCID_SUPPORTED) && newVal != -1) {
throw (E_INVALIDARG); } /* end of if statement */ SetRegistryDwordCU(g_szDefaultAudio, (DWORD) newVal); } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); } /* end of put_DefaultAudioLCID */
/*************************************************************/ /* Name: get_DefaultSubpictureLCID
/* Description: -1 means title default
/*************************************************************/ STDMETHODIMP CMSDVDAdm::get_DefaultSubpictureLCID(long *pVal) { HRESULT hr = S_OK;
try { if(NULL == pVal){
hr = E_POINTER; throw(hr); }/* end of if statement */
GetRegistryDwordCU(g_szDefaultSP, (DWORD*) pVal, (DWORD)-1);
} catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); } /* end of get_DefaultSubpictureLCID */
/*************************************************************/ /* Name: put_DefaultSubpictureLCID
/* Description: -1 means title default
/*************************************************************/ STDMETHODIMP CMSDVDAdm::put_DefaultSubpictureLCID(long newVal) { HRESULT hr = S_OK;
try {
if (!::IsValidLocale(newVal, LCID_SUPPORTED) && newVal != -1) {
throw (E_INVALIDARG); } /* end of if statement */ SetRegistryDwordCU(g_szDefaultSP, (DWORD) newVal); } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); } /* end of put_DefaultSubpictureLCID */
/*************************************************************/ /* Name: get_DefaultMenuLCID
/* Description: -1 means title default
/*************************************************************/ STDMETHODIMP CMSDVDAdm::get_DefaultMenuLCID(long *pVal) { HRESULT hr = S_OK;
try {
if(NULL == pVal){
hr = E_POINTER; throw(hr); }/* end of if statement */
GetRegistryDwordCU(g_szDefaultMenu, (DWORD*) pVal, (DWORD)-1); } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); } /* end of get_DefaultMenuLCID */
/*************************************************************/ /* Name: put_DefaultMenuLCID
/* Description: -1 means title default
/*************************************************************/ STDMETHODIMP CMSDVDAdm::put_DefaultMenuLCID(long newVal) { HRESULT hr = S_OK;
try {
if (!::IsValidLocale(newVal, LCID_SUPPORTED) && newVal != -1) {
throw (E_INVALIDARG); } /* end of if statement */ SetRegistryDwordCU(g_szDefaultMenu, (DWORD) newVal); } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); } /* end of put_DefaultMenuLCID */
/*************************************************************/ /* Name: put_BookmarkOnStop
/* Description:
/*************************************************************/ STDMETHODIMP CMSDVDAdm::put_BookmarkOnStop(VARIANT_BOOL fEnable){
HRESULT hr = S_OK;
try { m_fBookmarkOnStop = fEnable; SetRegistryDword(g_szBookmarkOnStop, (DWORD) fEnable); } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }
/*************************************************************/ /* Name: get_BookmarkOnStop
/* Description:
/*************************************************************/ STDMETHODIMP CMSDVDAdm::get_BookmarkOnStop(VARIANT_BOOL *fEnable){ HRESULT hr = S_OK;
try {
if(NULL == fEnable){
hr = E_POINTER; throw(hr); }/* end of if statement */
*fEnable = m_fBookmarkOnStop; } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }
/*************************************************************/ /* Name: put_BookmarkOnClose
/* Description:
/*************************************************************/ STDMETHODIMP CMSDVDAdm::put_BookmarkOnClose(VARIANT_BOOL fEnable){
HRESULT hr = S_OK; try {
m_fBookmarkOnClose = fEnable; SetRegistryDword(g_szBookmarkOnClose, (DWORD) fEnable); } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }
/*************************************************************/ /* Name: get_BookmarkOnClose
/* Description:
/*************************************************************/ STDMETHODIMP CMSDVDAdm::get_BookmarkOnClose(VARIANT_BOOL *fEnable){
HRESULT hr = S_OK;
try { if(NULL == fEnable){
hr = E_POINTER; throw(hr); }/* end of if statement */
*fEnable = m_fBookmarkOnClose; } catch(HRESULT hrTmp){
hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; }
return HandleError(hr); }
/*************************************************************************/ /* Function: InterfaceSupportsErrorInfo */ /*************************************************************************/ STDMETHODIMP CMSDVDAdm::InterfaceSupportsErrorInfo(REFIID riid){ static const IID* arr[] = { &IID_IMSDVDAdm, };
for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++){ if (InlineIsEqualGUID(*arr[i], riid)) return S_OK; }/* end of for loop */
return S_FALSE; }/* end of function InterfaceSupportsErrorInfo */
/*************************************************************************/ /* Function: HandleError */ /* Description: Gets Error Descriptio, so we can suppor IError Info. */ /*************************************************************************/ HRESULT CMSDVDAdm::HandleError(HRESULT hr){
try {
if(FAILED(hr)){ // Ensure that the string is Null Terminated
TCHAR strError[MAX_ERROR_TEXT_LEN+1]; ZeroMemory(strError, MAX_ERROR_TEXT_LEN+1);
if(AMGetErrorText(hr , strError , MAX_ERROR_TEXT_LEN)){ USES_CONVERSION; Error(T2W(strError)); } else { ATLTRACE(TEXT("Unhandled Error Code \n")); // please add it
ATLASSERT(FALSE); }/* end of if statement */ }/* end of if statement */ }/* end of try statement */ catch(HRESULT hrTmp){
hr = hrTmp; }/* end of catch statement */ catch(...){ // keep the hr same
}/* end of catch statement */ return (hr); }/* end of function HandleError */
/*************************************************************************/ /* End of file: MSDVDAdm.cpp */ /*************************************************************************/
|