/*++

Copyright (c) 1998 Microsoft Corporation

Module Name:

    reg95.h

Abstract:

    Implements wrappers to the Win95Reg APIs.

Author:

    Jim Schmidt (jimschm) 04-Feb-1998

Revision History:

    <alias> <date> <comments>

--*/

#pragma once

//
// Tracking of registry calls.  These functions are completely
// turned off for non-debug builds and are mapped to the standard
// Win32 APIs via macro definitions.
//

//
// The Track* API take the same params as the Reg* equivalents.
// The Debug* API also take the same params as the Reg* equivalents, but
// the debug versions have two extra parameters, File and Line.
//

//
// Use the Track* API set instead of the Reg* API set.
//

#ifndef DEBUG

#define DumpOpenKeys95()
#define RegTrackTerminate95()

#define TrackedRegOpenKey95             Win95RegOpenKey
#define TrackedRegOpenKeyEx95           Win95RegOpenKeyEx

#define TrackedRegOpenKey95A            Win95RegOpenKeyA
#define TrackedRegOpenKeyEx95A          Win95RegOpenKeyExA

#define TrackedRegOpenKey95W            Win95RegOpenKeyW
#define TrackedRegOpenKeyEx95W          Win95RegOpenKeyExW

#define OurRegOpenKeyEx95A              Win95RegOpenKeyExA

#define OurRegOpenRootKey95A(a,b)
#define OurRegOpenRootKey95W(a,b)

#define OurRegOpenKeyEx95W              Win95RegOpenKeyExW

#define CloseRegKey95                   RealCloseRegKey95

#define DEBUG_TRACKING_PARAMS
#define DEBUG_TRACKING_ARGS

#else

extern DWORD g_DontCare95;

#define DEBUG_TRACKING_PARAMS       ,PCSTR File,DWORD Line
#define DEBUG_TRACKING_ARGS         , File, Line

VOID
DumpOpenKeys95 (
    VOID
    );

VOID
RegTrackTerminate95 (
    VOID
    );


LONG
DebugRegOpenKeyEx95A (
    HKEY Key,
    PCSTR SubKey,
    DWORD Unused,
    REGSAM SamMask,
    PHKEY ResultPtr,
    PCSTR File,
    DWORD Line
    );

LONG
DebugRegOpenKeyEx95W (
    HKEY Key,
    PCWSTR SubKey,
    DWORD Unused,
    REGSAM SamMask,
    PHKEY ResultPtr,
    PCSTR File,
    DWORD Line
    );

VOID
DebugRegOpenRootKey95A (
    HKEY Key,
    PCSTR SubKey,
    PCSTR File,
    DWORD Line
    );

VOID
DebugRegOpenRootKey95W (
    HKEY Key,
    PCWSTR SubKey,
    PCSTR File,
    DWORD Line
    );

#ifdef UNICODE
#define DebugRegOpenRootKey95 DebugRegOpenRootKey95W
#else
#define DebugRegOpenRootKey95 DebugRegOpenRootKey95A
#endif


LONG
DebugCloseRegKey95 (
    HKEY Key,
    PCSTR File,
    DWORD Line
    );

#define CloseRegKey95(k) DebugCloseRegKey95(k,__FILE__,__LINE__)


#define OurRegOpenKeyEx95A              DebugRegOpenKeyEx95A
#define OurRegOpenRootKey95A            DebugRegOpenRootKey95A
#define OurRegOpenRootKey95W            DebugRegOpenRootKey95W
#define OurRegOpenKeyEx95W              DebugRegOpenKeyEx95W


#define TrackedRegOpenKeyEx95(key,subkey,u,sam,res) DebugRegOpenKeyEx95(key,subkey,u,sam,res,__FILE__,__LINE__)
#define TrackedRegOpenKey95(k,sk,rp) DebugRegOpenKeyEx95(k,sk,0,KEY_ALL_ACCESS,rp,__FILE__,__LINE__)

#define TrackedRegOpenKeyEx95A(key,subkey,u,sam,res) DebugRegOpenKeyEx95A(key,subkey,u,sam,res,__FILE__,__LINE__)
#define TrackedRegOpenKey95A(k,sk,rp) DebugRegOpenKeyEx95A(k,sk,0,KEY_ALL_ACCESS,rp,__FILE__,__LINE__)

#define TrackedRegOpenKeyEx95W(key,subkey,u,sam,res) DebugRegOpenKeyEx95W(key,subkey,u,sam,res,__FILE__,__LINE__)
#define TrackedRegOpenKey95W(k,sk,rp) DebugRegOpenKeyEx95W(k,sk,0,KEY_ALL_ACCESS,rp,__FILE__,__LINE__)

//
// Undefine the real registry APIs -- using them will throw off the tracking
//

#undef Win95RegOpenKey
#undef Win95RegOpenKeyEx

#define Win95RegCloseKey    USE_CloseRegKey95
#define Win95RegOpenKeyA    USE_TrackedRegOpenKey95A
#define Win95RegOpenKeyExA  USE_TrackedRegOpenKeyExA
#define Win95RegOpenKeyW    USE_TrackedRegOpenKey95W
#define Win95RegOpenKeyExW  USE_TrackedRegOpenKeyEx95W
#define Win95RegOpenKey     USE_TrackedRegOpenKey95
#define Win95RegOpenKeyEx   USE_TrackedRegOpenKeyEx95

#endif


#ifdef UNICODE
#define DebugRegOpenKeyEx95         DebugRegOpenKeyEx95W
#else
#define DebugRegOpenKeyEx95         DebugRegOpenKeyEx95A
#endif


//
// Enum functions
//

BOOL
EnumFirstRegKey95A (
    OUT     PREGKEY_ENUMA EnumPtr,
    IN      HKEY hKey
    );

BOOL
EnumFirstRegKey95W (
    OUT     PREGKEY_ENUMW EnumPtr,
    IN      HKEY hKey
    );

BOOL
RealEnumFirstRegKeyStr95A (
    OUT     PREGKEY_ENUMA EnumPtr,
    IN      PCSTR RegKey
            DEBUG_TRACKING_PARAMS
    );

BOOL
RealEnumFirstRegKeyStr95W (
    OUT     PREGKEY_ENUMW EnumPtr,
    IN      PCWSTR RegKey
            DEBUG_TRACKING_PARAMS
    );

#ifdef DEBUG

#define EnumFirstRegKeyStr95A(a,b) RealEnumFirstRegKeyStr95A(a,b,__FILE__,__LINE__)
#define EnumFirstRegKeyStr95W(a,b) RealEnumFirstRegKeyStr95W(a,b,__FILE__,__LINE__)

#else

#define EnumFirstRegKeyStr95A RealEnumFirstRegKeyStr95A
#define EnumFirstRegKeyStr95W RealEnumFirstRegKeyStr95W

#endif



BOOL
EnumNextRegKey95A (
    IN OUT  PREGKEY_ENUMA EnumPtr
    );

BOOL
EnumNextRegKey95W (
    IN OUT  PREGKEY_ENUMW EnumPtr
    );

VOID
AbortRegKeyEnum95A (
    IN OUT  PREGKEY_ENUMA EnumPtr
    );

VOID
AbortRegKeyEnum95W (
    IN OUT  PREGKEY_ENUMW EnumPtr
    );

BOOL
RealEnumFirstRegKeyInTree95A (
    OUT     PREGTREE_ENUMA EnumPtr,
    IN      PCSTR BaseKeyStr
    );

#define EnumFirstRegKeyInTree95A(e,base)  SETTRACKCOMMENT(BOOL,"EnumFirstRegKeyInTree95A",__FILE__,__LINE__)\
                                        RealEnumFirstRegKeyInTree95A(e,base)\
                                        CLRTRACKCOMMENT

BOOL
RealEnumFirstRegKeyInTree95W (
    OUT     PREGTREE_ENUMW EnumPtr,
    IN      PCWSTR BaseKeyStr
    );

#define EnumFirstRegKeyInTree95W(e,base)  SETTRACKCOMMENT(BOOL,"EnumFirstRegKeyInTree95W",__FILE__,__LINE__)\
                                        RealEnumFirstRegKeyInTree95W(e,base)\
                                        CLRTRACKCOMMENT


BOOL
RealEnumNextRegKeyInTree95A (
    IN OUT  PREGTREE_ENUMA EnumPtr
    );

#define EnumNextRegKeyInTree95A(e)        SETTRACKCOMMENT(BOOL,"EnumNextRegKeyInTree95A",__FILE__,__LINE__)\
                                        RealEnumNextRegKeyInTree95A(e)\
                                        CLRTRACKCOMMENT

BOOL
RealEnumNextRegKeyInTree95W (
    IN OUT  PREGTREE_ENUMW EnumPtr
    );

#define EnumNextRegKeyInTree95W(e)        SETTRACKCOMMENT(BOOL,"EnumNextRegKeyInTree95W",__FILE__,__LINE__)\
                                        RealEnumNextRegKeyInTree95W(e)\
                                        CLRTRACKCOMMENT

VOID
AbortRegKeyTreeEnum95A (
    IN OUT  PREGTREE_ENUMA EnumPtr
    );

VOID
AbortRegKeyTreeEnum95W (
    IN OUT  PREGTREE_ENUMW EnumPtr
    );


BOOL
EnumFirstRegValue95A (
    OUT     PREGVALUE_ENUMA EnumPtr,
    IN      HKEY hKey
    );

BOOL
EnumFirstRegValue95W (
    OUT     PREGVALUE_ENUMW EnumPtr,
    IN      HKEY hKey
    );

BOOL
EnumNextRegValue95A (
    IN OUT  PREGVALUE_ENUMA EnumPtr
    );

BOOL
EnumNextRegValue95W (
    IN OUT  PREGVALUE_ENUMW EnumPtr
    );

//
// Versions that allow caller to specify allocator, and macro that uses
// pMemAllocWrapper95
//

ALLOCATOR_PROTOTYPE pMemAllocWrapper95;
DEALLOCATOR_PROTOTYPE pMemFreeWrapper95;

PBYTE
GetRegValueDataEx95A (
    IN      HKEY hKey,
    IN      PCSTR Value,
    IN      ALLOCATOR Allocator,
    IN      DEALLOCATOR Deallocator
    );

#define GetRegValueData95A(key,valuename) SETTRACKCOMMENT(PBYTE, "GetRegValueData95A",__FILE__, __LINE__)\
                                        GetRegValueDataEx95A((key),(valuename),pMemAllocWrapper95,pMemFreeWrapper95)\
                                        CLRTRACKCOMMENT


PBYTE
GetRegValueDataEx95W (
    IN      HKEY hKey,
    IN      PCWSTR Value,
    IN      ALLOCATOR Allocator,
    IN      DEALLOCATOR Deallocator
    );

#define GetRegValueData95W(key,valuename) SETTRACKCOMMENT(PBYTE, "GetRegValueData95W",__FILE__, __LINE__)\
                                        GetRegValueDataEx95W((key),(valuename),pMemAllocWrapper95,pMemFreeWrapper95)\
                                        CLRTRACKCOMMENT

PBYTE
GetRegValueDataOfTypeEx95A (
    IN      HKEY hKey,
    IN      PCSTR Value,
    IN      DWORD MustBeType,
    IN      ALLOCATOR Allocator,
    IN      DEALLOCATOR Deallocator
    );

#define GetRegValueDataOfType95A(key,valuename,type)  SETTRACKCOMMENT(PBYTE, "GetRegValueDataOfType95A",__FILE__,__LINE__)\
                                                    GetRegValueDataOfTypeEx95A((key),(valuename),(type),pMemAllocWrapper95,pMemFreeWrapper95)\
                                                    CLRTRACKCOMMENT

PBYTE
GetRegValueDataOfTypeEx95W (
    IN      HKEY hKey,
    IN      PCWSTR Value,
    IN      DWORD MustBeType,
    IN      ALLOCATOR Allocator,
    IN      DEALLOCATOR Deallocator
    );

#define GetRegValueDataOfType95W(key,valuename,type)  SETTRACKCOMMENT(PBYTE, "GetRegValueDataOfType95W",__FILE__,__LINE__)\
                                                    GetRegValueDataOfTypeEx95W((key),(valuename),(type),pMemAllocWrapper95,pMemFreeWrapper95)\
                                                    CLRTRACKCOMMENT

PBYTE
GetRegKeyDataEx95A (
    IN      HKEY hKey,
    IN      PCSTR SubKey,
    IN      ALLOCATOR Allocator,
    IN      DEALLOCATOR Deallocator
    );

#define GetRegKeyData95A(key,subkey)  SETTRACKCOMMENT(PBYTE, "GetRegKeyData95A",__FILE__,__LINE__)\
                                    GetRegKeyDataEx95A((key),(subkey),pMemAllocWrapper95,pMemFreeWrapper95)\
                                    CLRTRACKCOMMENT

PBYTE
GetRegKeyDataEx95W (
    IN      HKEY hKey,
    IN      PCWSTR SubKey,
    IN      ALLOCATOR Allocator,
    IN      DEALLOCATOR Deallocator
    );

#define GetRegKeyData95W(key,subkey)  SETTRACKCOMMENT(PBYTE, "GetRegKeyData95W",__FILE__,__LINE__)\
                                    GetRegKeyDataEx95W((key),(subkey),pMemAllocWrapper95,pMemFreeWrapper95)\
                                    CLRTRACKCOMMENT

PBYTE
GetRegDataEx95A (
    IN      PCSTR KeyString,
    IN      PCSTR ValueName,
    IN      ALLOCATOR Allocator,
    IN      DEALLOCATOR Deallocator
    );

#define GetRegData95A(keystr,value) SETTRACKCOMMENT(PBYTE, "GetRegData95A",__FILE__,__LINE__)\
                                  GetRegDataEx95A((keystr),(value),pMemAllocWrapper95,pMemFreeWrapper95)\
                                  CLRTRACKCOMMENT

PBYTE
GetRegDataEx95W (
    IN      PCWSTR KeyString,
    IN      PCWSTR ValueName,
    IN      ALLOCATOR Allocator,
    IN      DEALLOCATOR Deallocator
    );

#define GetRegData95W(keystr,value)   SETTRACKCOMMENT(PBYTE, "GetRegData95W",__FILE__,__LINE__)\
                                    GetRegDataEx95W((keystr),(value),pMemAllocWrapper95,pMemFreeWrapper95)\
                                    CLRTRACKCOMMENT

//
// Win95Reg key open
//

HKEY
RealOpenRegKeyStr95A (
    IN      PCSTR RegKey
            DEBUG_TRACKING_PARAMS
    );

HKEY
RealOpenRegKeyStr95W (
    IN      PCWSTR RegKey
            DEBUG_TRACKING_PARAMS
    );

HKEY
RealOpenRegKey95A (
    IN      HKEY ParentKey,
    IN      PCSTR KeyToOpen
            DEBUG_TRACKING_PARAMS
    );

HKEY
RealOpenRegKey95W (
    IN      HKEY ParentKey,
    IN      PCWSTR KeyToOpen
            DEBUG_TRACKING_PARAMS
    );

LONG
RealCloseRegKey95 (
    IN      HKEY Key
    );


#ifdef DEBUG

#define OpenRegKeyStr95A(a)      RealOpenRegKeyStr95A(a,__FILE__,__LINE__)
#define OpenRegKeyStr95W(a)      RealOpenRegKeyStr95W(a,__FILE__,__LINE__)
#define OpenRegKey95A(a,b)       RealOpenRegKey95A(a,b,__FILE__,__LINE__)
#define OpenRegKey95W(a,b)       RealOpenRegKey95W(a,b,__FILE__,__LINE__)

#else

#define OpenRegKeyStr95A RealOpenRegKeyStr95A
#define OpenRegKeyStr95W RealOpenRegKeyStr95W
#define OpenRegKey95A RealOpenRegKey95A
#define OpenRegKey95W RealOpenRegKey95W

#endif


//
// Macros
//

#define GetRegValueString95A(key,valuename) (PCSTR) GetRegValueDataOfType95A((key),(valuename),REG_SZ)
#define GetRegValueBinary95A(key,valuename) (PBYTE) GetRegValueDataOfType95A((key),(valuename),REG_BINARY)
#define GetRegValueMultiSz95A(key,valuename) (PCSTR) GetRegValueDataOfType95A((key),(valuename),REG_MULTISZ)
#define GetRegValueDword95A(key,valuename) (PDWORD) GetRegValueDataOfType95A((key),(valuename),REG_DWORD)

#define GetRegValueString95W(key,valuename) (PCWSTR) GetRegValueDataOfType95W((key),(valuename),REG_SZ)
#define GetRegValueBinary95W(key,valuename) (PBYTE) GetRegValueDataOfType95W((key),(valuename),REG_BINARY)
#define GetRegValueMultiSz95W(key,valuename) (PCWSTR) GetRegValueDataOfType95W((key),(valuename),REG_MULTISZ)
#define GetRegValueDword95W(key,valuename) (PDWORD) GetRegValueDataOfType95W((key),(valuename),REG_DWORD)

#define GetRegValueStringEx95A(key,valuename,alloc,free) GetRegValueDataOfTypeEx95A((key),(valuename),REG_SZ,alloc,free)
#define GetRegValueBinaryEx95A(key,valuename,alloc,free) GetRegValueDataOfTypeEx95A((key),(valuename),REG_BINARY,alloc,free)
#define GetRegValueMultiSzEx95A(key,valuename,alloc,free) GetRegValueDataOfTypeEx95A((key),(valuename),REG_MULTISZ,alloc,free)
#define GetRegValueDwordEx95A(key,valuename,alloc,free) GetRegValueDataOfTypeEx95A((key),(valuename),REG_DWORD,alloc,free)

#define GetRegValueStringEx95W(key,valuename,alloc,free) GetRegValueDataOfTypeEx95W((key),(valuename),REG_SZ,alloc,free)
#define GetRegValueBinaryEx95W(key,valuename,alloc,free) GetRegValueDataOfTypeEx95W((key),(valuename),REG_BINARY,alloc,free)
#define GetRegValueMultiSzEx95W(key,valuename,alloc,free) GetRegValueDataOfTypeEx95W((key),(valuename),REG_MULTISZ,alloc,free)
#define GetRegValueDwordEx95W(key,valuename,alloc,free) GetRegValueDataOfTypeEx95W((key),(valuename),REG_DWORD,alloc,free)

#ifdef UNICODE

#define EnumFirstRegKey95           EnumFirstRegKey95W
#define EnumFirstRegKeyStr95        EnumFirstRegKeyStr95W
#define EnumNextRegKey95            EnumNextRegKey95W
#define AbortRegKeyEnum95           AbortRegKeyEnum95W
#define EnumFirstRegKeyInTree95     EnumFirstRegKeyInTree95W
#define EnumNextRegKeyInTree95      EnumNextRegKeyInTree95W
#define AbortRegKeyTreeEnum95       AbortRegKeyTreeEnum95W
#define EnumFirstRegValue95         EnumFirstRegValue95W
#define EnumNextRegValue95          EnumNextRegValue95W

#define GetRegValueData95           GetRegValueData95W
#define GetRegValueDataOfType95     GetRegValueDataOfType95W
#define GetRegKeyData95             GetRegKeyData95W
#define GetRegValueDataEx95         GetRegValueDataEx95W
#define GetRegValueDataOfTypeEx95   GetRegValueDataOfTypeEx95W
#define GetRegKeyDataEx95           GetRegKeyDataEx95W
#define GetRegValueString95         GetRegValueString95W
#define GetRegValueBinary95         GetRegValueBinary95W
#define GetRegValueMultiSz95        GetRegValueMultiSz95W
#define GetRegValueDword95          GetRegValueDword95W
#define GetRegValueStringEx95       GetRegValueStringEx95W
#define GetRegValueBinaryEx95       GetRegValueBinaryEx95W
#define GetRegValueMultiSzEx95      GetRegValueMultiSzEx95W
#define GetRegValueDwordEx95        GetRegValueDwordEx95W
#define GetRegDataEx95              GetRegDataEx95W
#define GetRegData95                GetRegData95W

#define OpenRegKey95                OpenRegKey95W
#define OpenRegKeyStr95             OpenRegKeyStr95W


#else

#define EnumFirstRegKey95           EnumFirstRegKey95A
#define EnumFirstRegKeyStr95        EnumFirstRegKeyStr95A
#define EnumNextRegKey95            EnumNextRegKey95A
#define AbortRegKeyEnum95           AbortRegKeyEnum95A
#define EnumFirstRegKeyInTree95     EnumFirstRegKeyInTree95A
#define EnumNextRegKeyInTree95      EnumNextRegKeyInTree95A
#define AbortRegKeyTreeEnum95       AbortRegKeyTreeEnum95A
#define EnumFirstRegValue95         EnumFirstRegValue95A
#define EnumNextRegValue95          EnumNextRegValue95A

#define GetRegValueData95           GetRegValueData95A
#define GetRegValueDataOfType95     GetRegValueDataOfType95A
#define GetRegKeyData95             GetRegKeyData95A
#define GetRegValueDataEx95         GetRegValueDataEx95A
#define GetRegValueDataOfTypeEx95   GetRegValueDataOfTypeEx95A
#define GetRegKeyDataEx95           GetRegKeyDataEx95A
#define GetRegValueString95         GetRegValueString95A
#define GetRegValueBinary95         GetRegValueBinary95A
#define GetRegValueMultiSz95        GetRegValueMultiSz95A
#define GetRegValueDword95          GetRegValueDword95A
#define GetRegValueStringEx95       GetRegValueStringEx95A
#define GetRegValueBinaryEx95       GetRegValueBinaryEx95A
#define GetRegValueMultiSzEx95      GetRegValueMultiSzEx95A
#define GetRegValueDwordEx95        GetRegValueDwordEx95A
#define GetRegDataEx95              GetRegDataEx95A
#define GetRegData95                GetRegData95A

#define OpenRegKey95                OpenRegKey95A
#define OpenRegKeyStr95             OpenRegKeyStr95A


#endif