msrpc loop-back interface.
void msrpc_close_socket(struct msrpc_state *msrpc);
void msrpc_sockopt(struct msrpc_state *msrpc, char *options);
BOOL msrpc_connect_auth(struct msrpc_state *msrpc,
+ uint32 pid,
const char* pipename,
const struct user_creds *usr);
-struct msrpc_state *msrpc_initialise(struct msrpc_state *msrpc);
+struct msrpc_state *msrpc_initialise(struct msrpc_state *msrpc, uint32 pid);
void msrpc_shutdown(struct msrpc_state *msrpc);
BOOL msrpc_establish_connection(struct msrpc_state *msrpc,
const char *pipe_name);
void init_msrpc_use(void);
void free_msrpc_use(void);
struct msrpc_state *msrpc_use_add(const char* pipe_name,
+ uint32 pid,
const struct user_creds *usr_creds,
BOOL redir);
BOOL msrpc_use_del(const char* pipe_name,
BOOL create_ntuser_creds( prs_struct *ps,
const char* name,
uint16 version, uint16 command,
+ uint32 pid,
const struct ntuser_creds *ntu,
BOOL reuse);
BOOL create_user_creds( prs_struct *ps,
const char* name,
uint16 version, uint16 command,
+ uint32 pid,
const struct user_creds *usr);
/*The following definitions come from rpc_parse/parse_lsa.c */
typedef struct user_creds
{
BOOL reuse;
+
uint32 ptr_ntc;
uint32 ptr_uxc;
uint32 ptr_nts;
{
uint16 version;
uint16 command;
+ uint32 pid; /* unique process id */
fstring name;
BOOL initialised;
char *inbuf;
char *outbuf;
+
+ uint32 pid;
};
#include "client.h"
#include "rpcclient.h"
command = usr != NULL ? AGENT_CMD_CON : AGENT_CMD_CON_ANON;
- if (!create_user_creds(&ps, msrpc->pipe_name, 0x0, command, usr))
+ if (!create_user_creds(&ps, msrpc->pipe_name, 0x0, command,
+ msrpc->pid, usr))
{
DEBUG(0,("could not parse credentials\n"));
close(sock);
}
BOOL msrpc_connect_auth(struct msrpc_state *msrpc,
+ uint32 pid,
const char* pipename,
const struct user_creds *usr)
{
ZERO_STRUCTP(msrpc);
- if (!msrpc_initialise(msrpc))
+ if (!msrpc_initialise(msrpc, pid))
{
DEBUG(0,("unable to initialise msrpcent connection.\n"));
return False;
/****************************************************************************
initialise a msrpcent structure
****************************************************************************/
-struct msrpc_state *msrpc_initialise(struct msrpc_state *msrpc)
+struct msrpc_state *msrpc_initialise(struct msrpc_state *msrpc, uint32 pid)
{
if (!msrpc) {
msrpc = (struct msrpc_state *)malloc(sizeof(*msrpc));
msrpc->initialised = 1;
msrpc_init_creds(msrpc, NULL);
+ msrpc->pid = pid;
return msrpc;
}
DEBUG(10,("msrpc_find: %s %s %s\n",
pipe_name,
- usr_creds->ntc.user_name,
- usr_creds->ntc.domain));
+ usr_creds != NULL ? usr_creds->ntc.user_name : "null",
+ usr_creds != NULL ? usr_creds->ntc.domain : "null"));
for (i = 0; i < num_msrpcs; i++)
{
create a new client state from user credentials
****************************************************************************/
static struct msrpc_use *msrpc_use_get(const char* pipe_name,
+ uint32 pid,
const struct user_creds *usr_creds)
{
struct msrpc_use *cli = (struct msrpc_use*)malloc(sizeof(*cli));
memset(cli, 0, sizeof(*cli));
- cli->cli = msrpc_initialise(NULL);
+ cli->cli = msrpc_initialise(NULL, pid);
if (cli->cli == NULL)
{
init client state
****************************************************************************/
struct msrpc_state *msrpc_use_add(const char* pipe_name,
+ uint32 pid,
const struct user_creds *usr_creds,
BOOL redir)
{
* allocate
*/
- cli = msrpc_use_get(pipe_name, usr_creds);
+ cli = msrpc_use_get(pipe_name, pid, usr_creds);
cli->cli->redirect = redir;
if (!msrpc_establish_connection(cli->cli, pipe_name))
prs_align(ps);
prs_uint32("reuse", ps, depth, &(r_u->reuse));
+
prs_uint32("ptr_ntc", ps, depth, &(r_u->ptr_ntc));
prs_uint32("ptr_uxc", ps, depth, &(r_u->ptr_uxc));
prs_uint32("ptr_nts", ps, depth, &(r_u->ptr_nts));
to->reuse = False;
return;
}
+
+ to->reuse = from->reuse;
+
to->ptr_nts = from->ptr_nts;
to->ptr_uxs = from->ptr_uxs;
to->ptr_ntc = from->ptr_ntc;
to->ptr_uxc = from->ptr_uxc;
to->ptr_ssk = from->ptr_ssk;
+
if (to->ptr_ntc != 0)
{
copy_nt_creds(&to->ntc, &from->ntc);
memcpy(to->usr_sess_key, from->usr_sess_key,
sizeof(to->usr_sess_key));
}
- to->reuse = from->reuse;
};
void free_user_creds(struct user_creds *creds)
prs_uint16("version", ps, depth, &(r_u->version));
prs_uint16("command", ps, depth, &(r_u->command));
+ prs_uint32("pid ", ps, depth, &(r_u->pid ));
prs_string("name ", ps, depth, r_u->name, strlen(r_u->name), sizeof(r_u->name));
prs_align(ps);
BOOL create_ntuser_creds( prs_struct *ps,
const char* name,
uint16 version, uint16 command,
+ uint32 pid,
const struct ntuser_creds *ntu,
BOOL reuse)
{
fstrcpy(cmd.name, name);
cmd.version = version;
cmd.command = command;
+ cmd.pid = pid ;
cmd.ptr_creds = ntu != NULL ? 1 : 0;
cmd.cred = &usr;
BOOL create_user_creds( prs_struct *ps,
const char* name,
uint16 version, uint16 command,
+ uint32 pid,
const struct user_creds *usr)
{
CREDS_CMD cmd;
fstrcpy(cmd.name, name);
cmd.version = version;
cmd.command = command;
+ cmd.pid = pid ;
cmd.ptr_creds = usr != NULL ? 1 : 0;
cmd.cred = usr;
*/
become_root(False); /* to connect to pipe */
- m = msrpc_use_add(pipe_name, &usr, False);
+ m = msrpc_use_add(pipe_name, getpid(), &usr, False);
unbecome_root(False);
if (m == NULL)