rpc.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. typedef struct {
  9. BYTE VersionMajor;
  10. BYTE VersionMinor;
  11. BYTE PacketType;
  12. BYTE PacketFlags;
  13. DWORD DataRepresentation;
  14. WORD FragLength;
  15. WORD AuthLength;
  16. DWORD CallId;
  17. } /*__packed*/ RPC_HEADER;
  18. typedef struct {
  19. WORD MaxXmitFrag;
  20. WORD MaxRecvFrag;
  21. DWORD AssocGroup;
  22. DWORD NumCtxItems;
  23. struct {
  24. WORD ContextId;
  25. WORD NumTransItems;
  26. GUID InterfaceUUID;
  27. WORD InterfaceVerMajor;
  28. WORD InterfaceVerMinor;
  29. GUID TransferSyntax;
  30. DWORD SyntaxVersion;
  31. } CtxItems[1];
  32. } /*__packed*/ RPC_BIND_REQUEST;
  33. typedef struct {
  34. WORD MaxXmitFrag;
  35. WORD MaxRecvFrag;
  36. DWORD AssocGroup;
  37. WORD SecondaryAddressLength;
  38. BYTE SecondaryAddress[6];
  39. DWORD NumResults;
  40. struct {
  41. WORD AckResult;
  42. WORD AckReason;
  43. GUID TransferSyntax;
  44. DWORD SyntaxVersion;
  45. } Results[0];
  46. } /*__packed*/ RPC_BIND_RESPONSE;
  47. typedef struct {
  48. DWORD AllocHint;
  49. WORD ContextId;
  50. WORD Opnum;
  51. struct {
  52. DWORD DataLength;
  53. DWORD DataSizeIs;
  54. } Ndr;
  55. BYTE Data[0];
  56. } /*__packed*/ RPC_REQUEST;
  57. typedef struct {
  58. DWORD AllocHint;
  59. WORD ContextId;
  60. BYTE CancelCount;
  61. BYTE Pad1;
  62. struct {
  63. DWORD DataLength;
  64. DWORD DataSizeIs1;
  65. DWORD DataSizeIs2;
  66. } Ndr;
  67. BYTE Data[0];
  68. } /*__packed*/ RPC_RESPONSE;
  69. typedef struct {
  70. DWORD AllocHint;
  71. WORD ContextId;
  72. WORD Opnum;
  73. union {
  74. struct {
  75. DWORD DataLength;
  76. DWORD DataSizeIs;
  77. BYTE Data[0];
  78. } Ndr;
  79. struct {
  80. uint64_t DataLength;
  81. uint64_t DataSizeIs;
  82. BYTE Data[0];
  83. } Ndr64;
  84. };
  85. } /*__packed*/ RPC_REQUEST64;
  86. typedef struct {
  87. DWORD AllocHint;
  88. WORD ContextId;
  89. BYTE CancelCount;
  90. BYTE Pad1;
  91. union {
  92. struct {
  93. DWORD DataLength;
  94. DWORD DataSizeMax;
  95. union
  96. {
  97. DWORD DataSizeIs;
  98. DWORD status;
  99. };
  100. BYTE Data[0];
  101. } Ndr;
  102. struct {
  103. uint64_t DataLength;
  104. uint64_t DataSizeMax;
  105. union
  106. {
  107. uint64_t DataSizeIs;
  108. DWORD status;
  109. };
  110. BYTE Data[0];
  111. } Ndr64;
  112. };
  113. } /*__packed*/ RPC_RESPONSE64;
  114. typedef SOCKET RpcCtx;
  115. typedef int RpcStatus;
  116. #define INVALID_NDR_CTX ((WORD)~0)
  117. #define RPC_BIND_ACCEPT (0)
  118. #define RPC_BIND_NACK (LE16(2))
  119. #define RPC_BIND_ACK (LE16(3))
  120. #define RPC_SYNTAX_UNSUPPORTED (LE16(2))
  121. #define RPC_ABSTRACTSYNTAX_UNSUPPORTED (LE16(1))
  122. #define RPC_BTFN_SEC_CONTEXT_MULTIPLEX (LE16(1))
  123. #define RPC_BTFN_KEEP_ORPHAN (LE16(2))
  124. #define INVALID_RPCCTX INVALID_SOCKET
  125. #define closeRpc socketclose
  126. #define RPC_PT_REQUEST 0
  127. #define RPC_PT_RESPONSE 2
  128. #define RPC_PT_BIND_REQ 11
  129. #define RPC_PT_BIND_ACK 12
  130. #define RPC_PT_ALTERCONTEXT_REQ 14
  131. #define RPC_PT_ALTERCONTEXT_ACK 15
  132. #define RPC_PF_FIRST 1
  133. #define RPC_PF_LAST 2
  134. #define RPC_PF_CANCEL_PENDING 4
  135. #define RPC_PF_RESERVED 8
  136. #define RPC_PF_MULTIPLEX 16
  137. #define RPC_PF_NOT_EXEC 32
  138. #define RPC_PF_MAYBE 64
  139. #define RPC_PF_OBJECT 128
  140. typedef union _RPC_FLAGS
  141. {
  142. DWORD mask;
  143. struct {
  144. uint32_t FlagsBTFN : 16;
  145. BOOL HasNDR32 : 1;
  146. BOOL HasNDR64 : 1;
  147. BOOL HasBTFN : 1;
  148. };
  149. } RPC_FLAGS, *PRPC_FLAGS;
  150. extern RPC_FLAGS RpcFlags;
  151. void rpcServer(const RpcCtx socket, const DWORD RpcAssocGroup, const char* const ipstr);
  152. RpcStatus rpcBindClient(const RpcCtx sock, const int_fast8_t verbose);
  153. RpcStatus rpcSendRequest(const RpcCtx socket, const BYTE *const KmsRequest, const size_t requestSize, BYTE **KmsResponse, size_t *const responseSize);
  154. #endif // __rpc_h