#ifndef VXD
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windef.h>
#include <winbase.h>
#include <netconp.h>

#include <assert.h>
#include <stdio.h>

#include <winsock.h>
#include <wsahelp.h>
#include <nb30.h>
#include <nbtioctl.h>

//#include "../../tcpip/commands/common/tcpcmd.h"


#else
#include "vxdonly.h"
#endif

#define PROTODB_SIZE    (_MAX_PATH + 10)
#define SERVDB_SIZE     (_MAX_PATH + 10)


#define MAX_FAST_TDI_ADDRESS 32


#define TDI_QUERY_PURGE_CACHE       97
#define TDI_QUERY_CONNECTION_LIST   98
#define TDI_QUERY_CACHE_STATUS      99
#define TDI_DHCP_TEST              133
#define TDI_BCAST_RESOLVED_NAMES   134
#define NETBIOS_NAME_SIZE 16

/*
 *  Display Modes.
 */
#define ADAPTERSTATUS            0x0001
#define ADAPTERSTATUSIP          0x0002
#define BCAST                    0x0004
#define CACHE                    0x0008
#define CONNECTION               0x0010
#define CONNECTION_ALL           0x0020
#define CONNECTION_WITH_IP       0x0040
#define CONNECTION_WITH_IP_ALL   0x0080
#define DHCP                     0x0100
#define NAMES                    0x0200
#define NAMES_ALL                0x0400
#define NAME_RELEASE_REFRESH     0x0800  // not really a display mode
#define RESYNC                   0x1000  // not really a display mode

//
enum eSTATE
{
    NBT_RECONNECTING,      // waiting for the worker thread to run NbtConnect
    NBT_IDLE,              // not Transport connection
    NBT_ASSOCIATED,        // associated with an address element
    NBT_CONNECTING,        // establishing Transport connection
    NBT_SESSION_INBOUND,   // waiting for a session request after tcp connection setup inbound
    NBT_SESSION_WAITACCEPT, // waiting for accept after a listen has been satisfied
    NBT_SESSION_OUTBOUND,  // waiting for a session response after tcp connection setup
    NBT_SESSION_UP,        // got positive response
    NBT_DISCONNECTING,     // sent a disconnect down to Tcp, but it hasn't completed yet
    NBT_DISCONNECTED      // a session has been disconnected but not closed with TCP yet
};
//
// These are other states for connections that are not explicitly used by
// NBT but are returned on the NbtQueryConnectionList call.
//
#define LISTENING   20
#define UNBOUND     21
#if 0
struct {
    long        TdiError;
    NTSTATUS    UnixError;
} UnixErrorMap[] = {
    {STATUS_INVALID_PARAMETER,EINVAL},
    {STATUS_INVALID_NETWORK_RESPONSE,ENETDOWN},
    {STATUS_INVALID_NETWORK_RESPONSE,ENODEV},
    {STATUS_INVALID_NETWORK_RESPONSE,ENXIO},
    {STATUS_NETWORK_BUSY,EBUSY},
    {STATUS_INSUFFICIENT_RESOURCES,ENOSR},
    {STATUS_ACCESS_DENIED,EACCES},
    {STATUS_LINK_FAILED,ECONNRESET},
    {STATUS_REMOTE_NOT_LISTENING,ECONNREFUSED},
    {STATUS_IO_TIMEOUT,ETIMEDOUT},
    {STATUS_BAD_NETWORK_PATH,ENETUNREACH},
    {STATUS_BAD_NETWORK_PATH,EHOSTUNREACH},
    {0,0}
};
#endif

//
// The format of Adapter Status responses
//
typedef struct
{
    ADAPTER_STATUS AdapterInfo;
    NAME_BUFFER    Names[32];
} tADAPTERSTATUS;


//              1234567890123456
#define SPACES "                "
#define ClearNcb( PNCB ) {                                          \
    RtlZeroMemory( PNCB , sizeof (NCB) );                           \
    RtlMoveMemory( (PNCB)->ncb_name,     SPACES, sizeof(SPACES)-1 );\
    RtlMoveMemory( (PNCB)->ncb_callname, SPACES, sizeof(SPACES)-1 );\
    }

//
// the defines that do the right thing
//
NTSTATUS
DeviceIoCtrl(
    IN HANDLE           fd,
    IN PVOID            ReturnBuffer,
    IN ULONG            BufferSize,
    IN ULONG            Ioctl,
    IN PVOID            pInput,
    IN ULONG            SizeInput
    );

#define CALL_DRIVER     DeviceIoCtrl


//----------------------------------------------------------------------
//
//  Function Prototypes
//

typedef struct
{
    ADAPTER_STATUS AdapterInfo;
    tREMOTE_CACHE  Names[32];
} tREMOTE;

NTSTATUS
ReadRegistry(
    IN PUCHAR  pScope
    );

NTSTATUS
GetInterfaceList(
    );

HANDLE
OpenNbt(
    IN  ULONG   Index
    );

VOID
PrintKorM(
    IN PVOID    pBytesIn
    );

NTSTATUS
GetNames(
    IN HANDLE   fd,
    IN LONG     WhichNames
    );
NTSTATUS
GetConnections(
    IN HANDLE   fd,
    IN LONG     Display
    );
NTSTATUS
Resync(
    IN HANDLE   fd
    );

NTSTATUS
ReleaseNamesThenRefresh(
    IN HANDLE   fd
    );

PCHAR
gethost(ULONG addr,
        BOOLEAN Convert);

NTSTATUS
GetBcastResolvedNames(
    IN HANDLE   fd
    );

NTSTATUS
Dhcp(
    IN HANDLE   fd
    );

VOID
FormattedDump(
    PCHAR far_p,
    LONG  len
    );
VOID
HexDumpLine(
    PCHAR       pch,
    ULONG       len,
    PCHAR       s,
    PCHAR       t
    );
NTSTATUS
AdapterStatus(
    IN HANDLE   fd,
    IN PCHAR    RemoteName
    );

NTSTATUS
AdapterStatusIpAddr(
    IN HANDLE   fd,
    IN PCHAR    RemoteName,
    IN LONG    Display
    );

NTSTATUS
GetIpAddress(
    IN HANDLE           fd,
    OUT PULONG          pIpAddress
    );