/*
 * $History: DK2WIN32.H $
 * 
 * *****************  Version 1  *****************
 * User: Alun         Date: 1/07/99    Time: 11:31
 * Created in $/DK2/Software/C Drivers/Windows/API/DLL/DK2Win32
 * Initial version added to Source Safe version control
 */
#ifdef __cplusplus
extern "C"
 {
#endif

/////////////////////////////////////////////////////////////////
// Error Codes
//
// All codes are returned from DK2GetLastError and can be formated
// into a message string by calling DK2FormatError

/////////////////////////////////////////////////////////////////
// DK2ERR_SUCCESS
//
// The command was successfull

#define DK2ERR_SUCCESS                 0x0000


/////////////////////////////////////////////////////////////////
// DK2ERR_TOOMANUUSERS
//
// One or mode DK2 network servers were found but they were all 
// full.

#define DK2ERR_TOOMANYUSERS            0x0001

/////////////////////////////////////////////////////////////////
// DK2ERR_ACCESS_DENIED
//
// A DK2 network servers were found but access was denied, either
// due to user restrictions, or invalid login memory.
// See FindDK2Ex

#define DK2ERR_ACCESS_DENIED           0x0002


/////////////////////////////////////////////////////////////////
// DK2ERR_DESKEY_NOTFOUND
//
// A DK2 command failed because a DK2 was not found, either 
// locally or accross the network

#define DK2ERR_DESKEY_NOTFOUND         0x0003

/////////////////////////////////////////////////////////////////
// DK2ERR_NORESPONSE
//
// A DK2 oommand to a server failed becase the server did not 
// respond.

#define DK2ERR_NORESPONSE              0x0004

/////////////////////////////////////////////////////////////////
// DK2ERR_NOSERVERS
//
// The drivers searched for a DK2 a network server, but none were
// found.

#define DK2ERR_NOSERVERS               0x0005

/////////////////////////////////////////////////////////////////
// DK2ERR_DRIVERNOTINSTALLED
//
// The DK2 drivers are not installed

#define DK2ERR_DRIVERNOTINSTALLED      0x0006

/////////////////////////////////////////////////////////////////
// DK2ERR_COMMANDNOTSUPPORTED
//
// The DK2 does not support the requested command   

#define DK2ERR_COMMANDNOTSUPPORTED     0x0007

/////////////////////////////////////////////////////////////////
// DK2ERR_ALREADYNETWORK
//
// A local DK2 command failed because there is a server runnning
// the command must be carried out over the network.

#define DK2ERR_ALREADYNETWORK          0x1001

/////////////////////////////////////////////////////////////////
// DK2ERR_COMMANDNOTNETWORK
//
// A DK2 command failed because the command cannot operate over
// the network

#define DK2ERR_COMMANDNOTNETWORK       0x1002

/////////////////////////////////////////////////////////////////
// DK2ERR_TOOMANYPROGS
//
// The maximum possible programs using the DK2 drivers has been
// reached

#define DK2ERR_TOOMANYPROGS            0x1004

/////////////////////////////////////////////////////////////////
// DK2ERR_BADOS
//
// The DK2 command will not function on the current operating system

#define DK2ERR_BADOS                   0x1005

/////////////////////////////////////////////////////////////////
// DK2ERR_NETWORKONLY
//
// The DK2 command failed because it can only be performed across
// the network and a local connection was specified

#define DK2ERR_NETWORKONLY             0x1006

/////////////////////////////////////////////////////////////////
// DK2ERR_CANCELLED
//
// Returned the GDI/ECP Window is cancelled

#define DK2ERR_CANCELLED               0x1007

/////////////////////////////////////////////////////////////////
// DK2ERR_FAILURE
//
// The command failed due to an error comunicating with the protocol

#define DK2ERR_FAILURE                 0x8000

////////////////////////////////////////////////////////////////
// DK2ERR_PROTOCOLFAILURE
//
// The DK2 command faied due to a problem in the protocol

#define DK2ERR_PROTOCOLFAILURE         0x8001

////////////////////////////////////////////////////////////////
// DK2ERR_BADPARAMETER
//
// The DK2 command failed due to an invalid parameter passed to the 
// function

#define DK2ERR_BADPARAMETER            0x8002

////////////////////////////////////////////////////////////////
// DK2ERR_NOMEMORY
//
// The DK2 command failed because the function could not allocate
// enough memory

#define DK2ERR_NOMEMORY                0x8003

////////////////////////////////////////////////////////////////
// DK2ERR_STARTPROTOCOL
//
// The DK2 command failed because the current protocol did not
// start

#define DK2ERR_STARTPROTOCOL           0x8004

////////////////////////////////////////////////////////////////
// DK2ERR_NOPROTOCOL
//
// The DK2 command failed be cause the current protocol does not
// exist or is not loaded
 
#define DK2ERR_NOPROTOCOL              0x8005

////////////////////////////////////////////////////////////////
// DK2ERR_NOSERVERMEMORY
//
// The DK2 command failed because the server could not allocate
// enough memory

#define DK2ERR_NOSERVERMEMORY          0x8006

////////////////////////////////////////////////////////////////
// DK2ERR_INVALIDCONNECTION
//
// The DK2 command failed because the specified connection is
// invalid

#define DK2ERR_INVALIDCONNECTION       0x8007


////////////////////////////////////////////////////////////////
// Structures
////////////////////////////////////////////////////////////////

#pragma pack( 1 )

#define DK2MEMORYMAP
typedef struct _tDK2Memory
{
    WORD  wAddress;
    WORD  wSeed;
    WORD  wCount;
    LPSTR lpBytes;
    WORD  wModule;
} DK2MEMORY, FAR *LPDK2MEMORY;

typedef struct _tDateTime
{
    WORD wDay;
    WORD wMonth;
    WORD wYear;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} DATETIME, *NPDATETIME, FAR *LPDATETIME;

#pragma pack()


////////////////////////////////////////////////////////////////
// DK2 Functions
////////////////////////////////////////////////////////////////

BOOL APIENTRY DK2DriverInstalled( void );

WORD APIENTRY FindDK2( LPSTR Id, LPSTR PKey );

WORD APIENTRY FindDK2Ex( LPSTR Id, LPSTR PKey, LPDK2MEMORY lpDK2Memory );

WORD APIENTRY FindDK2ExP( LPSTR Id, LPSTR PKey, WORD Address, WORD Seed, WORD Count, LPSTR Bytes, WORD Module );

void APIENTRY DK2LogoutFromServer( WORD DataReg );

WORD APIENTRY DK2FindLPTPort( WORD Port );

WORD APIENTRY DK2GetDelayTime ( void );

void APIENTRY DK2SetDelayTime( WORD Delay );

void APIENTRY DK2ReadRandomNumbers( WORD  DataReg,
                    LPSTR Id,
                    WORD  Seed,
                    LPSTR Buffer,
                    WORD  BytesToRead );

void APIENTRY DK2ThroughEncryption( WORD  DataReg,
                    LPSTR Id,
                    WORD  Seed,
                    LPSTR Buffer,
                    WORD  BytesToEncrypt );


void APIENTRY DK2ReadMemory( WORD  DataReg,
                 LPSTR Id,
                 WORD  Seed,
                 WORD  Address,
                 LPSTR Buffer,
                 WORD  BytesToRead );

void APIENTRY DK2WriteMemory( WORD  DataReg,
                  LPSTR Id,
                  WORD  Seed,
                  WORD  Address,
                  LPSTR Buffer,
                  WORD  BytesToWrite,
                  LPSTR Password );

void APIENTRY DK2ReadDownCounter( WORD  DataReg,
                  LPSTR Id,
                  DWORD *DownCounter );


void APIENTRY DK2DecrementDownCounter( WORD  DataReg,
                       LPSTR Id );

BOOL APIENTRY DK2RegisterModule( WORD  DataReg, WORD wModule );

BOOL APIENTRY DK2UnregisterModule( WORD  DataReg, WORD wModule );

void APIENTRY DK2RestartDownCounter( WORD  DataReg,
                     LPSTR Id,
                     DWORD NewCounter,
                     LPSTR Password );

void APIENTRY DK2ReadDUSN( WORD   DataReg,
                           LPSTR  Id,
                           LPSTR  Password,
                           LPWORD SecCount,
                           LPSTR  DUSN );

void APIENTRY DK2SendAlgorithmString( WORD  DataReg,
                      LPSTR Id,
                      WORD  Iteration1,
                      WORD  Iteration2,
                      LPSTR Buffer1,
                      LPSTR Buffer2 );

void APIENTRY DK2SendAlgorithmBuffer( WORD  DataReg,
                      LPSTR Id,
                      LPWORD Iteration,
                      LPSTR Buffer,
                      WORD  BufferCount );

void APIENTRY DK2SendAndReceive( WORD DataReg, LPSTR Id, LPSTR lpFirst, WORD wFirst, LPSTR lpSend, WORD wSend, LPSTR lpReceive, WORD wReceive, WORD wCount );

BOOL APIENTRY DK2Success( void );

void APIENTRY DK2AllowChangeInterrupts( WORD Change );

WORD APIENTRY DK2DetectSpeed( WORD  DataReg,
                  LPSTR Id );

WORD APIENTRY DK2SubDetectSpeed( WORD  DataReg,
                 LPSTR Id,
                 LPSTR PKey,
                 LPSTR Bytes );

////////////////////////////////////////////////////////////////
// time function
void APIENTRY DK2GetSystemTime( WORD DateReg, LPSTR Id, LPDATETIME lpDateTime );

////////////////////////////////////////////////////////////////
// DK2 Flags 

#define DK2_BITRONICS      0x00000001
#define DK2_HASBITRONICS   0x00000002

DWORD APIENTRY DK2GetFlags ( WORD DataReg,
                 LPSTR Id );

VOID APIENTRY DK2SetFlags ( WORD  DataReg,
                LPSTR Id,
                DWORD Flags );

////////////////////////////////////////////////////////////////

WORD APIENTRY DK2Encode( LPSTR lpszData,
              WORD  cbData,
              LPSTR lpszEncode,
              WORD  cbEncode );

WORD APIENTRY DK2Decode( LPSTR lpszData,
              LPSTR lpszDecode );

////////////////////////////////////////////////////////////////
// DK2 Access Flags - Override Searching Network or Local

#define DNET_NETWORK            0x0001
#define DNET_LOCAL              0x0002

void APIENTRY DK2SetAccessFlags( WORD wFlags );

////////////////////////////////////////////////////////////////

DWORD APIENTRY DK2GetLastError( void );

void APIENTRY DK2FormatError( DWORD Error, LPSTR ErrorString, int MaxLen  );

WORD APIENTRY DK2GetServerName( WORD DataReg, LPSTR lpszServerName, LPSTR lpszComputerName );

#ifdef __cplusplus
 }
#endif