1227 lines
36 KiB
C++
1227 lines
36 KiB
C++
/*************************************************************************/
|
|
/* 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 */
|
|
/*************************************************************************/
|