1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include "ntccrpc.h"
#include <strsafe.h>
#include "CredentialsCache.h"
#include "msg.h"
static RPC_BINDING_HANDLE hRpcBinding;
void * __RPC_USER MIDL_user_allocate(size_t s) {
return malloc(s);
}
void __RPC_USER MIDL_user_free(void * p) {
free(p);
}
int cc_rpc_init(void) {
RPC_STATUS status;
TCHAR * bindstring = NULL;
RPC_SECURITY_QOS sqos;
status = RpcStringBindingCompose(NULL,
_T("ncalrpc"),
NULL,
NULL,
NULL,
&bindstring);
if (status != RPC_S_OK) {
fprintf(stderr, "RpcStringBindingCompose failed: %d\n",
status);
return 1;
}
status = RpcBindingFromStringBinding(bindstring,
&hRpcBinding);
if (status != RPC_S_OK) {
fprintf(stderr, "RpcBindingFromStringBinding failed: %d\n",
status);
return 1;
}
status = RpcStringFree(&bindstring);
ZeroMemory(&sqos, sizeof(sqos));
sqos.Version = 1;
sqos.Capabilities = RPC_C_QOS_CAPABILITIES_DEFAULT;
sqos.IdentityTracking = RPC_C_QOS_IDENTITY_STATIC;
sqos.ImpersonationType = RPC_C_IMP_LEVEL_IMPERSONATE;
status = RpcBindingSetAuthInfoEx(hRpcBinding,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_AUTHN_WINNT,
NULL,
0,
&sqos);
if (status != RPC_S_OK) {
fprintf(stderr, "RpcBindingSetAuthInfoEx failed: %d\n",
status);
return 1;
}
return 0;
}
int cc_rpc_cleanup(void) {
RPC_STATUS status;
status = RpcBindingFree(&hRpcBinding);
return 0;
}
cc_int32 cci_set_thread_session_id(unsigned char * client_name, LUID luid) {
return 0;
}
void cci_get_thread_session_id(unsigned char * client_name, int len, LUID *pluid) {
client_name[0] = '\0';
pluid->HighPart = 0;
pluid->LowPart = 0;
}
/* __int32 ccapi_Message(
* [in] handle_t h,
* [string][in] unsigned char *client_name,
* [in] struct _LUID luid,
* [in] __int32 cb_buffer,
* [out] __int32 *cb_len,
* [size_is][string][out] unsigned char buffer[ ]);
*/
cc_int32 cci_perform_rpc(cc_msg_t *request, cc_msg_t **response)
{
cc_int32 code;
unsigned char client_name[256];
LUID luid;
struct __LUID __luid;
unsigned char out_buf[MAXMSGLEN];
__int32 out_len = MAXMSGLEN;
if (cc_rpc_init())
return -1;
cci_get_thread_session_id(client_name, sizeof(client_name), &luid);
__luid.HighPart = luid.HighPart;
__luid.LowPart = luid.LowPart;
/* flatten response */
code = cci_msg_flatten(request, NULL);
if (code)
goto cleanup;
RpcTryExcept {
code = ccapi_Message(hRpcBinding, client_name, __luid,
request->flat, request->flat_len,
out_buf, &out_len);
}
RpcExcept(1) {
code = RpcExceptionCode();
}
RpcEndExcept;
if (code)
goto cleanup;
/* unflatten message */
code = cci_msg_unflatten(out_buf, out_len, response);
if (code)
goto cleanup;
cleanup:
return code;
}
|