/*++

Copyright (c) 1989-1999  Microsoft Corporation

Module Name:

    smbmrx.h

Abstract:

    This module includes all SMB smaple mini redirector definitions shared
    between the control utility, network provider DLL and the mini redirector

Notes:

    This module has been built and tested only in UNICODE environment

--*/

#ifndef _SMBMRX_H_
#define _SMBMRX_H_

// This file contains all the definitions that are shared across the multiple
// components that constitute the mini rdr -- the mini redirector driver,
// the net provider dll and the utility.


// The sample net provider id. This needs to be unique and
// should not be the same as any other network provider id.
#ifndef WNNC_NET_RDR2_SAMPLE
#define WNNC_NET_RDR2_SAMPLE 0x00250000
#endif



#define SMBMRX_DEVICE_NAME_U L"SmbSampleMiniRedirector"
#define SMBMRX_DEVICE_NAME_A "SmbSampleMiniRedirector"

#ifdef UNICODE
#define SMBMRX_DEVICE_NAME SMBMRX_DEVICE_NAME_U
#else
#define SMBMRX_DEVICE_NAME SMBMRX_DEVICE_NAME_A
#endif

// The following constant defines the length of the above name.

#define SMBMRX_DEVICE_NAME_A_LENGTH (24)

#define SMBMRX_PROVIDER_NAME_U L"SMB Sample Redirector Network"
#define SMBMRX_PROVIDER_NAME_A "SMB Sample Redirector Network"

#ifdef UNICODE
#define SMBMRX_PROVIDER_NAME SMBMRX_PROVIDER_NAME_U
#else
#define SMBMRX_PROVIDER_NAME SMBMRX_PROVIDER_NAME_A
#endif

// The following constant defines the length of the above name.

#define DD_SMBMRX_FS_DEVICE_NAME_U L"\\Device\\SmbSampleMiniRedirector"
#define DD_SMBMRX_FS_DEVICE_NAME_A "\\Device\\SmbSampleMiniRedirector"

#ifdef UNICODE
#define DD_SMBMRX_FS_DEVICE_NAME    DD_SMBMRX_FS_DEVICE_NAME_U
#else
#define DD_SMBMRX_FS_DEVICE_NAME    DD_SMBMRX_FS_DEVICE_NAME_A
#endif


#define SMBMRX_MINIRDR_PARAMETERS \
    L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\SmbMRx\\Parameters"
//
//  The Devicename string required to access the mini-redirector device from
//  User Mode
//
//  WARNING The next two strings must be kept in sync. Change one and you must change the
//  other. These strings have been chosen such that they are unlikely to
//  coincide with names of other drivers.
//
#define DD_SMBMRX_USERMODE_SHADOW_DEV_NAME_U    L"\\??\\SmbMiniRdrDCN"

#define DD_SMBMRX_USERMODE_DEV_NAME_U   L"\\\\.\\SmbMiniRdrDCN"
#define DD_SMBMRX_USERMODE_DEV_NAME_A   "\\\\.\\SmbMiniRdrDCN"

#ifdef UNICODE
#define DD_SMBMRX_USERMODE_DEV_NAME     DD_SMBMRX_USERMODE_DEV_NAME_U
#else
#define DD_SMBMRX_USERMODE_DEV_NAME     DD_SMBMRX_USERMODE_DEV_NAME_A
#endif

// UM code use devioclt.h

// BEGIN WARNING WARNING WARNING WARNING
//  The following are from the ddk include files and cannot be changed

//#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 // from ddk\inc\ntddk.h

//#define METHOD_BUFFERED 0

//#define FILE_ANY_ACCESS 0

// END WARNING WARNING WARNING WARNING

#define IOCTL_RDR_BASE FILE_DEVICE_NETWORK_FILE_SYSTEM

#define _RDR_CONTROL_CODE(request, method, access) \
                CTL_CODE(IOCTL_RDR_BASE, request, method, access)

#define IOCTL_SMBMRX_START      _RDR_CONTROL_CODE(100, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_SMBMRX_STOP       _RDR_CONTROL_CODE(101, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_SMBMRX_GETSTATE   _RDR_CONTROL_CODE(102, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_SMBMRX_ADDCONN    _RDR_CONTROL_CODE(125, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SMBMRX_DELCONN    _RDR_CONTROL_CODE(126, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define SMBMRXNP_MAX_DEVICES (26)

typedef struct _SMBMRX_CONNECTINFO_
{
    DWORD   ConnectionNameOffset;
    DWORD   ConnectionNameLength;
    DWORD   EaDataOffset;
    DWORD   EaDataLength;
    BYTE    InfoArea[1];

} SMBMRX_CONNECTINFO, *PSMBMRX_CONNECTINFO;

// The NP Dll updates a shared memory data structure to reflect the various
// drive mappings established from the various process. This shared memory
// is used in maintaining the data structures required for enumeration as
// well.

typedef struct _SMBMRXNP_NETRESOURCE_
{
    BOOL     InUse;
    USHORT   LocalNameLength;
    USHORT   RemoteNameLength;
    USHORT   ConnectionNameLength;
    DWORD    dwScope;
    DWORD    dwType;
    DWORD    dwDisplayType;
    DWORD    dwUsage;
    WCHAR    LocalName[MAX_PATH];
    WCHAR    RemoteName[MAX_PATH];
    WCHAR    ConnectionName[MAX_PATH];
    WCHAR    UserName[MAX_PATH];
    WCHAR    Password[MAX_PATH];

} SMBMRXNP_NETRESOURCE, *PSMBMRXNP_NETRESOURCE;

typedef struct _SMBMRXNP_SHARED_MEMORY_
{
    INT                     HighestIndexInUse;
    INT                     NumberOfResourcesInUse;
    SMBMRXNP_NETRESOURCE    NetResources[SMBMRXNP_MAX_DEVICES];

} SMBMRXNP_SHARED_MEMORY, *PSMBMRXNP_SHARED_MEMORY;

#define SMBMRXNP_SHARED_MEMORY_NAME L"SMBMRXNPMEMORY"

#define SMBMRXNP_MUTEX_NAME         L"SMBMRXNPMUTEX"


#define RDR_NULL_STATE  0
#define RDR_UNLOADED    1
#define RDR_UNLOADING   2
#define RDR_LOADING     3
#define RDR_LOADED      4
#define RDR_STOPPED     5
#define RDR_STOPPING    6
#define RDR_STARTING    7
#define RDR_STARTED     8

#ifndef min
#define min(a, b)        ((a) > (b) ? (b) : (a))
#endif


#endif // _SMBMRX_H_