#ifndef _NSPAPI_H
#define _NSPAPI_H

/* Windows Name Space Provider API definitions */

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _tagBLOB_DEFINED
#define _tagBLOB_DEFINED
#define _BLOB_DEFINED
#define _LPBLOB_DEFINED
typedef struct _BLOB {
    ULONG cbSize;
    BYTE *pBlobData;
} BLOB, *LPBLOB;
#endif

#ifndef GUID_DEFINED
#define GUID_DEFINED
typedef struct _GUID {
    unsigned long Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char Data4[8];
} GUID;
#endif /* GUID_DEFINED */

#ifndef __LPGUID_DEFINED__
#define __LPGUID_DEFINED__
typedef GUID *LPGUID;
#endif

#define SERVICE_RESOURCE  0x00000001
#define SERVICE_SERVICE  0x00000002
#define SERVICE_LOCAL  0x00000004
#define SERVICE_REGISTER  0x00000001
#define SERVICE_DEREGISTER  0x00000002
#define SERVICE_FLUSH  0x00000003
#define SERVICE_ADD_TYPE  0x00000004
#define SERVICE_DELETE_TYPE  0x00000005
#define SERVICE_FLAG_DEFER  0x00000001
#define SERVICE_FLAG_HARD  0x00000002

#define PROP_COMMENT  0x00000001
#define PROP_LOCALE  0x00000002
#define PROP_DISPLAY_HINT  0x00000004
#define PROP_VERSION  0x00000008
#define PROP_START_TIME  0x00000010
#define PROP_MACHINE  0x00000020
#define PROP_ADDRESSES 0x00000100
#define PROP_SD 0x00000200
#define PROP_ALL 0x80000000

#define SERVICE_ADDRESS_FLAG_RPC_CN  0x00000001
#define SERVICE_ADDRESS_FLAG_RPC_DG  0x00000002
#define SERVICE_ADDRESS_FLAG_RPC_NB  0x00000004

#define NSTYPE_HIERARCHICAL  0x00000001
#define NSTYPE_DYNAMIC  0x00000002
#define NSTYPE_ENUMERABLE  0x00000004
#define NSTYPE_WORKGROUP  0x00000008

#define XP_CONNECTIONLESS  0x00000001
#define XP_GUARANTEED_DELIVERY  0x00000002
#define XP_GUARANTEED_ORDER  0x00000004
#define XP_MESSAGE_ORIENTED  0x00000008
#define XP_PSEUDO_STREAM  0x00000010
#define XP_GRACEFUL_CLOSE  0x00000020
#define XP_EXPEDITED_DATA  0x00000040
#define XP_CONNECT_DATA  0x00000080
#define XP_DISCONNECT_DATA  0x00000100
#define XP_SUPPORTS_BROADCAST  0x00000200
#define XP_SUPPORTS_MULTICAST  0x00000400
#define XP_BANDWIDTH_ALLOCATION  0x00000800
#define XP_FRAGMENTATION  0x00001000
#define XP_ENCRYPTS  0x00002000

#define RES_SOFT_SEARCH  0x00000001
#define RES_FIND_MULTIPLE  0x00000002
#define RES_SERVICE  0x00000004

#define NS_DEFAULT  0
#define NS_SAP  1
#define NS_NDS  2
#define NS_PEER_BROWSE  3
#define NS_TCPIP_LOCAL  10
#define NS_TCPIP_HOSTS  11
#define NS_DNS  12
#define NS_NETBT  13
#define NS_WINS  14
#define NS_NBP  20
#define NS_MS  30
#define NS_STDA  31
#define NS_NTDS  32
#define NS_X500  40
#define NS_NIS  41
#define NS_VNS  50

#define SERVICE_TYPE_VALUE_SAPIDA  "SapId"
#define SERVICE_TYPE_VALUE_SAPIDW  L"SapId"
#define SERVICE_TYPE_VALUE_CONNA  "ConnectionOriented"
#define SERVICE_TYPE_VALUE_CONNW  L"ConnectionOriented"
#define SERVICE_TYPE_VALUE_TCPPORTA  "TcpPort"
#define SERVICE_TYPE_VALUE_TCPPORTW  L"TcpPort"
#define SERVICE_TYPE_VALUE_UDPPORTA  "UdpPort"
#define SERVICE_TYPE_VALUE_UDPPORTW  L"UdpPort"

#define SET_SERVICE_PARTIAL_SUCCESS  0x00000001

typedef struct _NS_INFOA {
    DWORD dwNameSpace;
    DWORD dwNameSpaceFlags;
    LPSTR lpNameSpace;
} NS_INFOA, *PNS_INFOA, *LPNS_INFOA;

typedef struct _NS_INFOW {
    DWORD dwNameSpace;
    DWORD dwNameSpaceFlags;
    LPWSTR lpNameSpace;
} NS_INFOW, *PNS_INFOW, *LPNS_INFOW;

typedef struct _SERVICE_TYPE_VALUE {
    DWORD dwNameSpace;
    DWORD dwValueType;
    DWORD dwValueSize;
    DWORD dwValueNameOffset;
    DWORD dwValueOffset;
} SERVICE_TYPE_VALUE, *PSERVICE_TYPE_VALUE, *LPSERVICE_TYPE_VALUE;

typedef struct _SERVICE_TYPE_VALUE_ABSA {
    DWORD dwNameSpace;
    DWORD dwValueType;
    DWORD dwValueSize;
    LPSTR lpValueName;
    PVOID lpValue;
} SERVICE_TYPE_VALUE_ABSA, *PSERVICE_TYPE_VALUE_ABSA, *LPSERVICE_TYPE_VALUE_ABSA;

typedef struct _SERVICE_TYPE_VALUE_ABSW {
    DWORD dwNameSpace;
    DWORD dwValueType;
    DWORD dwValueSize;
    LPWSTR lpValueName;
    PVOID lpValue;
} SERVICE_TYPE_VALUE_ABSW, *PSERVICE_TYPE_VALUE_ABSW, *LPSERVICE_TYPE_VALUE_ABSW;

typedef struct _SERVICE_TYPE_INFO {
    DWORD dwTypeNameOffset;
    DWORD dwValueCount;
    SERVICE_TYPE_VALUE Values[1];
} SERVICE_TYPE_INFO, *PSERVICE_TYPE_INFO, *LPSERVICE_TYPE_INFO;

typedef struct _SERVICE_TYPE_INFO_ABSA {
    LPSTR lpTypeName;
    DWORD dwValueCount;
    SERVICE_TYPE_VALUE_ABSA Values[1];
} SERVICE_TYPE_INFO_ABSA, *PSERVICE_TYPE_INFO_ABSA, *LPSERVICE_TYPE_INFO_ABSA;

typedef struct _SERVICE_TYPE_INFO_ABSW {
    LPWSTR lpTypeName;
    DWORD dwValueCount;
    SERVICE_TYPE_VALUE_ABSW Values[1];
} SERVICE_TYPE_INFO_ABSW, *PSERVICE_TYPE_INFO_ABSW, *LPSERVICE_TYPE_INFO_ABSW;

typedef struct _SERVICE_ADDRESS {
    DWORD dwAddressType;
    DWORD dwAddressFlags;
    DWORD dwAddressLength;
    DWORD dwPrincipalLength;
    BYTE *lpAddress;
    BYTE *lpPrincipal;
} SERVICE_ADDRESS, *PSERVICE_ADDRESS, *LPSERVICE_ADDRESS;

typedef struct _SERVICE_ADDRESSES {
    DWORD dwAddressCount;
    SERVICE_ADDRESS Addresses[1];
} SERVICE_ADDRESSES, *PSERVICE_ADDRESSES, *LPSERVICE_ADDRESSES;

typedef struct _SERVICE_INFOA {
    LPGUID lpServiceType;
    LPSTR lpServiceName;
    LPSTR lpComment;
    LPSTR lpLocale;
    DWORD dwDisplayHint;
    DWORD dwVersion;
    DWORD dwTime;
    LPSTR lpMachineName;
    LPSERVICE_ADDRESSES lpServiceAddress;
    BLOB ServiceSpecificInfo;
} SERVICE_INFOA, *PSERVICE_INFOA, *LPSERVICE_INFOA;

typedef struct _SERVICE_INFOW {
    LPGUID lpServiceType;
    LPWSTR lpServiceName;
    LPWSTR lpComment;
    LPWSTR lpLocale;
    DWORD dwDisplayHint;
    DWORD dwVersion;
    DWORD dwTime;
    LPWSTR lpMachineName;
    LPSERVICE_ADDRESSES lpServiceAddress;
    BLOB ServiceSpecificInfo;
} SERVICE_INFOW, *PSERVICE_INFOW, *LPSERVICE_INFOW;

typedef struct _NS_SERVICE_INFOA {
    DWORD dwNameSpace;
    SERVICE_INFOA ServiceInfo;
} NS_SERVICE_INFOA, *PNS_SERVICE_INFOA, *LPNS_SERVICE_INFOA;

typedef struct _NS_SERVICE_INFOW {
    DWORD dwNameSpace;
    SERVICE_INFOW ServiceInfo;
} NS_SERVICE_INFOW, *PNS_SERVICE_INFOW, *LPNS_SERVICE_INFOW;

#ifndef __CSADDR_DEFINED__
#define __CSADDR_DEFINED__

typedef struct _SOCKET_ADDRESS {
    LPSOCKADDR lpSockaddr;
    INT iSockaddrLength;
} SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS;

typedef struct _CSADDR_INFO {
    SOCKET_ADDRESS LocalAddr;
    SOCKET_ADDRESS RemoteAddr;
    INT iSocketType;
    INT iProtocol;
} CSADDR_INFO, *PCSADDR_INFO, *LPCSADDR_INFO;

#endif /* __CSADDR_DEFINED__ */

typedef struct _PROTOCOL_INFOA {
    DWORD dwServiceFlags;
    INT iAddressFamily;
    INT iMaxSockAddr;
    INT iMinSockAddr;
    INT iSocketType;
    INT iProtocol;
    DWORD dwMessageSize;
    LPSTR lpProtocol;
} PROTOCOL_INFOA, *PPROTOCOL_INFOA, *LPPROTOCOL_INFOA;

typedef struct _PROTOCOL_INFOW {
    DWORD dwServiceFlags;
    INT iAddressFamily;
    INT iMaxSockAddr;
    INT iMinSockAddr;
    INT iSocketType;
    INT iProtocol;
    DWORD dwMessageSize;
    LPWSTR lpProtocol;
} PROTOCOL_INFOW, *PPROTOCOL_INFOW, *LPPROTOCOL_INFOW;

typedef struct _NETRESOURCE2A {
    DWORD dwScope;
    DWORD dwType;
    DWORD dwUsage;
    DWORD dwDisplayType;
    LPSTR lpLocalName;
    LPSTR lpRemoteName;
    LPSTR lpComment;
    NS_INFOA ns_info;
    GUID ServiceType;
    DWORD dwProtocols;
    LPINT lpiProtocols;
} NETRESOURCE2A, *PNETRESOURCE2A, *LPNETRESOURCE2A;

typedef struct _NETRESOURCE2W {
    DWORD dwScope;
    DWORD dwType;
    DWORD dwUsage;
    DWORD dwDisplayType;
    LPWSTR lpLocalName;
    LPWSTR lpRemoteName;
    LPWSTR lpComment;
    NS_INFOW ns_info;
    GUID ServiceType;
    DWORD dwProtocols;
    LPINT lpiProtocols;
} NETRESOURCE2W, *PNETRESOURCE2W, *LPNETRESOURCE2W;

typedef DWORD (*LPFN_NSPAPI)(VOID);
typedef VOID (*LPSERVICE_CALLBACK_PROC)(LPARAM,HANDLE);

typedef struct _SERVICE_ASYNC_INFO {
    LPSERVICE_CALLBACK_PROC lpServiceCallbackProc;
    LPARAM lParam;
    HANDLE hAsyncTaskHandle;
} SERVICE_ASYNC_INFO, *PSERVICE_ASYNC_INFO, *LPSERVICE_ASYNC_INFO;

INT WINAPI EnumProtocolsA(LPINT,PVOID,PDWORD);
INT WINAPI EnumProtocolsW(LPINT,PVOID,PDWORD);
INT WINAPI GetAddressByNameA(DWORD,LPGUID,LPSTR,LPINT,DWORD,LPSERVICE_ASYNC_INFO,PVOID,PDWORD,LPSTR,PDWORD);
INT WINAPI GetAddressByNameW(DWORD,LPGUID,LPWSTR,LPINT,DWORD,LPSERVICE_ASYNC_INFO,PVOID,PDWORD,LPWSTR,PDWORD);
INT WINAPI GetTypeByNameA(LPSTR,LPGUID);
INT WINAPI GetTypeByNameW(LPWSTR,LPGUID);
INT WINAPI GetNameByTypeA(LPGUID,LPSTR,DWORD);
INT WINAPI GetNameByTypeW(LPGUID,LPWSTR,DWORD);
INT WINAPI SetServiceA(DWORD,DWORD,DWORD,LPSERVICE_INFOA,LPSERVICE_ASYNC_INFO,PDWORD);
INT WINAPI SetServiceW(DWORD,DWORD,DWORD,LPSERVICE_INFOW,LPSERVICE_ASYNC_INFO,PDWORD);
INT WINAPI GetServiceA(DWORD,LPGUID,LPSTR,DWORD,PVOID,PDWORD,LPSERVICE_ASYNC_INFO);
INT WINAPI GetServiceW(DWORD,LPGUID,LPWSTR,DWORD,PVOID,PDWORD,LPSERVICE_ASYNC_INFO);

#ifdef UNICODE
typedef NS_INFOW NS_INFO;
typedef PNS_INFOW PNS_INFO;
typedef LPNS_INFOW LPNS_INFO;
typedef SERVICE_TYPE_VALUE_ABSW SERVICE_TYPE_VALUE_ABS;
typedef PSERVICE_TYPE_VALUE_ABSW PSERVICE_TYPE_VALUE_ABS;
typedef LPSERVICE_TYPE_VALUE_ABSW LPSERVICE_TYPE_VALUE_ABS;
typedef SERVICE_TYPE_INFO_ABSW SERVICE_TYPE_INFO_ABS;
typedef PSERVICE_TYPE_INFO_ABSW PSERVICE_TYPE_INFO_ABS;
typedef LPSERVICE_TYPE_INFO_ABSW LPSERVICE_TYPE_INFO_ABS;
typedef SERVICE_INFOW SERVICE_INFO;
typedef PSERVICE_INFOW PSERVICE_INFO;
typedef LPSERVICE_INFOW LPSERVICE_INFO;
typedef NS_SERVICE_INFOW NS_SERVICE_INFO;
typedef PNS_SERVICE_INFOW PNS_SERVICE_INFO;
typedef LPNS_SERVICE_INFOW LPNS_SERVICE_INFO;
typedef PROTOCOL_INFOW PROTOCOL_INFO;
typedef PPROTOCOL_INFOW PPROTOCOL_INFO;
typedef LPPROTOCOL_INFOW LPPROTOCOL_INFO;
typedef NETRESOURCE2W NETRESOURCE2;
typedef PNETRESOURCE2W PNETRESOURCE2;
typedef LPNETRESOURCE2W LPNETRESOURCE2;
#define SERVICE_TYPE_VALUE_SAPID SERVICE_TYPE_VALUE_SAPIDW
#define SERVICE_TYPE_VALUE_CONN SERVICE_TYPE_VALUE_CONNW
#define SERVICE_TYPE_VALUE_TCPPORT SERVICE_TYPE_VALUE_TCPPORTW
#define SERVICE_TYPE_VALUE_UDPPORT SERVICE_TYPE_VALUE_UDPPORTW
#define EnumProtocols EnumProtocolsW
#define GetAddressByName GetAddressByNameW
#define GetTypeByName GetTypeByNameW
#define GetNameByType GetNameByTypeW
#define SetService SetServiceW
#define GetService GetServiceW
#else
typedef NS_INFOA NS_INFO;
typedef PNS_INFOA PNS_INFO;
typedef LPNS_INFOA LPNS_INFO;
typedef SERVICE_TYPE_VALUE_ABSA SERVICE_TYPE_VALUE_ABS;
typedef PSERVICE_TYPE_VALUE_ABSA PSERVICE_TYPE_VALUE_ABS;
typedef LPSERVICE_TYPE_VALUE_ABSA LPSERVICE_TYPE_VALUE_ABS;
typedef SERVICE_TYPE_INFO_ABSA SERVICE_TYPE_INFO_ABS;
typedef PSERVICE_TYPE_INFO_ABSA PSERVICE_TYPE_INFO_ABS;
typedef LPSERVICE_TYPE_INFO_ABSA LPSERVICE_TYPE_INFO_ABS;
typedef SERVICE_INFOA SERVICE_INFO;
typedef PSERVICE_INFOA PSERVICE_INFO;
typedef LPSERVICE_INFOA LPSERVICE_INFO;
typedef NS_SERVICE_INFOA NS_SERVICE_INFO;
typedef PNS_SERVICE_INFOA PNS_SERVICE_INFO;
typedef LPNS_SERVICE_INFOA LPNS_SERVICE_INFO;
typedef PROTOCOL_INFOA PROTOCOL_INFO;
typedef PPROTOCOL_INFOA PPROTOCOL_INFO;
typedef LPPROTOCOL_INFOA LPPROTOCOL_INFO;
typedef NETRESOURCE2A NETRESOURCE2;
typedef PNETRESOURCE2A PNETRESOURCE2;
typedef LPNETRESOURCE2A LPNETRESOURCE2;
#define SERVICE_TYPE_VALUE_SAPID SERVICE_TYPE_VALUE_SAPIDA
#define SERVICE_TYPE_VALUE_CONN SERVICE_TYPE_VALUE_CONNA
#define SERVICE_TYPE_VALUE_TCPPORT SERVICE_TYPE_VALUE_TCPPORTA
#define SERVICE_TYPE_VALUE_UDPPORT SERVICE_TYPE_VALUE_UDPPORTA
#define EnumProtocols EnumProtocolsA
#define GetAddressByName GetAddressByNameA
#define GetTypeByName GetTypeByNameA
#define GetNameByType GetNameByTypeA
#define SetService SetServiceA
#define GetService GetServiceA
#endif /* UNICODE */

#ifdef __cplusplus
}
#endif

#endif /* _NSPAPI_H */


