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.
 
 
 
 
 
 

589 lines
16 KiB

/*==========================================================================
*
* Copyright (C) 2000 Microsoft Corporation. All Rights Reserved.
*
* File: DNLReg.cpp
* Content: DirectPlay Lobby Registry Functions
*@@BEGIN_MSINTERNAL
* History:
* Date By Reason
* ==== == ======
* 02/21/00 mjn Created
* 04/25/00 rmt Bug #s 33138, 33145, 33150
* 05/03/00 rmt UnRegister was not implemented! Implementing!
* 08/05/00 RichGr IA64: Use %p format specifier in DPFs for 32/64-bit pointers and handles.
* 06/16/2001 rodtoll WINBUG #416983 - RC1: World has full control to HKLM\Software\Microsoft\DirectPlay\Applications on Personal
* Implementing mirror of keys into HKCU. Algorithm is now:
* - Read of entries tries HKCU first, then HKLM
* - Enum of entires is combination of HKCU and HKLM entries with duplicates removed. HKCU takes priority.
* - Write of entries is HKLM and HKCU. (HKLM may fail, but is ignored).
*@@END_MSINTERNAL
*
***************************************************************************/
#include "dnlobbyi.h"
//**********************************************************************
// Constant definitions
//**********************************************************************
//**********************************************************************
// Macro definitions
//**********************************************************************
//**********************************************************************
// Structure definitions
//**********************************************************************
//**********************************************************************
// Variable definitions
//**********************************************************************
//**********************************************************************
// Function prototypes
//**********************************************************************
//**********************************************************************
// Function definitions
//**********************************************************************
#undef DPF_MODNAME
#define DPF_MODNAME "DPLDeleteProgramDesc"
HRESULT DPLDeleteProgramDesc( const GUID * const pGuidApplication )
{
HRESULT hResultCode = DPN_OK;
CRegistry RegistryEntry;
CRegistry SubEntry;
DWORD dwLastError;
HKEY hkCurrentHive;
BOOL fFound = FALSE;
BOOL fRemoved = FALSE;
DPFX(DPFPREP, 3, "Removing program desc" );
for( DWORD dwIndex = 0; dwIndex < 2; dwIndex++ )
{
if( dwIndex == 0 )
{
hkCurrentHive = HKEY_CURRENT_USER;
}
else
{
hkCurrentHive = HKEY_LOCAL_MACHINE;
}
if( !RegistryEntry.Open( hkCurrentHive,DPL_REG_LOCAL_APPL_SUBKEY,FALSE,FALSE,TRUE,DPN_KEY_ALL_ACCESS ) )
{
DPFX(DPFPREP, 1, "Failed to open key for remove in pass %i", dwIndex );
continue;
}
// This should be down below the next if block, but 8.0 shipped with a bug
// which resulted in this function returning DPNERR_NOTALLOWED in cases where
// the next if block failed. Need to remain compatible
fFound = TRUE;
if( !SubEntry.Open( RegistryEntry, pGuidApplication, FALSE, FALSE,TRUE,DPN_KEY_ALL_ACCESS ) )
{
DPFX(DPFPREP, 1, "Failed to open subkey for remove in pass %i", dwIndex );
continue;
}
SubEntry.Close();
if( !RegistryEntry.DeleteSubKey( pGuidApplication ) )
{
DPFX(DPFPREP, 1, "Failed to delete subkey for remove in pass %i", dwIndex );
continue;
}
fRemoved = TRUE;
RegistryEntry.Close();
}
if( !fFound )
{
DPFX(DPFPREP, 0, "Could not find entry" );
hResultCode = DPNERR_DOESNOTEXIST;
}
else if( !fRemoved )
{
dwLastError = GetLastError();
DPFX(DPFPREP, 0, "Error deleting registry sub-key lastError [0x%lx]", dwLastError );
hResultCode = DPNERR_NOTALLOWED;
}
DPFX(DPFPREP, 3, "Removing program desc [0x%x]", hResultCode );
return hResultCode;
}
//**********************************************************************
// ------------------------------
// DPLWriteProgramDesc
//
// Entry: Nothing
//
// Exit: DPN_OK
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "DPLWriteProgramDesc"
HRESULT DPLWriteProgramDesc(DPL_PROGRAM_DESC *const pdplProgramDesc)
{
HRESULT hResultCode;
CRegistry RegistryEntry;
CRegistry SubEntry;
WCHAR *pwsz;
WCHAR pwszDefault[] = L"\0";
HKEY hkCurrentHive = NULL;
BOOL fWritten = FALSE;
DPFX(DPFPREP, 3,"Parameters: pdplProgramDesc [0x%p]",pdplProgramDesc);
for( DWORD dwIndex = 0; dwIndex < 2; dwIndex++ )
{
if( dwIndex == 0 )
{
hkCurrentHive = HKEY_LOCAL_MACHINE;
}
else
{
hkCurrentHive = HKEY_CURRENT_USER;
}
if (!RegistryEntry.Open(hkCurrentHive,DPL_REG_LOCAL_APPL_SUBKEY,FALSE,TRUE,TRUE,DPN_KEY_ALL_ACCESS))
{
DPFX( DPFPREP, 1, "Entry not found in user hive on pass %i", dwIndex );
continue;
}
// Get Application name and GUID from each sub key
if (!SubEntry.Open(RegistryEntry,&pdplProgramDesc->guidApplication,FALSE,TRUE,TRUE,DPN_KEY_ALL_ACCESS))
{
DPFX( DPFPREP, 1, "Entry not found in user hive on pass %i", dwIndex );
continue;
}
if (!SubEntry.WriteString(DPL_REG_KEYNAME_APPLICATIONNAME,pdplProgramDesc->pwszApplicationName))
{
DPFX( DPFPREP, 1, "Could not write ApplicationName on pass %i", dwIndex);
goto LOOP_END;
}
if (pdplProgramDesc->pwszCommandLine != NULL)
{
pwsz = pdplProgramDesc->pwszCommandLine;
}
else
{
pwsz = pwszDefault;
}
if (!SubEntry.WriteString(DPL_REG_KEYNAME_COMMANDLINE,pwsz))
{
DPFX( DPFPREP, 1, "Could not write CommandLine on pass %i", dwIndex);
goto LOOP_END;
}
if (pdplProgramDesc->pwszCurrentDirectory != NULL)
{
pwsz = pdplProgramDesc->pwszCurrentDirectory;
}
else
{
pwsz = pwszDefault;
}
if (!SubEntry.WriteString(DPL_REG_KEYNAME_CURRENTDIRECTORY,pwsz))
{
DPFX( DPFPREP, 1, "Could not write CurrentDirectory on pass %i", dwIndex);
goto LOOP_END;
}
if (pdplProgramDesc->pwszDescription != NULL)
{
pwsz = pdplProgramDesc->pwszDescription;
}
else
{
pwsz = pwszDefault;
}
if (!SubEntry.WriteString(DPL_REG_KEYNAME_DESCRIPTION,pwsz))
{
DPFX( DPFPREP, 1, "Could not write Description on pass %i", dwIndex );
goto LOOP_END;
}
if (pdplProgramDesc->pwszExecutableFilename != NULL)
{
pwsz = pdplProgramDesc->pwszExecutableFilename;
}
else
{
pwsz = pwszDefault;
}
if (!SubEntry.WriteString(DPL_REG_KEYNAME_EXECUTABLEFILENAME,pwsz))
{
DPFX( DPFPREP, 1, "Could not write ExecutableFilename on pass %i", dwIndex );
goto LOOP_END;
}
if (pdplProgramDesc->pwszExecutablePath != NULL)
{
pwsz = pdplProgramDesc->pwszExecutablePath;
}
else
{
pwsz = pwszDefault;
}
if (!SubEntry.WriteString(DPL_REG_KEYNAME_EXECUTABLEPATH,pwsz))
{
DPFX( DPFPREP, 1, "Could not write ExecutablePath on pass %i", dwIndex);
goto LOOP_END;
}
if (pdplProgramDesc->pwszLauncherFilename != NULL)
{
pwsz = pdplProgramDesc->pwszLauncherFilename;
}
else
{
pwsz = pwszDefault;
}
if (!SubEntry.WriteString(DPL_REG_KEYNAME_LAUNCHERFILENAME,pwsz))
{
DPFX( DPFPREP, 1, "Could not write LauncherFilename on pass %i", dwIndex);
goto LOOP_END;
}
if (pdplProgramDesc->pwszLauncherPath != NULL)
{
pwsz = pdplProgramDesc->pwszLauncherPath;
}
else
{
pwsz = pwszDefault;
}
if (!SubEntry.WriteString(DPL_REG_KEYNAME_LAUNCHERPATH,pwsz))
{
DPFX( DPFPREP, 1, "Could not write LauncherPath on pass %i", dwIndex);
goto LOOP_END;
}
if (!SubEntry.WriteGUID(DPL_REG_KEYNAME_GUID,pdplProgramDesc->guidApplication))
{
DPFX( DPFPREP, 1, "Could not write GUID on pass %i", dwIndex);
goto LOOP_END;
}
fWritten = TRUE;
LOOP_END:
SubEntry.Close();
RegistryEntry.Close();
}
if( !fWritten )
{
DPFERR("Entry could not be written");
hResultCode = DPNERR_GENERIC;
}
else
{
hResultCode = DPN_OK;
}
DPFX(DPFPREP, 3,"Returning: [0x%lx]",hResultCode);
return(hResultCode);
}
//**********************************************************************
// ------------------------------
// DPLGetProgramDesc
//
// Entry: Nothing
//
// Exit: DPN_OK
// DPNERR_BUFFERTOOSMALL
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "DPLGetProgramDesc"
HRESULT DPLGetProgramDesc(GUID *const pGuidApplication,
BYTE *const pBuffer,
DWORD *const pdwBufferSize)
{
HRESULT hResultCode;
CRegistry RegistryEntry;
CRegistry SubEntry;
CPackedBuffer PackedBuffer;
DWORD dwEntrySize;
DWORD dwRegValueLengths;
DPL_PROGRAM_DESC *pdnProgramDesc;
DWORD dwValueSize;
HKEY hkCurrentHive = NULL;
BOOL fFound = FALSE;
DPFX(DPFPREP, 3,"Parameters: pGuidApplication [0x%p], pBuffer [0x%p], pdwBufferSize [0x%p]",
pGuidApplication,pBuffer,pdwBufferSize);
for( DWORD dwIndex = 0; dwIndex < 2; dwIndex++ )
{
if( dwIndex == 0 )
{
hkCurrentHive = HKEY_CURRENT_USER;
}
else
{
hkCurrentHive = HKEY_LOCAL_MACHINE;
}
if (!RegistryEntry.Open(hkCurrentHive,DPL_REG_LOCAL_APPL_SUBKEY,TRUE,FALSE,TRUE,DPL_REGISTRY_READ_ACCESS))
{
DPFX( DPFPREP, 1, "Entry not found in user hive on pass %i", dwIndex );
continue;
}
// Get Application name and GUID from each sub key
if (!SubEntry.Open(RegistryEntry,pGuidApplication,TRUE,FALSE,TRUE,DPL_REGISTRY_READ_ACCESS))
{
DPFX( DPFPREP, 1, "Entry not found in user hive on pass %i", dwIndex );
continue;
}
fFound = TRUE;
break;
}
if( !fFound )
{
DPFERR("Entry not found");
hResultCode = DPNERR_DOESNOTEXIST;
goto EXIT_DPLGetProgramDesc;
}
// Calculate total entry size (structure + data)
dwEntrySize = sizeof(DPL_PROGRAM_DESC);
dwRegValueLengths = 0;
if (SubEntry.GetValueLength(DPL_REG_KEYNAME_APPLICATIONNAME,&dwValueSize))
{
dwRegValueLengths += dwValueSize;
}
if (SubEntry.GetValueLength(DPL_REG_KEYNAME_COMMANDLINE,&dwValueSize))
{
dwRegValueLengths += dwValueSize;
}
if (SubEntry.GetValueLength(DPL_REG_KEYNAME_CURRENTDIRECTORY,&dwValueSize))
{
dwRegValueLengths += dwValueSize;
}
if (SubEntry.GetValueLength(DPL_REG_KEYNAME_DESCRIPTION,&dwValueSize))
{
dwRegValueLengths += dwValueSize;
}
if (SubEntry.GetValueLength(DPL_REG_KEYNAME_EXECUTABLEFILENAME,&dwValueSize))
{
dwRegValueLengths += dwValueSize;
}
if (SubEntry.GetValueLength(DPL_REG_KEYNAME_EXECUTABLEPATH,&dwValueSize))
{
dwRegValueLengths += dwValueSize;
}
if (SubEntry.GetValueLength(DPL_REG_KEYNAME_LAUNCHERFILENAME,&dwValueSize))
{
dwRegValueLengths += dwValueSize;
}
if (SubEntry.GetValueLength(DPL_REG_KEYNAME_LAUNCHERPATH,&dwValueSize))
{
dwRegValueLengths += dwValueSize;
}
dwEntrySize += dwRegValueLengths * sizeof( WCHAR );
DPFX(DPFPREP, 7,"dwEntrySize [%ld]",dwEntrySize);
// If supplied buffer sufficient, use it
if (dwEntrySize <= *pdwBufferSize)
{
PackedBuffer.Initialize(pBuffer,*pdwBufferSize);
pdnProgramDesc = static_cast<DPL_PROGRAM_DESC*>(PackedBuffer.GetHeadAddress());
PackedBuffer.AddToFront(NULL,sizeof(DPL_PROGRAM_DESC));
dwValueSize = PackedBuffer.GetSpaceRemaining();
pdnProgramDesc->pwszApplicationName = static_cast<WCHAR*>(PackedBuffer.GetHeadAddress());
if (!SubEntry.ReadString(DPL_REG_KEYNAME_APPLICATIONNAME,
pdnProgramDesc->pwszApplicationName,&dwValueSize))
{
DPFERR( "Unable to get application name for entry" );
hResultCode = DPNERR_GENERIC;
goto EXIT_DPLGetProgramDesc;
}
if (dwValueSize > 1)
{
PackedBuffer.AddToFront(NULL,dwValueSize * sizeof(WCHAR));
}
else
{
pdnProgramDesc->pwszApplicationName = NULL;
}
dwValueSize = PackedBuffer.GetSpaceRemaining();
pdnProgramDesc->pwszCommandLine = static_cast<WCHAR*>(PackedBuffer.GetHeadAddress());
if (!SubEntry.ReadString(DPL_REG_KEYNAME_COMMANDLINE,
pdnProgramDesc->pwszCommandLine,&dwValueSize))
{
DPFERR( "Unable to get commandline for entry" );
hResultCode = DPNERR_GENERIC;
goto EXIT_DPLGetProgramDesc;
}
if (dwValueSize > 1)
{
PackedBuffer.AddToFront(NULL,dwValueSize * sizeof(WCHAR));
}
else
{
pdnProgramDesc->pwszCommandLine = NULL;
}
dwValueSize = PackedBuffer.GetSpaceRemaining();
pdnProgramDesc->pwszCurrentDirectory = static_cast<WCHAR*>(PackedBuffer.GetHeadAddress());
if (!SubEntry.ReadString(DPL_REG_KEYNAME_CURRENTDIRECTORY,
pdnProgramDesc->pwszCurrentDirectory,&dwValueSize))
{
DPFERR( "Unable to get current directory filename for entry" );
hResultCode = DPNERR_GENERIC;
goto EXIT_DPLGetProgramDesc;
}
if (dwValueSize > 1)
{
PackedBuffer.AddToFront(NULL,dwValueSize * sizeof(WCHAR));
}
else
{
pdnProgramDesc->pwszCurrentDirectory = NULL;
}
dwValueSize = PackedBuffer.GetSpaceRemaining();
pdnProgramDesc->pwszDescription = static_cast<WCHAR*>(PackedBuffer.GetHeadAddress());
if (!SubEntry.ReadString(DPL_REG_KEYNAME_DESCRIPTION,
pdnProgramDesc->pwszDescription,&dwValueSize))
{
DPFERR( "Unable to get description for entry" );
hResultCode = DPNERR_GENERIC;
goto EXIT_DPLGetProgramDesc;
}
if (dwValueSize > 1)
{
PackedBuffer.AddToFront(NULL,dwValueSize * sizeof(WCHAR));
}
else
{
pdnProgramDesc->pwszDescription = NULL;
}
dwValueSize = PackedBuffer.GetSpaceRemaining();
pdnProgramDesc->pwszExecutableFilename = static_cast<WCHAR*>(PackedBuffer.GetHeadAddress());
if (!SubEntry.ReadString(DPL_REG_KEYNAME_EXECUTABLEFILENAME,
pdnProgramDesc->pwszExecutableFilename,&dwValueSize))
{
DPFERR( "Unable to get executable filename for entry" );
hResultCode = DPNERR_GENERIC;
goto EXIT_DPLGetProgramDesc;
}
if (dwValueSize > 1)
{
PackedBuffer.AddToFront(NULL,dwValueSize * sizeof(WCHAR));
}
else
{
pdnProgramDesc->pwszExecutableFilename = NULL;
}
dwValueSize = PackedBuffer.GetSpaceRemaining();
pdnProgramDesc->pwszExecutablePath = static_cast<WCHAR*>(PackedBuffer.GetHeadAddress());
if (!SubEntry.ReadString(DPL_REG_KEYNAME_EXECUTABLEPATH,
pdnProgramDesc->pwszExecutablePath,&dwValueSize))
{
DPFERR( "Unable to get executable path for entry" );
hResultCode = DPNERR_GENERIC;
goto EXIT_DPLGetProgramDesc;
}
if (dwValueSize > 1)
{
PackedBuffer.AddToFront(NULL,dwValueSize * sizeof(WCHAR));
}
else
{
pdnProgramDesc->pwszExecutablePath = NULL;
}
dwValueSize = PackedBuffer.GetSpaceRemaining();
pdnProgramDesc->pwszLauncherFilename = static_cast<WCHAR*>(PackedBuffer.GetHeadAddress());
if (!SubEntry.ReadString(DPL_REG_KEYNAME_LAUNCHERFILENAME,
pdnProgramDesc->pwszLauncherFilename,&dwValueSize))
{
DPFERR( "Unable to get launcher filename for entry" );
hResultCode = DPNERR_GENERIC;
goto EXIT_DPLGetProgramDesc;
}
if (dwValueSize > 1)
{
PackedBuffer.AddToFront(NULL,dwValueSize * sizeof(WCHAR));
}
else
{
pdnProgramDesc->pwszLauncherFilename = NULL;
}
dwValueSize = PackedBuffer.GetSpaceRemaining();
pdnProgramDesc->pwszLauncherPath = static_cast<WCHAR*>(PackedBuffer.GetHeadAddress());
if (!SubEntry.ReadString(DPL_REG_KEYNAME_LAUNCHERPATH,
pdnProgramDesc->pwszLauncherPath,&dwValueSize))
{
DPFERR( "Unable to get launcher path for entry" );
hResultCode = DPNERR_GENERIC;
goto EXIT_DPLGetProgramDesc;
}
if (dwValueSize > 1)
{
PackedBuffer.AddToFront(NULL,dwValueSize * sizeof(WCHAR));
}
else
{
pdnProgramDesc->pwszLauncherPath = NULL;
}
pdnProgramDesc->dwSize = sizeof(DPL_PROGRAM_DESC);
pdnProgramDesc->dwFlags = 0;
pdnProgramDesc->guidApplication = *pGuidApplication;
hResultCode = DPN_OK;
}
else
{
hResultCode = DPNERR_BUFFERTOOSMALL;
}
SubEntry.Close();
RegistryEntry.Close();
if (hResultCode == DPN_OK || hResultCode == DPNERR_BUFFERTOOSMALL)
{
*pdwBufferSize = dwEntrySize;
}
EXIT_DPLGetProgramDesc:
DPFX(DPFPREP, 3,"Returning: [0x%lx]",hResultCode);
return(hResultCode);
}