rpc.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. #ifndef __rpc_h
  2. #define __rpc_h
  3. #ifndef CONFIG
  4. #define CONFIG "config.h"
  5. #endif // CONFIG
  6. #include CONFIG
  7. #include "types.h"
  8. //#if _MSC_VER
  9. //typedef signed char int_fast8_t;
  10. //typedef unsigned char BYTE;
  11. //typedef UINT_PTR size_t;
  12. //typedef unsigned long DWORD;
  13. //#define STDIN_FILENO 0
  14. //#endif
  15. #if !defined(_WIN32) && !defined(__CYGWIN__)
  16. #define RPC_S_OK 0
  17. #define RPC_S_INVALID_ARG 87
  18. #define RPC_S_OUT_OF_MEMORY 14
  19. #define RPC_S_OUT_OF_THREADS 164
  20. #define RPC_S_INVALID_LEVEL RPC_S_INVALID_ARG
  21. #define RPC_S_BUFFER_TOO_SMALL 122
  22. #define RPC_S_INVALID_SECURITY_DESC 1338
  23. #define RPC_S_ACCESS_DENIED 5
  24. #define RPC_S_SERVER_OUT_OF_MEMORY 1130
  25. #define RPC_S_ASYNC_CALL_PENDING 997
  26. #define RPC_S_UNKNOWN_PRINCIPAL 1332
  27. #define RPC_S_TIMEOUT 1460
  28. #define RPC_S_INVALID_STRING_BINDING 1700
  29. #define RPC_S_WRONG_KIND_OF_BINDING 1701
  30. #define RPC_S_INVALID_BINDING 1702
  31. #define RPC_S_PROTSEQ_NOT_SUPPORTED 1703
  32. #define RPC_S_INVALID_RPC_PROTSEQ 1704
  33. #define RPC_S_INVALID_STRING_UUID 1705
  34. #define RPC_S_INVALID_ENDPOINT_FORMAT 1706
  35. #define RPC_S_INVALID_NET_ADDR 1707
  36. #define RPC_S_NO_ENDPOINT_FOUND 1708
  37. #define RPC_S_INVALID_TIMEOUT 1709
  38. #define RPC_S_OBJECT_NOT_FOUND 1710
  39. #define RPC_S_ALREADY_REGISTERED 1711
  40. #define RPC_S_TYPE_ALREADY_REGISTERED 1712
  41. #define RPC_S_ALREADY_LISTENING 1713
  42. #define RPC_S_NO_PROTSEQS_REGISTERED 1714
  43. #define RPC_S_NOT_LISTENING 1715
  44. #define RPC_S_UNKNOWN_MGR_TYPE 1716
  45. #define RPC_S_UNKNOWN_IF 1717
  46. #define RPC_S_NO_BINDINGS 1718
  47. #define RPC_S_NO_PROTSEQS 1719
  48. #define RPC_S_CANT_CREATE_ENDPOINT 1720
  49. #define RPC_S_OUT_OF_RESOURCES 1721
  50. #define RPC_S_SERVER_UNAVAILABLE 1722
  51. #define RPC_S_SERVER_TOO_BUSY 1723
  52. #define RPC_S_INVALID_NETWORK_OPTIONS 1724
  53. #define RPC_S_NO_CALL_ACTIVE 1725
  54. #define RPC_S_CALL_FAILED 1726
  55. #define RPC_S_CALL_FAILED_DNE 1727
  56. #define RPC_S_PROTOCOL_ERROR 1728
  57. #define RPC_S_PROXY_ACCESS_DENIED 1729
  58. #define RPC_S_UNSUPPORTED_TRANS_SYN 1730
  59. #define RPC_S_UNSUPPORTED_TYPE 1732
  60. #define RPC_S_INVALID_TAG 1733
  61. #define RPC_S_INVALID_BOUND 1734
  62. #define RPC_S_NO_ENTRY_NAME 1735
  63. #define RPC_S_INVALID_NAME_SYNTAX 1736
  64. #define RPC_S_UNSUPPORTED_NAME_SYNTAX 1737
  65. #define RPC_S_UUID_NO_ADDRESS 1739
  66. #define RPC_S_DUPLICATE_ENDPOINT 1740
  67. #define RPC_S_UNKNOWN_AUTHN_TYPE 1741
  68. #define RPC_S_MAX_CALLS_TOO_SMALL 1742
  69. #define RPC_S_STRING_TOO_LONG 1743
  70. #define RPC_S_PROTSEQ_NOT_FOUND 1744
  71. #define RPC_S_PROCNUM_OUT_OF_RANGE 1745
  72. #define RPC_S_BINDING_HAS_NO_AUTH 1746
  73. #define RPC_S_UNKNOWN_AUTHN_SERVICE 1747
  74. #define RPC_S_UNKNOWN_AUTHN_LEVEL 1748
  75. #define RPC_S_INVALID_AUTH_IDENTITY 1749
  76. #define RPC_S_UNKNOWN_AUTHZ_SERVICE 1750
  77. #define EPT_S_INVALID_ENTRY 1751
  78. #define EPT_S_CANT_PERFORM_OP 1752
  79. #define EPT_S_NOT_REGISTERED 1753
  80. #define RPC_S_NOTHING_TO_EXPORT 1754
  81. #define RPC_S_INCOMPLETE_NAME 1755
  82. #define RPC_S_INVALID_VERS_OPTION 1756
  83. #define RPC_S_NO_MORE_MEMBERS 1757
  84. #define RPC_S_NOT_ALL_OBJS_UNEXPORTED 1758
  85. #define RPC_S_INTERFACE_NOT_FOUND 1759
  86. #define RPC_S_ENTRY_ALREADY_EXISTS 1760
  87. #define RPC_S_ENTRY_NOT_FOUND 1761
  88. #define RPC_S_NAME_SERVICE_UNAVAILABLE 1762
  89. #define RPC_S_INVALID_NAF_ID 1763
  90. #define RPC_S_CANNOT_SUPPORT 1764
  91. #define RPC_S_NO_CONTEXT_AVAILABLE 1765
  92. #define RPC_S_INTERNAL_ERROR 1766
  93. #define RPC_S_ZERO_DIVIDE 1767
  94. #define RPC_S_ADDRESS_ERROR 1768
  95. #define RPC_S_FP_DIV_ZERO 1769
  96. #define RPC_S_FP_UNDERFLOW 1770
  97. #define RPC_S_FP_OVERFLOW 1771
  98. #define RPC_X_NO_MORE_ENTRIES 1772
  99. #define RPC_X_SS_CHAR_TRANS_OPEN_FAIL 1773
  100. #define RPC_X_SS_CHAR_TRANS_SHORT_FILE 1774
  101. #define RPC_X_SS_IN_NULL_CONTEXT 1775
  102. #define RPC_X_SS_CONTEXT_DAMAGED 1777
  103. #define RPC_X_SS_HANDLES_MISMATCH 1778
  104. #define RPC_X_SS_CANNOT_GET_CALL_HANDLE 1779
  105. #define RPC_X_NULL_REF_POINTER 1780
  106. #define RPC_X_ENUM_VALUE_OUT_OF_RANGE 1781
  107. #define RPC_X_BYTE_COUNT_TOO_SMALL 1782
  108. #define RPC_X_BAD_STUB_DATA 1783
  109. #define RPC_S_CALL_IN_PROGRESS 1791
  110. #define RPC_S_NO_MORE_BINDINGS 1806
  111. #define RPC_S_NO_INTERFACES 1817
  112. #define RPC_S_CALL_CANCELLED 1818
  113. #define RPC_S_BINDING_INCOMPLETE 1819
  114. #define RPC_S_COMM_FAILURE 1820
  115. #define RPC_S_UNSUPPORTED_AUTHN_LEVEL 1821
  116. #define RPC_S_NO_PRINC_NAME 1822
  117. #define RPC_S_NOT_RPC_ERROR 1823
  118. #define RPC_S_UUID_LOCAL_ONLY 1824
  119. #define RPC_S_SEC_PKG_ERROR 1825
  120. #define RPC_S_NOT_CANCELLED 1826
  121. #define RPC_X_INVALID_ES_ACTION 1827
  122. #define RPC_X_WRONG_ES_VERSION 1828
  123. #define RPC_X_WRONG_STUB_VERSION 1829
  124. #define RPC_X_INVALID_PIPE_OBJECT 1830
  125. #define RPC_X_WRONG_PIPE_ORDER 1831
  126. #define RPC_X_WRONG_PIPE_VERSION 1832
  127. #define RPC_S_COOKIE_AUTH_FAILED 1833
  128. #define RPC_S_GROUP_MEMBER_NOT_FOUND 1898
  129. #define EPT_S_CANT_CREATE 1899
  130. #define RPC_S_INVALID_OBJECT 1900
  131. #define RPC_S_SEND_INCOMPLETE 1913
  132. #define RPC_S_INVALID_ASYNC_HANDLE 1914
  133. #define RPC_S_INVALID_ASYNC_CALL 1915
  134. #define RPC_X_PIPE_CLOSED 1916
  135. #define RPC_X_PIPE_DISCIPLINE_ERROR 1917
  136. #define RPC_X_PIPE_EMPTY 1918
  137. #define RPC_S_ENTRY_TYPE_MISMATCH 1922
  138. #define RPC_S_NOT_ALL_OBJS_EXPORTED 1923
  139. #define RPC_S_INTERFACE_NOT_EXPORTED 1924
  140. #define RPC_S_PROFILE_NOT_ADDED 1925
  141. #define RPC_S_PRF_ELT_NOT_ADDED 1926
  142. #define RPC_S_PRF_ELT_NOT_REMOVED 1927
  143. #define RPC_S_GRP_ELT_NOT_ADDED 1928
  144. #define RPC_S_GRP_ELT_NOT_REMOVED 1929
  145. #endif // !defined(_WIN32) && !_defined(__CYGWIN__)
  146. typedef struct {
  147. BYTE VersionMajor;
  148. BYTE VersionMinor;
  149. BYTE PacketType;
  150. BYTE PacketFlags;
  151. DWORD DataRepresentation;
  152. WORD FragLength;
  153. WORD AuthLength;
  154. DWORD CallId;
  155. } /*__packed*/ RPC_HEADER;
  156. typedef struct {
  157. WORD MaxXmitFrag;
  158. WORD MaxRecvFrag;
  159. DWORD AssocGroup;
  160. DWORD NumCtxItems;
  161. struct {
  162. WORD ContextId;
  163. WORD NumTransItems;
  164. GUID InterfaceUUID;
  165. WORD InterfaceVerMajor;
  166. WORD InterfaceVerMinor;
  167. GUID TransferSyntax;
  168. DWORD SyntaxVersion;
  169. } CtxItems[1];
  170. } /*__packed*/ RPC_BIND_REQUEST;
  171. typedef struct {
  172. WORD MaxXmitFrag;
  173. WORD MaxRecvFrag;
  174. DWORD AssocGroup;
  175. WORD SecondaryAddressLength;
  176. BYTE SecondaryAddress[6];
  177. DWORD NumResults;
  178. struct {
  179. WORD AckResult;
  180. WORD AckReason;
  181. GUID TransferSyntax;
  182. DWORD SyntaxVersion;
  183. } Results[0];
  184. } /*__packed*/ RPC_BIND_RESPONSE;
  185. typedef struct {
  186. DWORD AllocHint;
  187. WORD ContextId;
  188. WORD Opnum;
  189. struct {
  190. DWORD DataLength;
  191. DWORD DataSizeIs;
  192. } Ndr;
  193. BYTE Data[0];
  194. } /*__packed*/ RPC_REQUEST;
  195. typedef struct {
  196. DWORD AllocHint;
  197. WORD ContextId;
  198. BYTE CancelCount;
  199. BYTE Pad1;
  200. struct {
  201. DWORD DataLength;
  202. DWORD DataSizeIs1;
  203. DWORD DataSizeIs2;
  204. } Ndr;
  205. BYTE Data[0];
  206. } /*__packed*/ RPC_RESPONSE;
  207. typedef struct {
  208. DWORD AllocHint;
  209. WORD ContextId;
  210. WORD Opnum;
  211. union {
  212. struct {
  213. DWORD DataLength;
  214. DWORD DataSizeIs;
  215. BYTE Data[0];
  216. } Ndr;
  217. struct {
  218. uint64_t DataLength;
  219. uint64_t DataSizeIs;
  220. BYTE Data[0];
  221. } Ndr64;
  222. };
  223. } /*__packed*/ RPC_REQUEST64;
  224. typedef struct {
  225. DWORD AllocHint;
  226. WORD ContextId;
  227. BYTE CancelCount;
  228. BYTE Pad1;
  229. union {
  230. struct {
  231. DWORD DataLength;
  232. DWORD DataSizeMax;
  233. union
  234. {
  235. DWORD DataSizeIs;
  236. DWORD status;
  237. };
  238. BYTE Data[0];
  239. } Ndr;
  240. struct {
  241. uint64_t DataLength;
  242. uint64_t DataSizeMax;
  243. union
  244. {
  245. uint64_t DataSizeIs;
  246. DWORD status;
  247. };
  248. BYTE Data[0];
  249. } Ndr64;
  250. };
  251. } /*__packed*/ RPC_RESPONSE64;
  252. //#define RpcCtx SOCKET
  253. typedef SOCKET RpcCtx;
  254. typedef int RpcStatus;
  255. #define INVALID_NDR_CTX ((WORD)~0)
  256. #define RPC_BIND_ACCEPT (0)
  257. #define RPC_BIND_NACK (LE16(2))
  258. #define RPC_BIND_ACK (LE16(3))
  259. #define RPC_SYNTAX_UNSUPPORTED (LE16(2))
  260. #define RPC_ABSTRACTSYNTAX_UNSUPPORTED (LE16(1))
  261. #define RPC_BTFN_SEC_CONTEXT_MULTIPLEX (LE16(1))
  262. #define RPC_BTFN_KEEP_ORPHAN (LE16(2))
  263. #define INVALID_RPCCTX INVALID_SOCKET
  264. #define closeRpc socketclose
  265. #define RPC_PT_REQUEST 0
  266. #define RPC_PT_RESPONSE 2
  267. #define RPC_PT_BIND_REQ 11
  268. #define RPC_PT_BIND_ACK 12
  269. #define RPC_PT_ALTERCONTEXT_REQ 14
  270. #define RPC_PT_ALTERCONTEXT_ACK 15
  271. #define RPC_PF_FIRST 1
  272. #define RPC_PF_LAST 2
  273. #define RPC_PF_CANCEL_PENDING 4
  274. #define RPC_PF_RESERVED 8
  275. #define RPC_PF_MULTIPLEX 16
  276. #define RPC_PF_NOT_EXEC 32
  277. #define RPC_PF_MAYBE 64
  278. #define RPC_PF_OBJECT 128
  279. typedef union _RPC_FLAGS
  280. {
  281. DWORD mask;
  282. struct {
  283. uint32_t FlagsBTFN : 16;
  284. BOOL HasNDR32 : 1;
  285. BOOL HasNDR64 : 1;
  286. BOOL HasBTFN : 1;
  287. };
  288. } RPC_FLAGS, *PRPC_FLAGS;
  289. extern RPC_FLAGS RpcFlags;
  290. void rpcServer(const SOCKET sock, const DWORD RpcAssocGroup, const char* const ipstr);
  291. RpcStatus rpcBindClient(const RpcCtx sock, const int_fast8_t verbose);
  292. RpcStatus rpcSendRequest(const RpcCtx socket, const BYTE *const KmsRequest, const size_t requestSize, BYTE **KmsResponse, size_t *const responseSize);
  293. #endif // __rpc_h