#ifndef _WINSNMP_H
#define _WINSNMP_H

/* Windows SNMP definitions */

#include <windows.h>
#include <limits.h>

#ifdef __cplusplus
extern "C" {
#endif

#define ASN_UNIVERSAL  (0x00)
#define ASN_APPLICATION  (0x40)
#define ASN_CONTEXT  (0x80)
#define ASN_PRIVATE  (0xC0)
#define ASN_PRIMITIVE  (0x00)
#define ASN_CONSTRUCTOR  (0x20)

#define SNMP_SYNTAX_SEQUENCE  (ASN_UNIVERSAL|ASN_CONSTRUCTOR|0x10)
#define SNMP_SYNTAX_INT  (ASN_UNIVERSAL|ASN_PRIMITIVE|0x02)
#define SNMP_SYNTAX_BITS  (ASN_UNIVERSAL|ASN_PRIMITIVE|0x03)
#define SNMP_SYNTAX_OCTETS  (ASN_UNIVERSAL|ASN_PRIMITIVE|0x04)
#define SNMP_SYNTAX_NULL  (ASN_UNIVERSAL|ASN_PRIMITIVE|0x05)
#define SNMP_SYNTAX_OID  (ASN_UNIVERSAL|ASN_PRIMITIVE|0x06)
#define SNMP_SYNTAX_INT32  SNMP_SYNTAX_INT
#define SNMP_SYNTAX_IPADDR  (ASN_APPLICATION|ASN_PRIMITIVE|0x00)
#define SNMP_SYNTAX_CNTR32  (ASN_APPLICATION|ASN_PRIMITIVE|0x01)
#define SNMP_SYNTAX_GAUGE32  (ASN_APPLICATION|ASN_PRIMITIVE|0x02)
#define SNMP_SYNTAX_TIMETICKS  (ASN_APPLICATION|ASN_PRIMITIVE|0x03)
#define SNMP_SYNTAX_OPAQUE  (ASN_APPLICATION|ASN_PRIMITIVE|0x04)
#define SNMP_SYNTAX_NSAPADDR  (ASN_APPLICATION|ASN_PRIMITIVE|0x05)
#define SNMP_SYNTAX_CNTR64  (ASN_APPLICATION|ASN_PRIMITIVE|0x06)
#define SNMP_SYNTAX_UINT32  (ASN_APPLICATION|ASN_PRIMITIVE|0x07)
#define SNMP_SYNTAX_NOSUCHOBJECT  (ASN_CONTEXT|ASN_PRIMITIVE|0x00)
#define SNMP_SYNTAX_NOSUCHINSTANCE  (ASN_CONTEXT|ASN_PRIMITIVE|0x01)
#define SNMP_SYNTAX_ENDOFMIBVIEW  (ASN_CONTEXT|ASN_PRIMITIVE|0x02)

#define MAXOBJIDSIZE  128
#define MAXOBJIDSTRSIZE  1408

#define SNMP_PDU_GET  (ASN_CONTEXT|ASN_CONSTRUCTOR|0x0)
#define SNMP_PDU_GETNEXT  (ASN_CONTEXT|ASN_CONSTRUCTOR|0x1)
#define SNMP_PDU_RESPONSE  (ASN_CONTEXT|ASN_CONSTRUCTOR|0x2)
#define SNMP_PDU_SET  (ASN_CONTEXT|ASN_CONSTRUCTOR|0x3)
#define SNMP_PDU_V1TRAP  (ASN_CONTEXT|ASN_CONSTRUCTOR|0x4)
#define SNMP_PDU_GETBULK  (ASN_CONTEXT|ASN_CONSTRUCTOR|0x5)
#define SNMP_PDU_INFORM  (ASN_CONTEXT|ASN_CONSTRUCTOR|0x6)
#define SNMP_PDU_TRAP  (ASN_CONTEXT|ASN_CONSTRUCTOR|0x7)

#define SNMP_TRAP_COLDSTART  0
#define SNMP_TRAP_WARMSTART  1
#define SNMP_TRAP_LINKDOWN  2
#define SNMP_TRAP_LINKUP  3
#define SNMP_TRAP_AUTHFAIL  4
#define SNMP_TRAP_EGPNEIGHBORLOSS  5
#define SNMP_TRAP_ENTERPRISESPECIFIC  6

#define SNMP_ERROR_NOERROR  0
#define SNMP_ERROR_TOOBIG  1
#define SNMP_ERROR_NOSUCHNAME  2
#define SNMP_ERROR_BADVALUE  3
#define SNMP_ERROR_READONLY  4
#define SNMP_ERROR_GENERR  5
#define SNMP_ERROR_NOACCESS  6
#define SNMP_ERROR_WRONGTYPE  7
#define SNMP_ERROR_WRONGLENGTH  8
#define SNMP_ERROR_WRONGENCODING  9
#define SNMP_ERROR_WRONGVALUE  10
#define SNMP_ERROR_NOCREATION  11
#define SNMP_ERROR_INCONSISTENTVALUE  12
#define SNMP_ERROR_RESOURCEUNAVAILABLE  13
#define SNMP_ERROR_COMMITFAILED  14
#define SNMP_ERROR_UNDOFAILED  15
#define SNMP_ERROR_AUTHORIZATIONERROR  16
#define SNMP_ERROR_NOTWRITABLE  17
#define SNMP_ERROR_INCONSISTENTNAME  18

#define SNMPAPI_TRANSLATED  0
#define SNMPAPI_UNTRANSLATED_V1  1
#define SNMPAPI_UNTRANSLATED_V2  2

#define SNMPAPI_NO_SUPPORT  0
#define SNMPAPI_V1_SUPPORT  1
#define SNMPAPI_V2_SUPPORT  2
#define SNMPAPI_M2M_SUPPORT  3

#define SNMPAPI_OFF  0
#define SNMPAPI_ON  1

#define SNMPAPI_FAILURE  0
#define SNMPAPI_SUCCESS  1
#define SNMPAPI_ALLOC_ERROR  2
#define SNMPAPI_CONTEXT_INVALID  3
#define SNMPAPI_CONTEXT_UNKNOWN  4
#define SNMPAPI_ENTITY_INVALID  5
#define SNMPAPI_ENTITY_UNKNOWN  6
#define SNMPAPI_INDEX_INVALID  7
#define SNMPAPI_NOOP  8
#define SNMPAPI_OID_INVALID  9
#define SNMPAPI_OPERATION_INVALID  10
#define SNMPAPI_OUTPUT_TRUNCATED  11
#define SNMPAPI_PDU_INVALID  12
#define SNMPAPI_SESSION_INVALID  13
#define SNMPAPI_SYNTAX_INVALID  14
#define SNMPAPI_VBL_INVALID  15
#define SNMPAPI_MODE_INVALID  16
#define SNMPAPI_SIZE_INVALID  17
#define SNMPAPI_NOT_INITIALIZED  18
#define SNMPAPI_MESSAGE_INVALID  19
#define SNMPAPI_HWND_INVALID  20
#define SNMPAPI_OTHER_ERROR  99
#define SNMPAPI_TL_NOT_INITIALIZED  100
#define SNMPAPI_TL_NOT_SUPPORTED  101
#define SNMPAPI_TL_NOT_AVAILABLE  102
#define SNMPAPI_TL_RESOURCE_ERROR  103
#define SNMPAPI_TL_UNDELIVERABLE  104
#define SNMPAPI_TL_SRC_INVALID  105
#define SNMPAPI_TL_INVALID_PARAM  106
#define SNMPAPI_TL_IN_USE  107
#define SNMPAPI_TL_TIMEOUT  108
#define SNMPAPI_TL_PDU_TOO_BIG  109
#define SNMPAPI_TL_OTHER  199

typedef HANDLE HSNMP_SESSION, *LPHSNMP_SESSION;
typedef HANDLE HSNMP_ENTITY, *LPHSNMP_ENTITY;
typedef HANDLE HSNMP_CONTEXT, *LPHSNMP_CONTEXT;
typedef HANDLE HSNMP_PDU, *LPHSNMP_PDU;
typedef HANDLE HSNMP_VBL, *LPHSNMP_VBL;
typedef unsigned char smiBYTE, *smiLPBYTE;
#if ULONG_MAX == 4294967295U
typedef signed long smiINT, *smiLPINT;
typedef smiINT smiINT32, *smiLPINT32;
typedef unsigned long smiUINT32, *smiLPUINT32;
#elif UINT_MAX == 4294967295U
typedef int smiINT, *smiLPINT;
typedef smiINT smiINT32, *smiLPINT32;
typedef unsigned int smiUINT32, *smiLPUINT32;
#else
#error can not define smiINT and smiUINT
#endif
typedef smiUINT32 SNMPAPI_STATUS;
typedef struct {
    smiUINT32 len;
    smiLPBYTE ptr;
} smiOCTETS, *smiLPOCTETS;
typedef const smiOCTETS *smiLPCOCTETS;
typedef smiOCTETS smiBITS, *smiLPBITS;
typedef struct {
    smiUINT32 len;
    smiLPUINT32 ptr;
} smiOID, *smiLPOID;
typedef const smiOID *smiLPCOID;
typedef smiOCTETS smiIPADDR, *smiLPIPADDR;
typedef smiUINT32 smiCNTR32, *smiLPCNTR32;
typedef smiUINT32 smiGAUGE32, *smiLPGAUGE32;
typedef smiUINT32 smiTIMETICKS, *smiLPTIMETICKS;
typedef smiOCTETS smiOPAQUE, *smiLPOPAQUE;
typedef smiOCTETS smiNSAPADDR, *smiLPNSAPADDR;
typedef struct {
    smiUINT32 hipart;
    smiUINT32 lopart;
} smiCNTR64, *smiLPCNTR64;

typedef struct {
    smiUINT32 syntax;
    union {
        smiINT sNumber;
        smiUINT32 uNumber;
        smiCNTR64 hNumber;
        smiOCTETS string;
        smiOID oid;
        smiBYTE empty;
    } value;
} smiVALUE, *smiLPVALUE;
typedef const smiVALUE *smiLPCVALUE;

#define SNMPAPI_CALL WINAPI

#define MAXVENDORINFO 32
typedef struct {
    char vendorName[MAXVENDORINFO*2];
    char vendorContact[MAXVENDORINFO*2];
    char vendorVersionId[MAXVENDORINFO];
    char vendorVersionDate[MAXVENDORINFO];
    smiUINT32 vendorEnterprise;
} smiVENDORINFO, *smiLPVENDORINFO;

typedef SNMPAPI_STATUS (CALLBACK *SNMPAPI_CALLBACK)(HSNMP_SESSION,HWND,UINT,WPARAM,LPARAM,LPVOID);

SNMPAPI_STATUS SNMPAPI_CALL SnmpGetTranslateMode(smiLPUINT32);
SNMPAPI_STATUS SNMPAPI_CALL SnmpSetTranslateMode(smiUINT32);
SNMPAPI_STATUS SNMPAPI_CALL SnmpGetRetransmitMode(smiLPUINT32);
SNMPAPI_STATUS SNMPAPI_CALL SnmpSetRetransmitMode(smiUINT32);
SNMPAPI_STATUS SNMPAPI_CALL SnmpGetTimeout(HSNMP_ENTITY,smiLPTIMETICKS,smiLPTIMETICKS);
SNMPAPI_STATUS SNMPAPI_CALL SnmpSetTimeout(HSNMP_ENTITY,smiTIMETICKS);
SNMPAPI_STATUS SNMPAPI_CALL SnmpGetRetry(HSNMP_ENTITY,smiLPUINT32,smiLPUINT32);
SNMPAPI_STATUS SNMPAPI_CALL SnmpSetRetry(HSNMP_ENTITY,smiUINT32);
SNMPAPI_STATUS SNMPAPI_CALL SnmpGetVendorInfo(smiLPVENDORINFO);
SNMPAPI_STATUS SNMPAPI_CALL SnmpStartup(smiLPUINT32,smiLPUINT32,smiLPUINT32,smiLPUINT32,smiLPUINT32);
SNMPAPI_STATUS SNMPAPI_CALL SnmpCleanup(void);
HSNMP_SESSION SNMPAPI_CALL SnmpOpen(HWND,UINT);
SNMPAPI_STATUS SNMPAPI_CALL SnmpClose(HSNMP_SESSION);
SNMPAPI_STATUS SNMPAPI_CALL SnmpSendMsg(HSNMP_SESSION,HSNMP_ENTITY,HSNMP_ENTITY,HSNMP_CONTEXT,HSNMP_PDU);
SNMPAPI_STATUS SNMPAPI_CALL SnmpRecvMsg(HSNMP_SESSION,LPHSNMP_ENTITY,LPHSNMP_ENTITY,LPHSNMP_CONTEXT,LPHSNMP_PDU);
SNMPAPI_STATUS SNMPAPI_CALL SnmpRegister(HSNMP_SESSION,HSNMP_ENTITY,HSNMP_ENTITY,HSNMP_CONTEXT,smiLPCOID,smiUINT32);
HSNMP_SESSION SNMPAPI_CALL SnmpCreateSession(HWND,UINT,SNMPAPI_CALLBACK,LPVOID);
SNMPAPI_STATUS SNMPAPI_CALL SnmpListen(HSNMP_ENTITY,SNMPAPI_STATUS);
SNMPAPI_STATUS SNMPAPI_CALL SnmpCancelMsg(HSNMP_SESSION,smiINT32);
HSNMP_ENTITY SNMPAPI_CALL SnmpStrToEntity(HSNMP_SESSION,LPCSTR);
SNMPAPI_STATUS SNMPAPI_CALL SnmpEntityToStr(HSNMP_ENTITY,smiUINT32,LPSTR);
SNMPAPI_STATUS SNMPAPI_CALL SnmpFreeEntity(HSNMP_ENTITY);
HSNMP_CONTEXT SNMPAPI_CALL SnmpStrToContext(HSNMP_SESSION,smiLPCOCTETS);
SNMPAPI_STATUS SNMPAPI_CALL SnmpContextToStr(HSNMP_CONTEXT,smiLPOCTETS);
SNMPAPI_STATUS SNMPAPI_CALL SnmpFreeContext(HSNMP_CONTEXT);
SNMPAPI_STATUS SNMPAPI_CALL SnmpSetPort(HSNMP_ENTITY,UINT);
HSNMP_PDU SNMPAPI_CALL SnmpCreatePdu(HSNMP_SESSION,smiINT,smiINT32,smiINT,smiINT,HSNMP_VBL);
SNMPAPI_STATUS SNMPAPI_CALL SnmpGetPduData(HSNMP_PDU,smiLPINT,smiLPINT32,smiLPINT,smiLPINT,LPHSNMP_VBL);
SNMPAPI_STATUS SNMPAPI_CALL SnmpSetPduData(HSNMP_PDU,const smiINT*,const smiINT32*,const smiINT*,const smiINT*,const HSNMP_VBL*);
HSNMP_PDU SNMPAPI_CALL SnmpDuplicatePdu(HSNMP_SESSION,HSNMP_PDU);
SNMPAPI_STATUS SNMPAPI_CALL SnmpFreePdu(HSNMP_PDU);
HSNMP_VBL SNMPAPI_CALL SnmpCreateVbl(HSNMP_SESSION,smiLPCOID,smiLPCVALUE);
HSNMP_VBL SNMPAPI_CALL SnmpDuplicateVbl(HSNMP_SESSION,HSNMP_VBL);
SNMPAPI_STATUS SNMPAPI_CALL SnmpFreeVbl(HSNMP_VBL);
SNMPAPI_STATUS SNMPAPI_CALL SnmpCountVbl(HSNMP_VBL);
SNMPAPI_STATUS SNMPAPI_CALL SnmpGetVb(HSNMP_VBL,smiUINT32,smiLPOID,smiLPVALUE);
SNMPAPI_STATUS SNMPAPI_CALL SnmpSetVb(HSNMP_VBL,smiUINT32,smiLPCOID,smiLPCVALUE);
SNMPAPI_STATUS SNMPAPI_CALL SnmpDeleteVb(HSNMP_VBL,smiUINT32);
SNMPAPI_STATUS SNMPAPI_CALL SnmpGetLastError(HSNMP_SESSION);
SNMPAPI_STATUS SNMPAPI_CALL SnmpStrToOid(LPCSTR,smiLPOID);
SNMPAPI_STATUS SNMPAPI_CALL SnmpOidToStr(smiLPCOID,smiUINT32,LPSTR);
SNMPAPI_STATUS SNMPAPI_CALL SnmpOidCopy(smiLPCOID,smiLPOID);
SNMPAPI_STATUS SNMPAPI_CALL SnmpOidCompare(smiLPCOID,smiLPCOID,smiUINT32,smiLPINT);
SNMPAPI_STATUS SNMPAPI_CALL SnmpEncodeMsg(HSNMP_SESSION,HSNMP_ENTITY,HSNMP_ENTITY,HSNMP_CONTEXT,HSNMP_PDU,smiLPOCTETS);
SNMPAPI_STATUS SNMPAPI_CALL SnmpDecodeMsg(HSNMP_SESSION,LPHSNMP_ENTITY,LPHSNMP_ENTITY,LPHSNMP_CONTEXT,LPHSNMP_PDU,smiLPCOCTETS);
SNMPAPI_STATUS SNMPAPI_CALL SnmpFreeDescriptor(smiUINT32,smiLPOPAQUE);

#ifdef __cplusplus
}
#endif

#endif /* _WINSNMP_H */
