windows-nt/Source/XPSP1/NT/multimedia/media/sndrec32/soundrec/reg.c
2020-09-26 16:20:57 +08:00

505 lines
12 KiB
C
Raw Blame History

/* (C) Copyright Microsoft Corporation 1991-1994. All Rights Reserved */
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <regstr.h>
#include "reg.h"
const TCHAR szRegPath[] = REGSTR_PATH_WINDOWSAPPLETS TEXT("\\Sound Recorder");
/* ReadRegistryData
*
* Reads information from the registry
*
* Parameters:
*
* pEntryNode - The node under Media Player which should be opened
* for this data. If this is NULL, the value is
* written directly under szRegPath.
*
* pEntryName - The name of the value under pEntryNode to be retrieved.
*
* pType - Pointer to a buffer to receive type of data read. May be NULL.
*
* pData - Pointer to a buffer to receive the value data.
*
* Size - Size, in bytes, of the buffer pointed to by pData.
*
* Return:
*
* Registry status return (NO_ERROR is good)
*
*
* Andrew Bell (andrewbe) wrote it, 10 September 1992
*
*/
DWORD ReadRegistryData( LPTSTR pEntryNode,
LPTSTR pEntryName,
PDWORD pType,
LPBYTE pData,
DWORD DataSize )
{
DWORD Status;
HKEY hkeyRegPath;
HKEY hkeyEntryNode;
DWORD Size;
Status = RegOpenKeyEx( HKEY_CURRENT_USER, szRegPath, 0,
KEY_READ, &hkeyRegPath );
if( Status == NO_ERROR )
{
/* Open the sub-node:
*/
if( pEntryNode )
Status = RegOpenKeyEx( hkeyRegPath, pEntryNode, 0,
KEY_READ, &hkeyEntryNode );
else
hkeyEntryNode = hkeyRegPath;
if( Status == NO_ERROR )
{
Size = DataSize;
/* Read the entry from the registry:
*/
Status = RegQueryValueEx( hkeyEntryNode,
pEntryName,
0,
pType,
pData,
&Size );
if( pEntryNode )
RegCloseKey( hkeyEntryNode );
}
RegCloseKey( hkeyRegPath );
}
return Status;
}
DWORD QueryRegistryDataSize(
LPTSTR pEntryNode,
LPTSTR pEntryName,
DWORD *pDataSize )
{
DWORD Status;
HKEY hkeyRegPath;
HKEY hkeyEntryNode;
DWORD Size;
/* Open the top-level node. For Media Player this is:
* "Software\\Microsoft\\Windows NT\\CurrentVersion\\Sound Recorder"
*/
Status = RegOpenKeyEx( HKEY_CURRENT_USER, szRegPath, 0,
KEY_READ, &hkeyRegPath );
if( Status == NO_ERROR )
{
/* Open the sub-node:
*/
if( pEntryNode )
Status = RegOpenKeyEx( hkeyRegPath, pEntryNode, 0,
KEY_READ, &hkeyEntryNode );
else
hkeyEntryNode = hkeyRegPath;
if( Status == NO_ERROR )
{
/* Read the entry from the registry:
*/
Status = RegQueryValueEx( hkeyEntryNode,
pEntryName,
0,
NULL,
NULL,
&Size );
if (Status == NO_ERROR)
*pDataSize = Size;
if( pEntryNode )
RegCloseKey( hkeyEntryNode );
}
RegCloseKey( hkeyRegPath );
}
return Status;
}
/* WriteRegistryData
*
* Writes a bunch of information to the registry
*
* Parameters:
*
* pEntryNode - The node under szRegPath which should be created
* or opened for this data. If this is NULL, the value is
* written directly under szRegPath.
*
* pEntryName - The name of the value under pEntryNode to be set.
*
* Type - Type of data to read (e.g. REG_SZ).
*
* pData - Pointer to the value data to be written. If this is NULL,
* the value under pEntryNode is deleted.
*
* Size - Size, in bytes, of the buffer pointed to by pData.
*
*
* This routine is fairly generic, apart from the name of the top-level node.
*
* The data are stored in the following registry tree:
*
* HKEY_CURRENT_USER
* <20>
* <20><> Software
* <20>
* <20><> Microsoft
* <20>
* <20><> Windows NT
* <20>
* <20><> CurrentVersion
* <20>
* <20><> Media Player
* <20>
* <20><> AVIVideo
* <20>
* <20><> DisplayPosition
* <20>
* <20><> SysIni
*
*
* Return:
*
* Registry status return (NO_ERROR is good)
*
*
* Andrew Bell (andrewbe) wrote it, 10 September 1992
*
*/
DWORD WriteRegistryData( LPTSTR pEntryNode,
LPTSTR pEntryName,
DWORD Type,
LPBYTE pData,
DWORD Size )
{
DWORD Status;
HKEY hkeyRegPath;
HKEY hkeyEntryNode;
/* Open or create the top-level node. For Media Player this is:
* "Software\\Microsoft\\Windows NT\\CurrentVersion\\Media Player"
*/
Status = RegCreateKeyEx( HKEY_CURRENT_USER, szRegPath, 0,
NULL, 0, KEY_WRITE, NULL, &hkeyRegPath, NULL );
if( Status == NO_ERROR )
{
/* Open or create the sub-node.
*/
if( pEntryNode )
Status = RegCreateKeyEx( hkeyRegPath, pEntryNode, 0,
NULL, 0, KEY_WRITE, NULL, &hkeyEntryNode, NULL );
else
hkeyEntryNode = hkeyRegPath;
if( Status == NO_ERROR )
{
if( pData )
{
Status = RegSetValueEx( hkeyEntryNode,
pEntryName,
0,
Type,
pData,
Size );
}
else
{
Status = RegDeleteValue( hkeyEntryNode, pEntryName );
}
if( pEntryNode )
RegCloseKey( hkeyEntryNode );
}
RegCloseKey( hkeyRegPath );
}
return Status;
}
/*
* Save/Restore window position
*/
BOOL SoundRec_GetSetRegistryRect(
HWND hwnd,
int Get)
{
const TCHAR aszXPos[] = TEXT("X");
const TCHAR aszYPos[] = TEXT("Y");
RECT rcWnd,rc;
if (!GetWindowRect(hwnd, &rcWnd))
return FALSE;
switch (Get)
{
case SGSRR_GET:
if (ReadRegistryData((LPTSTR)NULL
, (LPTSTR)aszXPos
, NULL
, (LPBYTE)&rc.left
, sizeof(rc.left)) != NO_ERROR)
{
break;
}
if (ReadRegistryData((LPTSTR)NULL
, (LPTSTR)aszYPos
, NULL
, (LPBYTE)&rc.top
, sizeof(rc.top)) != NO_ERROR)
{
break;
}
//
// Restore window position
//
MoveWindow(hwnd
, rc.left
, rc.top
, rcWnd.right - rcWnd.left
, rcWnd.bottom - rcWnd.top
, FALSE );
return TRUE;
case SGSRR_SET:
//
// don't save iconic or hidden window states
//
if (IsIconic(hwnd) || !IsWindowVisible(hwnd))
break;
if (WriteRegistryData((LPTSTR)NULL
, (LPTSTR)aszXPos
, REG_DWORD
, (LPBYTE)&rcWnd.left
, sizeof(rcWnd.left)) != NO_ERROR)
{
break;
}
if (WriteRegistryData((LPTSTR)NULL
, (LPTSTR)aszYPos
, REG_DWORD
, (LPBYTE)&rcWnd.top
, sizeof(rcWnd.top)) != NO_ERROR)
{
break;
}
return TRUE;
default:
break;
}
return FALSE;
}
/*
*
* */
const TCHAR szAudioRegPath[] = REGSTR_PATH_MULTIMEDIA_AUDIO;
const TCHAR szWaveFormats[] = REGSTR_PATH_MULTIMEDIA_AUDIO TEXT("\\WaveFormats");
const TCHAR szDefaultFormat[] = TEXT("DefaultFormat");
/*
* BOOL SoundRec_SetDefaultFormat
*
* Write the DefaultFormat friendly name into the registry. Under DAYTONA
* we don't have a UI to set DefaultFormat, so this is a way of setting
* it from an application.
*
* Under Chicago, the Audio page in MMCPL manages this information.
* */
BOOL SoundRec_SetDefaultFormat(
LPTSTR lpFormat)
{
DWORD cbFormat;
DWORD Status;
HKEY hkeyRegPath;
cbFormat = (lstrlen(lpFormat) + 1) * sizeof(TCHAR);
//
// Don't store NULL.
//
if (cbFormat <= sizeof(TCHAR) )
return FALSE;
Status = RegOpenKeyEx( HKEY_CURRENT_USER, szAudioRegPath, 0,
KEY_WRITE, &hkeyRegPath );
if (Status != NO_ERROR)
return FALSE;
//
// Get the format tag string
//
Status = RegSetValueEx( hkeyRegPath,
szDefaultFormat,
0,
REG_SZ,
(CONST BYTE*)lpFormat,
cbFormat );
return (Status == NO_ERROR);
}
/* IsValidWFX
*
* Validate the wfx in case it was corrupted.
*
* */
BOOL IsValidWFX(
LPWAVEFORMATEX lpwfx,
DWORD cbwfx)
{
if (cbwfx < sizeof(WAVEFORMAT))
return FALSE;
if (lpwfx->nChannels == 0)
return FALSE;
if (lpwfx->nSamplesPerSec == 0)
return FALSE;
if (lpwfx->nAvgBytesPerSec == 0)
return FALSE;
if (lpwfx->nBlockAlign == 0)
return FALSE;
if (lpwfx->wFormatTag == WAVE_FORMAT_PCM)
return TRUE;
if (cbwfx < (sizeof(WAVEFORMATEX) + lpwfx->cbSize))
return FALSE;
return TRUE;
}
/*
* BOOL SoundRec_GetDefaultFormat
*
* Default format is stored in a public area of the registry.
*
* */
BOOL SoundRec_GetDefaultFormat(
LPWAVEFORMATEX *ppwfx,
DWORD *pcbwfx)
{
DWORD Status;
HKEY hkeyRegPath;
HKEY hkeyFmtPath;
LPTSTR lpsz;
DWORD cbsz;
DWORD cbwfx = 0;
LPWAVEFORMATEX lpwfx = NULL;
//
// Null out params
//
*ppwfx = NULL;
*pcbwfx = 0;
Status = RegOpenKeyEx( HKEY_CURRENT_USER, szAudioRegPath, 0,
KEY_READ, &hkeyRegPath );
if (Status != NO_ERROR)
return FALSE;
//
// Get the format tag string
//
Status = RegQueryValueEx( hkeyRegPath, szDefaultFormat, 0, NULL, NULL,
&cbsz );
if (Status != NO_ERROR)
return FALSE;
lpsz = (LPTSTR)GlobalAllocPtr(GHND, cbsz);
if (!lpsz)
return FALSE;
Status = RegQueryValueEx( hkeyRegPath, szDefaultFormat, 0, NULL,
(LPBYTE)lpsz, &cbsz );
if (Status == NO_ERROR)
{
//
// Get the format
//
Status = RegOpenKeyEx( HKEY_CURRENT_USER, szWaveFormats, 0,
KEY_READ, &hkeyFmtPath );
if (Status == NO_ERROR)
{
Status = RegQueryValueEx( hkeyFmtPath, lpsz, 0, NULL, NULL,
&cbwfx );
//
// Make sure the structure is at minimum a WAVEFORMAT in size
//
if ((Status == NO_ERROR) && (cbwfx >= sizeof(WAVEFORMAT)))
{
lpwfx = (LPWAVEFORMATEX)GlobalAllocPtr(GHND, cbwfx);
if (lpwfx)
{
Status = RegQueryValueEx( hkeyFmtPath, lpsz, 0, NULL,
(LPBYTE)lpwfx, &cbwfx );
}
}
RegCloseKey(hkeyFmtPath);
}
}
RegCloseKey(hkeyRegPath);
GlobalFreePtr(lpsz);
//
// Sanity Check.
//
if (lpwfx)
{
if (Status == NO_ERROR && IsValidWFX(lpwfx, cbwfx))
{
cbwfx = sizeof(WAVEFORMATEX)
+ ((lpwfx->wFormatTag == WAVE_FORMAT_PCM)?0:lpwfx->cbSize);
*pcbwfx = cbwfx;
*ppwfx = lpwfx;
return TRUE;
}
else
{
GlobalFreePtr(lpwfx);
return FALSE;
}
}
return FALSE;
}