//
// Debug message types
//

#define DM_WARNING  0
#define DM_ASSERT   1
#define DM_VERBOSE  2


//
// Debug macros
//

#ifdef DBG

#define DEBUGMSG(x) _DebugMsg x

VOID _DebugMsg(UINT mask, PCSTR pszMsg, ...);

#define DMASSERT(x) if (!(x)) \
                        _DebugMsg(DM_ASSERT,"profmap.dll assertion " #x " failed\n, line %u of %s", __LINE__, TEXT(__FILE__));

#else

#define DEBUGMSG(x)
#define DMASSERT(x)

#endif

//
// userenv.c
//

BOOL OurConvertSidToStringSid (PSID Sid, PWSTR *SidString);
VOID DeleteSidString (PWSTR SidString);
BOOL RegDelnode (HKEY KeyRoot, PWSTR SubKey);

PACL
CreateDefaultAcl (
    PSID pSid
    );


VOID
FreeDefaultAcl (
    PACL Acl            OPTIONAL
    );

BOOL
GetProfileRoot (
    IN      PSID Sid,
    OUT     PWSTR ProfileDir
    );



#define USER_PROFILE_MUTEX           TEXT("Global\\userenv:  User Profile Mutex for ")
#define PROFILE_LIST_PATH            TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList")
#define PROFILE_IMAGE_VALUE_NAME     TEXT("ProfileImagePath")
#define PROFILE_GUID                 TEXT("Guid")
#define PROFILE_GUID_PATH            TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileGuid")
#define WINDOWS_POLICIES_KEY         TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies")
#define ROOT_POLICIES_KEY            TEXT("Software\\Policies")

BOOL
UpdateProfileSecurity (
    PSID Sid
    );

BOOL DeleteProfileRegistrySettings (LPTSTR lpSidString);

PSID GetUserSid (HANDLE UserToken);
VOID DeleteUserSid(PSID Sid);

#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))

LONG MyRegLoadKey(HKEY hKey, LPTSTR lpSubKey, LPTSTR lpFile);
BOOL MyRegUnLoadKey(HKEY hKey, LPTSTR lpSubKey);
BOOL SetupNewHive(LPTSTR lpSidString, PSID pSid);
DWORD ApplySecurityToRegistryTree(HKEY RootKey, PSECURITY_DESCRIPTOR pSD);
BOOL SecureUserKey(LPTSTR lpKey, PSID pSid);
LPWSTR ProduceWFromA(LPCSTR pszA);
BOOL IsUserAnAdminMember(HANDLE hToken);

//
// Stuff lifted from win9x upgrade code
//

#define MemAlloc(s)         LocalAlloc(LPTR,s)
#define MemReAlloc(x,s)     LocalReAlloc(x,s,LMEM_MOVEABLE)
#define MemFree(x)          LocalFree(x)

typedef struct {
    PBYTE Buf;
    DWORD Size;
    DWORD End;
    DWORD GrowSize;
    DWORD UserIndex;        // Unused by Growbuf. For caller use.
} GROWBUFFER, *PGROWBUFFER;

#define GROWBUF_INIT {NULL,0,0,0,0}

PBYTE
GrowBuffer (
    IN OUT  PGROWBUFFER GrowBuf,
    IN      DWORD   SpaceNeeded
    );

VOID
FreeGrowBuffer (
    IN  PGROWBUFFER GrowBuf
    );

typedef struct {
    GROWBUFFER ListArray;
    POOLHANDLE ListData;
} GROWLIST, *PGROWLIST;

#define GROWLIST_INIT {GROWBUF_INIT, NULL}

VOID
FreeGrowList (
    IN  PGROWLIST GrowList
    );

PBYTE
GrowListAppend (
    IN OUT  PGROWLIST GrowList,
    IN      PBYTE DataToAppend,         OPTIONAL
    IN      UINT SizeOfData
    );

PBYTE
RealGrowListAppendAddNul (
    IN OUT  PGROWLIST GrowList,
    IN      PBYTE DataToAppend,         OPTIONAL
    IN      UINT SizeOfData
    );

#define GrowListAppendAddNul(list,data,size)    RealGrowListAppendAddNul (list,data,size)

PBYTE
GrowListGetItem (
    IN      PGROWLIST GrowList,
    IN      UINT Index
    );

UINT
GrowListGetSize (
    IN      PGROWLIST GrowList
    );


PWSTR
GetEndOfStringW (
    PCWSTR p
    );

PWSTR
StringCopyABW (
    OUT     PWSTR Buf,
    IN      PCWSTR a,
    IN      PCWSTR b
    );

UINT
SizeOfStringW (
    PCWSTR str
    );


__inline
PCWSTR
RealGrowListAppendStringABW (
    IN OUT  PGROWLIST GrowList,
    IN      PCWSTR String,
    IN      PCWSTR End
    )
{
    return (PCWSTR) GrowListAppendAddNul (
                        GrowList,
                        (PBYTE) String,
                        String < End ? (UINT)((PBYTE) End - (PBYTE) String) : 0
                        );
}

#define GrowListAppendStringABW(list,a,b) RealGrowListAppendStringABW(list,a,b)

#define GrowListAppendStringW(list,str) GrowListAppendStringABW(list,str,GetEndOfStringW(str))
#define GrowListAppendStringNW(list,str,len) GrowListAppendStringABW(list,str,CharCountToPointerW(str,len))
#define GrowListGetStringW(list,index) (PCWSTR)(GrowListGetItem(list,index))

#define GrowListAppendEmptyItem(list)           GrowListAppend (list,NULL,0)

#ifdef UNICODE

#define GrowListAppendString GrowListAppendStringW
#define GrowListAppendStringAB GrowListAppendStringABW
#define GrowListAppendStringN GrowListAppendStringNW
#define GrowListGetString GrowListGetStringW

#endif