|
|
|
#ifndef __rpc_h
|
|
|
|
#define __rpc_h
|
|
|
|
|
|
|
|
#ifndef CONFIG
|
|
|
|
#define CONFIG "config.h"
|
|
|
|
#endif // CONFIG
|
|
|
|
#include CONFIG
|
|
|
|
|
|
|
|
#include "types.h"
|
|
|
|
|
|
|
|
#if !defined(_WIN32) && !defined(__CYGWIN__)
|
|
|
|
#define RPC_S_OK 0
|
|
|
|
#define RPC_S_INVALID_ARG 87
|
|
|
|
#define RPC_S_OUT_OF_MEMORY 14
|
|
|
|
#define RPC_S_OUT_OF_THREADS 164
|
|
|
|
#define RPC_S_INVALID_LEVEL RPC_S_INVALID_ARG
|
|
|
|
#define RPC_S_BUFFER_TOO_SMALL 122
|
|
|
|
#define RPC_S_INVALID_SECURITY_DESC 1338
|
|
|
|
#define RPC_S_ACCESS_DENIED 5
|
|
|
|
#define RPC_S_SERVER_OUT_OF_MEMORY 1130
|
|
|
|
#define RPC_S_ASYNC_CALL_PENDING 997
|
|
|
|
#define RPC_S_UNKNOWN_PRINCIPAL 1332
|
|
|
|
#define RPC_S_TIMEOUT 1460
|
|
|
|
#define RPC_S_INVALID_STRING_BINDING 1700
|
|
|
|
#define RPC_S_WRONG_KIND_OF_BINDING 1701
|
|
|
|
#define RPC_S_INVALID_BINDING 1702
|
|
|
|
#define RPC_S_PROTSEQ_NOT_SUPPORTED 1703
|
|
|
|
#define RPC_S_INVALID_RPC_PROTSEQ 1704
|
|
|
|
#define RPC_S_INVALID_STRING_UUID 1705
|
|
|
|
#define RPC_S_INVALID_ENDPOINT_FORMAT 1706
|
|
|
|
#define RPC_S_INVALID_NET_ADDR 1707
|
|
|
|
#define RPC_S_NO_ENDPOINT_FOUND 1708
|
|
|
|
#define RPC_S_INVALID_TIMEOUT 1709
|
|
|
|
#define RPC_S_OBJECT_NOT_FOUND 1710
|
|
|
|
#define RPC_S_ALREADY_REGISTERED 1711
|
|
|
|
#define RPC_S_TYPE_ALREADY_REGISTERED 1712
|
|
|
|
#define RPC_S_ALREADY_LISTENING 1713
|
|
|
|
#define RPC_S_NO_PROTSEQS_REGISTERED 1714
|
|
|
|
#define RPC_S_NOT_LISTENING 1715
|
|
|
|
#define RPC_S_UNKNOWN_MGR_TYPE 1716
|
|
|
|
#define RPC_S_UNKNOWN_IF 1717
|
|
|
|
#define RPC_S_NO_BINDINGS 1718
|
|
|
|
#define RPC_S_NO_PROTSEQS 1719
|
|
|
|
#define RPC_S_CANT_CREATE_ENDPOINT 1720
|
|
|
|
#define RPC_S_OUT_OF_RESOURCES 1721
|
|
|
|
#define RPC_S_SERVER_UNAVAILABLE 1722
|
|
|
|
#define RPC_S_SERVER_TOO_BUSY 1723
|
|
|
|
#define RPC_S_INVALID_NETWORK_OPTIONS 1724
|
|
|
|
#define RPC_S_NO_CALL_ACTIVE 1725
|
|
|
|
#define RPC_S_CALL_FAILED 1726
|
|
|
|
#define RPC_S_CALL_FAILED_DNE 1727
|
|
|
|
#define RPC_S_PROTOCOL_ERROR 1728
|
|
|
|
#define RPC_S_PROXY_ACCESS_DENIED 1729
|
|
|
|
#define RPC_S_UNSUPPORTED_TRANS_SYN 1730
|
|
|
|
#define RPC_S_UNSUPPORTED_TYPE 1732
|
|
|
|
#define RPC_S_INVALID_TAG 1733
|
|
|
|
#define RPC_S_INVALID_BOUND 1734
|
|
|
|
#define RPC_S_NO_ENTRY_NAME 1735
|
|
|
|
#define RPC_S_INVALID_NAME_SYNTAX 1736
|
|
|
|
#define RPC_S_UNSUPPORTED_NAME_SYNTAX 1737
|
|
|
|
#define RPC_S_UUID_NO_ADDRESS 1739
|
|
|
|
#define RPC_S_DUPLICATE_ENDPOINT 1740
|
|
|
|
#define RPC_S_UNKNOWN_AUTHN_TYPE 1741
|
|
|
|
#define RPC_S_MAX_CALLS_TOO_SMALL 1742
|
|
|
|
#define RPC_S_STRING_TOO_LONG 1743
|
|
|
|
#define RPC_S_PROTSEQ_NOT_FOUND 1744
|
|
|
|
#define RPC_S_PROCNUM_OUT_OF_RANGE 1745
|
|
|
|
#define RPC_S_BINDING_HAS_NO_AUTH 1746
|
|
|
|
#define RPC_S_UNKNOWN_AUTHN_SERVICE 1747
|
|
|
|
#define RPC_S_UNKNOWN_AUTHN_LEVEL 1748
|
|
|
|
#define RPC_S_INVALID_AUTH_IDENTITY 1749
|
|
|
|
#define RPC_S_UNKNOWN_AUTHZ_SERVICE 1750
|
|
|
|
#define EPT_S_INVALID_ENTRY 1751
|
|
|
|
#define EPT_S_CANT_PERFORM_OP 1752
|
|
|
|
#define EPT_S_NOT_REGISTERED 1753
|
|
|
|
#define RPC_S_NOTHING_TO_EXPORT 1754
|
|
|
|
#define RPC_S_INCOMPLETE_NAME 1755
|
|
|
|
#define RPC_S_INVALID_VERS_OPTION 1756
|
|
|
|
#define RPC_S_NO_MORE_MEMBERS 1757
|
|
|
|
#define RPC_S_NOT_ALL_OBJS_UNEXPORTED 1758
|
|
|
|
#define RPC_S_INTERFACE_NOT_FOUND 1759
|
|
|
|
#define RPC_S_ENTRY_ALREADY_EXISTS 1760
|
|
|
|
#define RPC_S_ENTRY_NOT_FOUND 1761
|
|
|
|
#define RPC_S_NAME_SERVICE_UNAVAILABLE 1762
|
|
|
|
#define RPC_S_INVALID_NAF_ID 1763
|
|
|
|
#define RPC_S_CANNOT_SUPPORT 1764
|
|
|
|
#define RPC_S_NO_CONTEXT_AVAILABLE 1765
|
|
|
|
#define RPC_S_INTERNAL_ERROR 1766
|
|
|
|
#define RPC_S_ZERO_DIVIDE 1767
|
|
|
|
#define RPC_S_ADDRESS_ERROR 1768
|
|
|
|
#define RPC_S_FP_DIV_ZERO 1769
|
|
|
|
#define RPC_S_FP_UNDERFLOW 1770
|
|
|
|
#define RPC_S_FP_OVERFLOW 1771
|
|
|
|
#define RPC_X_NO_MORE_ENTRIES 1772
|
|
|
|
#define RPC_X_SS_CHAR_TRANS_OPEN_FAIL 1773
|
|
|
|
#define RPC_X_SS_CHAR_TRANS_SHORT_FILE 1774
|
|
|
|
#define RPC_X_SS_IN_NULL_CONTEXT 1775
|
|
|
|
#define RPC_X_SS_CONTEXT_DAMAGED 1777
|
|
|
|
#define RPC_X_SS_HANDLES_MISMATCH 1778
|
|
|
|
#define RPC_X_SS_CANNOT_GET_CALL_HANDLE 1779
|
|
|
|
#define RPC_X_NULL_REF_POINTER 1780
|
|
|
|
#define RPC_X_ENUM_VALUE_OUT_OF_RANGE 1781
|
|
|
|
#define RPC_X_BYTE_COUNT_TOO_SMALL 1782
|
|
|
|
#define RPC_X_BAD_STUB_DATA 1783
|
|
|
|
#define RPC_S_CALL_IN_PROGRESS 1791
|
|
|
|
#define RPC_S_NO_MORE_BINDINGS 1806
|
|
|
|
#define RPC_S_NO_INTERFACES 1817
|
|
|
|
#define RPC_S_CALL_CANCELLED 1818
|
|
|
|
#define RPC_S_BINDING_INCOMPLETE 1819
|
|
|
|
#define RPC_S_COMM_FAILURE 1820
|
|
|
|
#define RPC_S_UNSUPPORTED_AUTHN_LEVEL 1821
|
|
|
|
#define RPC_S_NO_PRINC_NAME 1822
|
|
|
|
#define RPC_S_NOT_RPC_ERROR 1823
|
|
|
|
#define RPC_S_UUID_LOCAL_ONLY 1824
|
|
|
|
#define RPC_S_SEC_PKG_ERROR 1825
|
|
|
|
#define RPC_S_NOT_CANCELLED 1826
|
|
|
|
#define RPC_X_INVALID_ES_ACTION 1827
|
|
|
|
#define RPC_X_WRONG_ES_VERSION 1828
|
|
|
|
#define RPC_X_WRONG_STUB_VERSION 1829
|
|
|
|
#define RPC_X_INVALID_PIPE_OBJECT 1830
|
|
|
|
#define RPC_X_WRONG_PIPE_ORDER 1831
|
|
|
|
#define RPC_X_WRONG_PIPE_VERSION 1832
|
|
|
|
#define RPC_S_COOKIE_AUTH_FAILED 1833
|
|
|
|
#define RPC_S_GROUP_MEMBER_NOT_FOUND 1898
|
|
|
|
#define EPT_S_CANT_CREATE 1899
|
|
|
|
#define RPC_S_INVALID_OBJECT 1900
|
|
|
|
#define RPC_S_SEND_INCOMPLETE 1913
|
|
|
|
#define RPC_S_INVALID_ASYNC_HANDLE 1914
|
|
|
|
#define RPC_S_INVALID_ASYNC_CALL 1915
|
|
|
|
#define RPC_X_PIPE_CLOSED 1916
|
|
|
|
#define RPC_X_PIPE_DISCIPLINE_ERROR 1917
|
|
|
|
#define RPC_X_PIPE_EMPTY 1918
|
|
|
|
#define RPC_S_ENTRY_TYPE_MISMATCH 1922
|
|
|
|
#define RPC_S_NOT_ALL_OBJS_EXPORTED 1923
|
|
|
|
#define RPC_S_INTERFACE_NOT_EXPORTED 1924
|
|
|
|
#define RPC_S_PROFILE_NOT_ADDED 1925
|
|
|
|
#define RPC_S_PRF_ELT_NOT_ADDED 1926
|
|
|
|
#define RPC_S_PRF_ELT_NOT_REMOVED 1927
|
|
|
|
#define RPC_S_GRP_ELT_NOT_ADDED 1928
|
|
|
|
#define RPC_S_GRP_ELT_NOT_REMOVED 1929
|
|
|
|
#endif // !defined(_WIN32) && !_defined(__CYGWIN__)
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
BYTE VersionMajor;
|
|
|
|
BYTE VersionMinor;
|
|
|
|
BYTE PacketType;
|
|
|
|
BYTE PacketFlags;
|
|
|
|
DWORD DataRepresentation;
|
|
|
|
WORD FragLength;
|
|
|
|
WORD AuthLength;
|
|
|
|
DWORD CallId;
|
|
|
|
} /*__packed*/ RPC_HEADER;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
WORD MaxXmitFrag;
|
|
|
|
WORD MaxRecvFrag;
|
|
|
|
DWORD AssocGroup;
|
|
|
|
DWORD NumCtxItems;
|
|
|
|
struct {
|
|
|
|
WORD ContextId;
|
|
|
|
WORD NumTransItems;
|
|
|
|
GUID InterfaceUUID;
|
|
|
|
WORD InterfaceVerMajor;
|
|
|
|
WORD InterfaceVerMinor;
|
|
|
|
GUID TransferSyntax;
|
|
|
|
DWORD SyntaxVersion;
|
|
|
|
} CtxItems[1];
|
|
|
|
} /*__packed*/ RPC_BIND_REQUEST;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
WORD MaxXmitFrag;
|
|
|
|
WORD MaxRecvFrag;
|
|
|
|
DWORD AssocGroup;
|
|
|
|
WORD SecondaryAddressLength;
|
|
|
|
BYTE SecondaryAddress[6];
|
|
|
|
DWORD NumResults;
|
|
|
|
struct {
|
|
|
|
WORD AckResult;
|
|
|
|
WORD AckReason;
|
|
|
|
GUID TransferSyntax;
|
|
|
|
DWORD SyntaxVersion;
|
|
|
|
} Results[0];
|
|
|
|
} /*__packed*/ RPC_BIND_RESPONSE;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
DWORD AllocHint;
|
|
|
|
WORD ContextId;
|
|
|
|
WORD Opnum;
|
|
|
|
struct {
|
|
|
|
DWORD DataLength;
|
|
|
|
DWORD DataSizeIs;
|
|
|
|
} Ndr;
|
|
|
|
BYTE Data[0];
|
|
|
|
} /*__packed*/ RPC_REQUEST;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
DWORD AllocHint;
|
|
|
|
WORD ContextId;
|
|
|
|
BYTE CancelCount;
|
|
|
|
BYTE Pad1;
|
|
|
|
struct {
|
|
|
|
DWORD DataLength;
|
|
|
|
DWORD DataSizeIs1;
|
|
|
|
DWORD DataSizeIs2;
|
|
|
|
} Ndr;
|
|
|
|
BYTE Data[0];
|
|
|
|
} /*__packed*/ RPC_RESPONSE;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
DWORD AllocHint;
|
|
|
|
WORD ContextId;
|
|
|
|
WORD Opnum;
|
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
DWORD DataLength;
|
|
|
|
DWORD DataSizeIs;
|
|
|
|
BYTE Data[0];
|
|
|
|
} Ndr;
|
|
|
|
struct {
|
|
|
|
uint64_t DataLength;
|
|
|
|
uint64_t DataSizeIs;
|
|
|
|
BYTE Data[0];
|
|
|
|
} Ndr64;
|
|
|
|
};
|
|
|
|
} /*__packed*/ RPC_REQUEST64;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
DWORD AllocHint;
|
|
|
|
WORD ContextId;
|
|
|
|
BYTE CancelCount;
|
|
|
|
BYTE Pad1;
|
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
DWORD DataLength;
|
|
|
|
DWORD DataSizeMax;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
DWORD DataSizeIs;
|
|
|
|
DWORD status;
|
|
|
|
};
|
|
|
|
BYTE Data[0];
|
|
|
|
} Ndr;
|
|
|
|
struct {
|
|
|
|
uint64_t DataLength;
|
|
|
|
uint64_t DataSizeMax;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
uint64_t DataSizeIs;
|
|
|
|
DWORD status;
|
|
|
|
};
|
|
|
|
BYTE Data[0];
|
|
|
|
} Ndr64;
|
|
|
|
};
|
|
|
|
} /*__packed*/ RPC_RESPONSE64;
|
|
|
|
|
|
|
|
|
|
|
|
typedef SOCKET RpcCtx;
|
|
|
|
typedef int RpcStatus;
|
|
|
|
|
|
|
|
#define INVALID_NDR_CTX ((WORD)~0)
|
|
|
|
|
|
|
|
#define RPC_BIND_ACCEPT (0)
|
|
|
|
#define RPC_BIND_NACK (LE16(2))
|
|
|
|
#define RPC_BIND_ACK (LE16(3))
|
|
|
|
|
|
|
|
#define RPC_SYNTAX_UNSUPPORTED (LE16(2))
|
|
|
|
#define RPC_ABSTRACTSYNTAX_UNSUPPORTED (LE16(1))
|
|
|
|
|
|
|
|
#define RPC_BTFN_SEC_CONTEXT_MULTIPLEX (LE16(1))
|
|
|
|
#define RPC_BTFN_KEEP_ORPHAN (LE16(2))
|
|
|
|
|
|
|
|
#define INVALID_RPCCTX INVALID_SOCKET
|
|
|
|
#define closeRpc socketclose
|
|
|
|
|
|
|
|
#define RPC_PT_REQUEST 0
|
|
|
|
#define RPC_PT_RESPONSE 2
|
|
|
|
#define RPC_PT_BIND_REQ 11
|
|
|
|
#define RPC_PT_BIND_ACK 12
|
|
|
|
#define RPC_PT_ALTERCONTEXT_REQ 14
|
|
|
|
#define RPC_PT_ALTERCONTEXT_ACK 15
|
|
|
|
|
|
|
|
#define RPC_PF_FIRST 1
|
|
|
|
#define RPC_PF_LAST 2
|
|
|
|
#define RPC_PF_CANCEL_PENDING 4
|
|
|
|
#define RPC_PF_RESERVED 8
|
|
|
|
#define RPC_PF_MULTIPLEX 16
|
|
|
|
#define RPC_PF_NOT_EXEC 32
|
|
|
|
#define RPC_PF_MAYBE 64
|
|
|
|
#define RPC_PF_OBJECT 128
|
|
|
|
|
|
|
|
typedef union _RPC_FLAGS
|
|
|
|
{
|
|
|
|
DWORD mask;
|
|
|
|
struct {
|
|
|
|
uint32_t FlagsBTFN : 16;
|
|
|
|
BOOL HasNDR32 : 1;
|
|
|
|
BOOL HasNDR64 : 1;
|
|
|
|
BOOL HasBTFN : 1;
|
|
|
|
};
|
|
|
|
} RPC_FLAGS, *PRPC_FLAGS;
|
|
|
|
|
|
|
|
extern RPC_FLAGS RpcFlags;
|
|
|
|
|
|
|
|
void rpcServer(const RpcCtx socket, const DWORD RpcAssocGroup, const char* const ipstr);
|
|
|
|
RpcStatus rpcBindClient(const RpcCtx sock, const int_fast8_t verbose);
|
|
|
|
RpcStatus rpcSendRequest(const RpcCtx socket, const BYTE *const KmsRequest, const size_t requestSize, BYTE **KmsResponse, size_t *const responseSize);
|
|
|
|
|
|
|
|
#endif // __rpc_h
|