summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h13
-rw-r--r--source3/include/rpc_reg.h48
-rw-r--r--source3/rpc_parse/parse_reg.c157
-rw-r--r--source3/rpc_server/srv_reg.c24
4 files changed, 125 insertions, 117 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 0cc0546b88..b19d3d8f5c 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -2071,7 +2071,7 @@ BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int
/*The following definitions come from rpc_parse/parse_prs.c */
-void prs_dump(char *name, int level, prs_struct *ps);
+void prs_dump(char *name, int v, prs_struct *ps);
void prs_debug(prs_struct *ps, int depth, char *desc, char *fn_name);
BOOL prs_init(prs_struct *ps, uint32 size, uint8 align, BOOL io);
BOOL prs_read(prs_struct *ps, int fd, size_t len, int timeout);
@@ -2154,13 +2154,10 @@ void init_reg_q_get_key_sec(REG_Q_GET_KEY_SEC *q_i, POLICY_HND *pol,
uint32 sec_buf_size, SEC_DESC_BUF *psdb);
BOOL reg_io_q_get_key_sec(char *desc, REG_Q_GET_KEY_SEC *r_q, prs_struct *ps, int depth);
BOOL reg_io_r_get_key_sec(char *desc, REG_R_GET_KEY_SEC *r_q, prs_struct *ps, int depth);
-void init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char *product_type,
- time_t unix_time, uint8 major, uint8 minor);
+BOOL init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char* val_name);
BOOL reg_io_q_info(char *desc, REG_Q_INFO *r_q, prs_struct *ps, int depth);
-void init_reg_r_info(REG_R_INFO *r_r,
- uint32 level, char *os_type,
- uint32 unknown_0, uint32 unknown_1,
- uint32 status);
+BOOL init_reg_r_info(uint32 include_keyval, REG_R_INFO *r_r,
+ BUFFER2* buf, uint32 type, uint32 status);
BOOL reg_io_r_info(char *desc, REG_R_INFO *r_r, prs_struct *ps, int depth);
void init_reg_q_enum_val(REG_Q_ENUM_VALUE *q_i, POLICY_HND *pol,
uint32 val_idx, uint32 max_val_len,
@@ -2725,6 +2722,8 @@ BOOL api_netlog_rpc(pipes_struct *p, prs_struct *data);
BOOL create_next_pdu(pipes_struct *p);
BOOL api_pipe_bind_auth_resp(pipes_struct *p, prs_struct *rpc_in_p);
BOOL setup_fault_pdu(pipes_struct *p);
+BOOL check_bind_req(char* pipe_name, RPC_IFACE* abstract,
+ RPC_IFACE* transfer);
BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p);
BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in);
BOOL api_pipe_request(pipes_struct *p);
diff --git a/source3/include/rpc_reg.h b/source3/include/rpc_reg.h
index 7766052588..103a7492cd 100644
--- a/source3/include/rpc_reg.h
+++ b/source3/include/rpc_reg.h
@@ -396,43 +396,43 @@ typedef struct r_reg_enum_key_info
/* REG_Q_INFO */
typedef struct q_reg_info_info
{
- POLICY_HND pol; /* policy handle */
+ POLICY_HND pol; /* policy handle */
- UNIHDR hdr_type; /* unicode product type header */
- UNISTR2 uni_type; /* unicode product type - "ProductType" */
+ UNIHDR hdr_type; /* unicode product type header */
+ UNISTR2 uni_type; /* unicode product type - "ProductType" */
- uint32 ptr1; /* pointer */
- NTTIME time; /* current time? */
- uint8 major_version1; /* 0x4 - os major version? */
- uint8 minor_version1; /* 0x1 - os minor version? */
- uint8 pad1[10]; /* padding - zeros */
+ uint32 ptr_reserved;
+
+ uint32 ptr_buf; /* the next three fields follow if ptr_buf != 0 */
+ uint32 ptr_bufsize;
+ uint32 bufsize;
+ uint32 buf_unk;
- uint32 ptr2; /* pointer */
- uint8 major_version2; /* 0x4 - os major version? */
- uint8 minor_version2; /* 0x1 - os minor version? */
- uint8 pad2[2]; /* padding - zeros */
-
- uint32 ptr3; /* pointer */
- uint32 unknown; /* 0x0000 0000 */
+ uint32 unk1;
+ uint32 ptr_buflen;
+ uint32 buflen;
+
+ uint32 ptr_buflen2;
+ uint32 buflen2;
} REG_Q_INFO;
/* REG_R_INFO */
typedef struct r_reg_info_info
{
- uint32 ptr1; /* buffer pointer */
- uint32 level; /* 0x1 - info level? */
+ uint32 ptr_type; /* keyvalue pointer */
+ uint32 type; /* keyvalue datatype */
- uint32 ptr_type; /* pointer to o/s type */
- BUFFER2 uni_type; /* unicode string o/s type - "LanmanNT" */
+ uint32 ptr_uni_val; /* pointer to o/s type */
+ BUFFER2 *uni_val; /* unicode string o/s type - "LanmanNT" */
- uint32 ptr2; /* pointer to unknown_0 */
- uint32 unknown_0; /* 0x12 */
+ uint32 ptr_max_len; /* pointer to unknown_0 */
+ uint32 buf_max_len; /* 0x12 */
- uint32 ptr3; /* pointer to unknown_1 */
- uint32 unknown_1; /* 0x12 */
+ uint32 ptr_len; /* pointer to unknown_1 */
+ uint32 buf_len; /* 0x12 */
- uint32 status; /* return status */
+ uint32 status; /* return status */
} REG_R_INFO;
diff --git a/source3/rpc_parse/parse_reg.c b/source3/rpc_parse/parse_reg.c
index cc970e4150..e757245f7c 100644
--- a/source3/rpc_parse/parse_reg.c
+++ b/source3/rpc_parse/parse_reg.c
@@ -868,29 +868,33 @@ BOOL reg_io_r_get_key_sec(char *desc, REG_R_GET_KEY_SEC *r_q, prs_struct *ps, i
makes a structure.
********************************************************************/
-void init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char *product_type,
- time_t unix_time, uint8 major, uint8 minor)
+BOOL init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char* val_name)
{
- int len_type = strlen(product_type);
+ int len_type = val_name != NULL ? strlen(val_name) + 1 : 0;
- memcpy(&q_i->pol, pol, sizeof(q_i->pol));
+ if (q_i == NULL)
+ return False;
- init_uni_hdr(&q_i->hdr_type, len_type);
- init_unistr2(&q_i->uni_type, product_type, len_type);
+ q_i->pol = *pol;
- q_i->ptr1 = 1;
- unix_to_nt_time(&q_i->time, unix_time);
- q_i->major_version1 = major;
- q_i->minor_version1 = minor;
- memset(q_i->pad1, 0, sizeof(q_i->pad1));
+ init_uni_hdr(&(q_i->hdr_type), len_type);
+ init_unistr2(&(q_i->uni_type), val_name, len_type);
- q_i->ptr2 = 1;
- q_i->major_version2 = major;
- q_i->minor_version2 = minor;
- memset(q_i->pad2, 0, sizeof(q_i->pad2));
+ q_i->ptr_reserved = 1;
+ q_i->ptr_buf = 1;
- q_i->ptr3 = 1;
- q_i->unknown = 0x00000000;
+ q_i->ptr_bufsize = 1;
+ q_i->bufsize = 0;
+ q_i->buf_unk = 0;
+
+ q_i->unk1 = 0;
+ q_i->ptr_buflen = 1;
+ q_i->buflen = 0;
+
+ q_i->ptr_buflen2 = 1;
+ q_i->buflen2 = 0;
+
+ return True;
}
/*******************************************************************
@@ -918,68 +922,66 @@ BOOL reg_io_q_info(char *desc, REG_Q_INFO *r_q, prs_struct *ps, int depth)
if(!prs_align(ps))
return False;
- if(!prs_uint32("ptr1", ps, depth, &r_q->ptr1))
+ if(!prs_uint32("ptr_reserved", ps, depth, &(r_q->ptr_reserved)))
return False;
- if (r_q->ptr1 != 0) {
- if(!smb_io_time("", &r_q->time, ps, depth))
- return False;
- if(!prs_uint8 ("major_version1", ps, depth, &r_q->major_version1))
- return False;
- if(!prs_uint8 ("minor_version1", ps, depth, &r_q->minor_version1))
- return False;
- if(!prs_uint8s(False, "pad1", ps, depth, r_q->pad1, sizeof(r_q->pad1)))
- return False;
- }
-
- if(!prs_uint32("ptr2", ps, depth, &r_q->ptr2))
+ if(!prs_uint32("ptr_buf", ps, depth, &(r_q->ptr_buf)))
return False;
- if (r_q->ptr2 != 0) {
- if(!prs_uint8 ("major_version2", ps, depth, &r_q->major_version2))
+ if(r_q->ptr_buf) {
+ if(!prs_uint32("ptr_bufsize", ps, depth, &(r_q->ptr_bufsize)))
return False;
- if(!prs_uint8 ("minor_version2", ps, depth, &r_q->minor_version2))
+ if(!prs_uint32("bufsize", ps, depth, &(r_q->bufsize)))
return False;
- if(!prs_uint8s(False, "pad2", ps, depth, r_q->pad2, sizeof(r_q->pad2)))
+ if(!prs_uint32("buf_unk", ps, depth, &(r_q->buf_unk)))
return False;
}
- if(!prs_uint32("ptr3", ps, depth, &r_q->ptr3))
+ if(!prs_uint32("unk1", ps, depth, &(r_q->unk1)))
return False;
- if (r_q->ptr3 != 0) {
- if(!prs_uint32("unknown", ps, depth, &r_q->unknown))
- return False;
- }
+ if(!prs_uint32("ptr_buflen", ps, depth, &(r_q->ptr_buflen)))
+ return False;
+ if(!prs_uint32("buflen", ps, depth, &(r_q->buflen)))
+ return False;
- return True;
+ if(!prs_uint32("ptr_buflen2", ps, depth, &(r_q->ptr_buflen2)))
+ return False;
+ if(!prs_uint32("buflen2", ps, depth, &(r_q->buflen2)))
+ return False;
+
+ return True;
}
/*******************************************************************
Inits a structure.
********************************************************************/
-void init_reg_r_info(REG_R_INFO *r_r,
- uint32 level, char *os_type,
- uint32 unknown_0, uint32 unknown_1,
- uint32 status)
+BOOL init_reg_r_info(uint32 include_keyval, REG_R_INFO *r_r,
+ BUFFER2* buf, uint32 type, uint32 status)
{
- uint8 buf[512];
- int len = dos_struni2((char *)buf, os_type, sizeof(buf));
+ if(r_r == NULL)
+ return False;
- r_r->ptr1 = 1;
- r_r->level = level;
+
+ r_r->ptr_type = 1;
+ r_r->type = type;
- r_r->ptr_type = 1;
- init_buffer2(&r_r->uni_type, buf, len*2);
+ /* if include_keyval is not set, don't send the key value, just
+ the buflen data. probably used by NT5 to allocate buffer space - SK */
+ r_r->ptr_uni_val = include_keyval ? 1:0;
+ r_r->uni_val = buf;
- r_r->ptr2 = 1;
- r_r->unknown_0 = unknown_0;
+ r_r->ptr_max_len = 1;
+ r_r->buf_max_len = r_r->uni_val->buf_max_len;
- r_r->ptr3 = 1;
- r_r->unknown_1 = unknown_1;
+ r_r->ptr_len = 1;
+ r_r->buf_len = r_r->uni_val->buf_len;
- r_r->status = status;
+ r_r->status = status;
+
+ return True;
+
}
/*******************************************************************
@@ -997,41 +999,44 @@ BOOL reg_io_r_info(char *desc, REG_R_INFO *r_r, prs_struct *ps, int depth)
if(!prs_align(ps))
return False;
- if(!prs_uint32("ptr1", ps, depth, &r_r->ptr1))
+ if(!prs_uint32("ptr_type", ps, depth, &(r_r->ptr_type)))
return False;
- if (r_r->ptr1 != 0) {
- if(!prs_uint32("level", ps, depth, &r_r->level))
- return False;
- if(!prs_uint32("ptr_type", ps, depth, &r_r->ptr_type))
+ if (r_r->ptr_type != 0) {
+ if(!prs_uint32("type", ps, depth, &r_r->type))
return False;
+ }
- if(!smb_io_buffer2("uni_type", &r_r->uni_type, r_r->ptr_type, ps, depth))
- return False;
- if(!prs_align(ps))
- return False;
+ if(!prs_uint32("ptr_uni_val", ps, depth, &(r_r->ptr_uni_val)))
+ return False;
- if(!prs_uint32("ptr2", ps, depth, &r_r->ptr2))
+ if(r_r->ptr_uni_val != 0) {
+ if(!smb_io_buffer2("uni_val", r_r->uni_val, r_r->ptr_uni_val, ps, depth))
return False;
+ }
- if (r_r->ptr2 != 0) {
- if(!prs_uint32("unknown_0", ps, depth, &r_r->unknown_0))
- return False;
- }
+ if(!prs_align(ps))
+ return False;
- if(!prs_uint32("ptr3", ps, depth, &r_r->ptr3))
- return False;
+ if(!prs_uint32("ptr_max_len", ps, depth, &(r_r->ptr_max_len)))
+ return False;
- if (r_r->ptr3 != 0) {
- if(!prs_uint32("unknown_1", ps, depth, &r_r->unknown_1))
- return False;
- }
+ if (r_r->ptr_max_len != 0) {
+ if(!prs_uint32("buf_max_len", ps, depth, &(r_r->buf_max_len)))
+ return False;
+ }
+ if(!prs_uint32("ptr_len", ps, depth, &(r_r->ptr_len)))
+ return False;
+ if (r_r->ptr_len != 0) {
+ if(!prs_uint32("buf_len", ps, depth, &(r_r->buf_len)))
+ return False;
}
+
if(!prs_uint32("status", ps, depth, &r_r->status))
return False;
- return True;
+ return True;
}
/*******************************************************************
diff --git a/source3/rpc_server/srv_reg.c b/source3/rpc_server/srv_reg.c
index 6a8d803c2e..cba24d7dfb 100644
--- a/source3/rpc_server/srv_reg.c
+++ b/source3/rpc_server/srv_reg.c
@@ -23,6 +23,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+
#include "includes.h"
extern int DEBUGLEVEL;
@@ -59,7 +60,7 @@ static void reg_reply_close(REG_Q_CLOSE *q_r,
/*******************************************************************
api_reg_close
********************************************************************/
-static BOOL api_reg_close(prs_struct *data, prs_struct *rdata)
+static BOOL api_reg_close(prs_struct *data, prs_struct *rdata )
{
REG_Q_CLOSE q_r;
@@ -99,7 +100,7 @@ static void reg_reply_open(REG_Q_OPEN_HKLM *q_r,
/*******************************************************************
api_reg_open
********************************************************************/
-static BOOL api_reg_open(prs_struct *data, prs_struct *rdata)
+static BOOL api_reg_open(prs_struct *data, prs_struct *rdata )
{
REG_Q_OPEN_HKLM q_u;
@@ -164,7 +165,7 @@ static void reg_reply_open_entry(REG_Q_OPEN_ENTRY *q_u,
/*******************************************************************
api_reg_open_entry
********************************************************************/
-static BOOL api_reg_open_entry(prs_struct *data, prs_struct *rdata)
+static BOOL api_reg_open_entry(prs_struct *data, prs_struct *rdata )
{
REG_Q_OPEN_ENTRY q_u;
@@ -185,6 +186,11 @@ static void reg_reply_info(REG_Q_INFO *q_u,
prs_struct *rdata)
{
uint32 status = 0;
+ fstring key = "ServerNT"; /* always a non-PDC */
+ uint32 type=0x1; /* key type: REG_SZ */
+
+ UNISTR2 uni_key;
+ BUFFER2 buf;
REG_R_INFO r_u;
@@ -195,14 +201,13 @@ static void reg_reply_info(REG_Q_INFO *q_u,
status = 0xC000000 | NT_STATUS_INVALID_HANDLE;
}
- if (status == 0)
- {
- }
-
/* This makes the server look like a member server to clients */
/* which tells clients that we have our own local user and */
/* group databases and helps with ACL support. */
- init_reg_r_info(&r_u, 1, "ServerNT", 0x12, 0x12, status);
+ init_unistr2(&uni_key, key, strlen(key)+1);
+ init_buffer2(&buf, (uint8*) uni_key.buffer, uni_key.uni_str_len*2);
+
+ init_reg_r_info(q_u->ptr_buf, &r_u, &buf, type, status);
/* store the response in the SMB stream */
reg_io_r_info("", &r_u, rdata, 0);
@@ -213,7 +218,7 @@ static void reg_reply_info(REG_Q_INFO *q_u,
/*******************************************************************
api_reg_info
********************************************************************/
-static BOOL api_reg_info(prs_struct *data, prs_struct *rdata)
+static BOOL api_reg_info(prs_struct *data, prs_struct *rdata )
{
REG_Q_INFO q_u;
@@ -246,5 +251,4 @@ BOOL api_reg_rpc(pipes_struct *p, prs_struct *data)
{
return api_rpcTNP(p, "api_reg_rpc", api_reg_cmds, data);
}
-
#undef OLD_NTDOMAIN