/*++

Copyright (c) 1998-1999  Microsoft Corporation

Module Name:

    rasmontr.h

Abstract:
    This file contains definitions which are needed by RASMONTR.DLL
    and all NetSh helper DLLs which register under it.

--*/


#ifndef _RASMONTR_H_
#define _RASMONTR_H_

#if _MSC_VER > 1000
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

// {0705ECA2-7AAC-11d2-89DC-006008B0E5B9}
#define RASMONTR_GUID \
{ 0x705eca2, 0x7aac, 0x11d2, { 0x89, 0xdc, 0x0, 0x60, 0x8, 0xb0, 0xe5, 0xb9 } }

#define RASMONTR_VERSION_50     0x0005000
#define RASMONTR_OS_BUILD_NT40  1381

//
// Enumerations for types of arguments (see RASMON_CMD_ARG)
//
#define RASMONTR_CMD_TYPE_STRING 0x1
#define RASMONTR_CMD_TYPE_ENUM   0x2
#define RASMONTR_CMD_TYPE_DWORD  0x3

// 
// Macros to operate on RASMON_CMD_ARG's
//
#define RASMON_CMD_ARG_Present(pArg)    \
    ((pArg)->rgTag.bPresent) 
    
#define RASMON_CMD_ARG_GetPsz(pArg)     \
    (((pArg)->rgTag.bPresent) ? (pArg)->Val.pszValue : NULL)

#define RASMON_CMD_ARG_GetEnum(pArg)     \
    (((pArg)->rgTag.bPresent) ? (pArg)->Val.dwValue : 0)

#define RASMON_CMD_ARG_GetDword(pArg)     \
    (((pArg)->rgTag.bPresent) ? (pArg)->Val.dwValue : 0)

// 
// Structure defining a command line argument
//
typedef struct _RASMON_CMD_ARG
{
    IN  DWORD dwType;           // RASMONTR_CMD_TYPE_*
    IN  TAG_TYPE rgTag;         // The tag for this command
    IN  TOKEN_VALUE* rgEnums;   // The enumerations for this arg
    IN  DWORD dwEnumCount;      // Count of enums
    union
    {
        OUT PWCHAR pszValue;        // Valid only for RASMONTR_CMD_TYPE_STRING
        OUT DWORD dwValue;          // Valid only for RASMONTR_CMD_TYPE_ENUM
    } Val;        
    
} RASMON_CMD_ARG, *PRASMON_CMD_ARG;

//
// Api's that rasmontr requires of its helpers
//
typedef
DWORD
(WINAPI RAS_CONTEXT_ENTRY_FN)(
    IN      LPCWSTR              pszServer,
    IN      DWORD                dwBuild,
    IN OUT  LPWSTR               *pptcArguments,
    IN      DWORD                dwArgCount,
    IN      DWORD                dwFlags,
    OUT     PWCHAR               pwcNewContext
    );
typedef RAS_CONTEXT_ENTRY_FN *PRAS_CONTEXT_ENTRY_FN;

// Defines information that describes a server
//
typedef struct _RASMON_SERVERINFO
{
    // Common to all
    //
    PWCHAR pszServer;
    DWORD  dwBuild;

    // Used by user commands
    HANDLE hServer;
    ULONG ulUserInitStarted;
    ULONG ulUserInitCompleted;

    HKEY hkMachine;

} RASMON_SERVERINFO;

//
// Api's that rasmontr exposes to its helpers
//

PVOID WINAPI
RutlAlloc(
    IN DWORD dwBytes,
    IN BOOL bZero
    );

VOID WINAPI
RutlFree(
    IN PVOID pvData
    );

PWCHAR WINAPI
RutlStrDup(
    IN LPCWSTR pwszSrc
    );

LPDWORD WINAPI
RutlDwordDup(
    IN DWORD dwSrc
    );

DWORD WINAPI
RutlCreateDumpFile(
    IN  LPCWSTR pwszName,
    OUT PHANDLE phFile
    );

VOID WINAPI
RutlCloseDumpFile(
    HANDLE  hFile
    );

DWORD WINAPI
RutlGetOsVersion(
    IN OUT  RASMON_SERVERINFO *pServerInfo
    );
    
DWORD WINAPI
RutlGetTagToken(
    IN      HANDLE      hModule,
    IN OUT  LPWSTR     *ppwcArguments,
    IN      DWORD       dwCurrentIndex,
    IN      DWORD       dwArgCount,
    IN      PTAG_TYPE   pttTagToken,
    IN      DWORD       dwNumTags,
    OUT     PDWORD      pdwOut
    );

DWORD WINAPI
RutlParse(
    IN OUT  LPWSTR         *ppwcArguments,
    IN      DWORD           dwCurrentIndex,
    IN      DWORD           dwArgCount,
    IN      BOOL*           pbDone,
    OUT     RASMON_CMD_ARG* pRasArgs,
    IN      DWORD           dwRasArgCount);

BOOL WINAPI
RutlIsHelpToken(
    PWCHAR  pwszToken
    );

PWCHAR WINAPI
RutlAssignmentFromTokens(
    IN HINSTANCE hModule,
    IN LPCWSTR pwszTokenTkn,
    IN LPCWSTR pwszTokenCmd);

PWCHAR WINAPI
RutlAssignmentFromTokenAndDword(
    IN HINSTANCE hModule,
    IN LPCWSTR pwszToken,
    IN DWORD dwDword,
    IN DWORD dwRadius);
    
#ifdef __cplusplus
}
#endif

#endif // _RASMONTR_H_