SamrAddMemberToGroup
SamrAddMultipleMembersToAlias
SamrChangePasswordUser
-SamrCloseHandle
-SamrConnect
+x SamrCloseHandle
+x SamrConnect
SamrCreateAliasInDomain
SamrCreateGroupInDomain
SamrCreateUserInDomain
SamrDeleteAlias
SamrDeleteGroup
SamrDeleteUser
-SamrEnumerateAliasesInDomain
+x SamrEnumerateAliasesInDomain
SamrEnumerateDomainsInSamServer
-SamrEnumerateGroupsInDomain
-SamrEnumerateUsersInDomain
+x SamrEnumerateGroupsInDomain
+x SamrEnumerateUsersInDomain
SamrGetUserDomainPasswordInformation
SamrLookupDomainInSamServer
SamrLookupIdsInDomain
SamrLookupNamesInDomain
-SamrOpenAlias
-SamrOpenDomain
+x SamrOpenAlias
+x SamrOpenDomain
SamrOpenGroup
SamrOpenUser
-SamrQueryDisplayInformation
-SamrQUeryInformationAlias
+x SamrQueryDisplayInformation
+x SamrQueryInformationAlias
SamrQueryInformationDomain
-SamrQueryInformationUser
+? SamrQueryInformationUser
SamrQuerySecurityObject
SamrRemoveMemberFromAlias
SamrRemoveMemberFromForiegnDomain
********************************************************************/
#define SAMR_CLOSE 0x01
-#define SAMR_OPEN_SECRET 0x07
+#define SAMR_CONNECT 0x07
#define SAMR_LOOKUP_RIDS 0x11
#define SAMR_UNKNOWN_3 0x03
#define SAMR_QUERY_DISPINFO 0x28
-#define SAMR_ENUM_SAM_DB 0x0d
#define SAMR_UNKNOWN_22 0x22
#define SAMR_UNKNOWN_24 0x24
#define SAMR_UNKNOWN_32 0x32
#define SAMR_UNKNOWN_34 0x34
-#define SAMR_OPEN_POLICY 0x39
-#define SAMR_ENUM_DOM_GRPS 0x0f
+#define SAMR_OPEN_DOMAIN 0x39
+#define SAMR_OPEN_ALIAS 0x1b
+#define SAMR_QUERY_ALIASINFO 0x1c
+#define SAMR_ENUM_DOM_USERS 0x0d
+#define SAMR_ENUM_DOM_ALIASES 0x0f
+#define SAMR_ENUM_DOM_GROUPS 0x30
#define LSA_OPENPOLICY 0x2c
#define LSA_QUERYINFOPOLICY 0x07
/****************************************************************************
-SAMR_Q_OPEN_SECRET - unknown_0 values seen associated with SIDs:
+SAMR_Q_CONNECT - unknown_0 values seen associated with SIDs:
0x0000 03f1 and a specific domain sid - S-1-5-21-44c01ca6-797e5c3d-33f83fd0
0x0000 0200 and a specific domain sid - S-1-5-21-44c01ca6-797e5c3d-33f83fd0
0x2000 0000 and a specific domain sid - S-1-5-21-44c01ca6-797e5c3d-33f83fd0
*****************************************************************************/
-/* SAMR_Q_OPEN_SECRET - probably an open secret */
-typedef struct q_samr_open_secret_info
+/* SAMR_Q_CONNECT - probably an open secret */
+typedef struct q_samr_connect_info
{
LSA_POL_HND pol; /* policy handle */
uint32 rid; /* 0x2000 0000; 0x0000 0211; 0x0000 0280; 0x0000 0200 - a RID? */
DOM_SID dom_sid; /* domain SID */
-} SAMR_Q_OPEN_SECRET;
+} SAMR_Q_CONNECT;
-/* SAMR_R_OPEN_SECRET - probably an open */
-typedef struct r_samr_open_secret_info
+/* SAMR_R_CONNECT - probably an open */
+typedef struct r_samr_connect_info
{
LSA_POL_HND pol; /* policy handle associated with the SID */
uint32 status; /* return status */
-} SAMR_R_OPEN_SECRET;
+} SAMR_R_CONNECT;
#define MAX_SAM_ENTRIES 250
typedef struct samr_entry_info
{
uint32 rid;
- UNIHDR hdr_acct_name;
+ UNIHDR hdr_name;
} SAM_ENTRY;
-/* SAMR_Q_ENUM_SAM_DB - SAM rids and names */
-typedef struct q_samr_sam_db_info
+/* SAMR_Q_ENUM_DOM_USERS - SAM rids and names */
+typedef struct q_samr_enum_dom_users_info
{
LSA_POL_HND pol; /* policy handle */
uint32 max_size; /* 0x0000 ffff */
-} SAMR_Q_ENUM_SAM_DB;
+} SAMR_Q_ENUM_DOM_USERS;
+
-/* SAMR_R_ENUM_SAM_DB - SAM rids and names */
-typedef struct q_samr_unknown_d_info
+/* SAMR_R_ENUM_DOM_USERS - SAM rids and names */
+typedef struct r_samr_enum_dom_users_info
{
uint32 num_entries;
uint32 ptr_entries;
uint32 status;
-} SAMR_R_ENUM_SAM_DB;
+} SAMR_R_ENUM_DOM_USERS;
+
+
+typedef struct samr_entry_info3
+{
+ uint32 grp_idx;
+
+ uint32 rid_grp;
+ uint32 attr;
+
+ UNIHDR hdr_grp_name;
+ UNIHDR hdr_grp_desc;
+
+} SAM_ENTRY3;
+
+typedef struct samr_str_entry_info3
+{
+ UNISTR2 uni_grp_name;
+ UNISTR2 uni_grp_desc;
+
+} SAM_STR3;
+
+/* SAMR_Q_ENUM_DOM_GROUPS - SAM rids and names */
+typedef struct q_samr_enum_dom_groups_info
+{
+ LSA_POL_HND pol; /* policy handle */
+
+ /* these are possibly an enumeration context handle... */
+ uint16 switch_level; /* 0x0003 */
+ uint16 unknown_0; /* 0x0000 */
+ uint32 start_idx; /* presumably the start enumeration index */
+ uint32 unknown_1; /* 0x0000 07d0 */
+
+ uint32 max_size; /* 0x0000 7fff */
+
+} SAMR_Q_ENUM_DOM_GROUPS;
+
+
+/* SAMR_R_ENUM_DOM_GROUPS - SAM rids and names */
+typedef struct r_samr_enum_dom_groups_info
+{
+ uint32 unknown_0; /* 0x0000 0492 or 0x0000 00be */
+ uint32 unknown_1; /* 0x0000 049a or 0x0000 00be */
+ uint32 switch_level; /* 0x0000 0003 */
+
+ uint32 num_entries;
+ uint32 ptr_entries;
+
+ uint32 num_entries2;
+
+ SAM_ENTRY3 sam[MAX_SAM_ENTRIES];
+ SAM_STR3 str[MAX_SAM_ENTRIES];
+
+ uint32 status;
+
+} SAMR_R_ENUM_DOM_GROUPS;
+
+
+
+/* SAMR_Q_ENUM_DOM_ALIASES - SAM rids and names */
+typedef struct q_samr_enum_dom_aliases_info
+{
+ LSA_POL_HND pol; /* policy handle */
+
+ /* this is possibly an enumeration context handle... */
+ uint32 unknown_0; /* 0x0000 0000 */
+
+ uint32 max_size; /* 0x0000 ffff */
+
+} SAMR_Q_ENUM_DOM_ALIASES;
+
+/* SAMR_R_ENUM_DOM_ALIASES - SAM rids and names */
+typedef struct r_samr_enum_dom_aliases_info
+{
+ uint32 num_entries;
+ uint32 ptr_entries;
+
+ uint32 num_entries2;
+ uint32 ptr_entries2;
+
+ uint32 num_entries3;
+
+ SAM_ENTRY sam[MAX_SAM_ENTRIES];
+ UNISTR2 uni_grp_name[MAX_SAM_ENTRIES];
+
+ uint32 num_entries4;
+
+ uint32 status;
+
+} SAMR_R_ENUM_DOM_ALIASES;
/* SAMR_Q_QUERY_DISPINFO - SAM rids, names and descriptions */
-typedef struct q_samr_enum_dom_user_info
+typedef struct q_samr_query_disp_info
{
LSA_POL_HND pol; /* policy handle */
- uint16 switch_level; /* 0x0001 */
+ uint16 switch_level; /* 0x0001 and 0x0002 seen */
uint16 unknown_0; /* 0x0000 and 0x2000 seen */
uint32 start_idx; /* presumably the start enumeration index */
uint32 unknown_1; /* 0x0000 07d0, 0x0000 0400 and 0x0000 0200 seen */
} SAMR_Q_QUERY_DISPINFO;
-typedef struct samr_entry_info2
+typedef struct samr_entry_info1
{
uint32 user_idx;
UNIHDR hdr_user_name;
UNIHDR hdr_user_desc;
-} SAM_ENTRY2;
+} SAM_ENTRY1;
-typedef struct samr_str_entry_info2
+typedef struct samr_str_entry_info1
{
UNISTR2 uni_acct_name;
UNISTR2 uni_full_name;
UNISTR2 uni_acct_desc;
-} SAM_STR2;
+} SAM_STR1;
/* SAMR_R_QUERY_DISPINFO - SAM rids, names and descriptions */
typedef struct r_samr_query_dispinfo_info
{
- uint32 unknown_0; /* 0x0000 0492 */
- uint32 unknown_1; /* 0x0000 049a */
- uint32 switch_level; /* 0x0000 0001 */
+ uint32 unknown_0; /* 0x0000 0492 or 0x0000 00be */
+ uint32 unknown_1; /* 0x0000 049a or 0x0000 00be */
+ uint32 switch_level; /* 0x0000 0001 or 0x0000 0002 */
uint32 num_entries;
uint32 ptr_entries;
uint32 num_entries2;
- SAM_ENTRY2 sam[MAX_SAM_ENTRIES];
- SAM_STR2 str[MAX_SAM_ENTRIES];
+ SAM_ENTRY1 sam[MAX_SAM_ENTRIES];
+ SAM_STR1 str[MAX_SAM_ENTRIES];
uint32 status;
+/* SAMR_Q_QUERY_ALIASINFO - SAM Alias Info */
+typedef struct q_samr_enum_alias_info
+{
+ LSA_POL_HND pol; /* policy handle */
+
+ uint16 switch_level; /* 0x0003 seen */
+
+} SAMR_Q_QUERY_ALIASINFO;
+
+typedef struct samr_alias_info3
+{
+ UNIHDR hdr_acct_desc;
+ UNISTR2 uni_acct_desc;
+
+} ALIAS_INFO3;
+
+/* SAMR_R_QUERY_ALIASINFO - SAM rids, names and descriptions */
+typedef struct r_samr_query_aliasinfo_info
+{
+ uint32 ptr;
+ uint16 switch_level; /* 0x0003 */
+ /* uint8[2] padding */
+
+ union
+ {
+ ALIAS_INFO3 info3;
+
+ } alias;
+
+ uint32 status;
+
+} SAMR_R_QUERY_ALIASINFO;
+
+
+
/****************************************************************************
SAMR_Q_LOOKUP_RIDS - do a conversion (only one!) from name to RID.
} SAMR_R_UNKNOWN_32;
-/* SAMR_Q_OPEN_POLICY - probably an open */
-typedef struct q_samr_open_policy_info
+/* SAMR_Q_OPEN_ALIAS - probably an open */
+typedef struct q_samr_open_alias_info
+{
+ uint32 unknown_0; /* 0x0000 0008 */
+ uint32 rid_alias; /* rid */
+
+} SAMR_Q_OPEN_ALIAS;
+
+
+/* SAMR_R_OPEN_ALIAS - probably an open */
+typedef struct r_samr_open_alias_info
+{
+ LSA_POL_HND pol; /* policy handle */
+ uint32 status; /* return status */
+
+} SAMR_R_OPEN_ALIAS;
+
+
+/* SAMR_Q_OPEN_DOMAIN - probably an open */
+typedef struct q_samr_open_domain_info
{
uint32 ptr_srv_name; /* pointer (to server name?) */
UNISTR2 uni_srv_name; /* unicode server name starting with '\\' */
uint32 unknown_0; /* 32 bit unknown */
-} SAMR_Q_OPEN_POLICY;
+} SAMR_Q_OPEN_DOMAIN;
-/* SAMR_R_OPEN_POLICY - probably an open */
-typedef struct r_samr_open_policy_info
+/* SAMR_R_OPEN_DOMAIN - probably an open */
+typedef struct r_samr_open_domain_info
{
LSA_POL_HND pol; /* policy handle */
uint32 status; /* return status */
-} SAMR_R_OPEN_POLICY;
+} SAMR_R_OPEN_DOMAIN;
/*The following definitions come from charset.c */
-void charset_initialise();
+void charset_initialise(void);
void codepage_initialise(int client_codepage);
void add_char_string(char *s);
void announce_server(struct subnet_record *d, struct work_record *work,
char *name, char *comment, time_t ttl, int server_type);
void announce_host(time_t t);
-void reset_announce_timer();
+void reset_announce_timer(void);
void announce_master(time_t t);
void announce_remote(time_t t);
BOOL do_samr_session_open(struct cli_state *cli, int t_idx, struct client_info *info);
void do_samr_session_close(struct cli_state *cli, int t_idx, struct client_info *info);
-BOOL do_samr_enum_sam_db(struct cli_state *cli, int t_idx, uint16 fnum,
+BOOL do_samr_enum_dom_users(struct cli_state *cli, int t_idx, uint16 fnum,
LSA_POL_HND *pol, uint32 size,
struct acct_info sam[MAX_SAM_ENTRIES],
int *num_sam_users);
-BOOL do_samr_open_policy(struct cli_state *cli, int t_idx, uint16 fnum,
+BOOL do_samr_open_domain(struct cli_state *cli, int t_idx, uint16 fnum,
char *srv_name, uint32 unknown_0,
LSA_POL_HND *rtn_pol);
-BOOL do_samr_open_secret(struct cli_state *cli, int t_idx, uint16 fnum,
+BOOL do_samr_connect(struct cli_state *cli, int t_idx, uint16 fnum,
LSA_POL_HND *query_pol, uint32 rid,
char *sid, LSA_POL_HND *rtn_pol);
char* samr_io_q_close(BOOL io, SAMR_Q_CLOSE *q_u, char *q, char *base, int align, int depth);
char* samr_io_r_close(BOOL io, SAMR_R_CLOSE *r_u, char *q, char *base, int align, int depth);
-void make_samr_q_open_secret(SAMR_Q_OPEN_SECRET *q_u,
+void make_samr_q_connect(SAMR_Q_CONNECT *q_u,
LSA_POL_HND *pol, uint32 rid, char *sid);
-char* samr_io_q_open_secret(BOOL io, SAMR_Q_OPEN_SECRET *q_u, char *q, char *base, int align, int depth);
-char* samr_io_r_open_secret(BOOL io, SAMR_R_OPEN_SECRET *r_u, char *q, char *base, int align, int depth);
-void make_samr_q_enum_sam_db(SAMR_Q_ENUM_SAM_DB *q_e, LSA_POL_HND *pol, uint32 size);
-char* samr_io_q_enum_sam_db(BOOL io, SAMR_Q_ENUM_SAM_DB *q_e, char *q, char *base, int align, int depth);
-void make_samr_r_enum_sam_db(SAMR_R_ENUM_SAM_DB *r_u,
+char* samr_io_q_connect(BOOL io, SAMR_Q_CONNECT *q_u, char *q, char *base, int align, int depth);
+char* samr_io_r_connect(BOOL io, SAMR_R_CONNECT *r_u, char *q, char *base, int align, int depth);
+void make_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, LSA_POL_HND *pol, uint32 size);
+char* samr_io_q_enum_dom_users(BOOL io, SAMR_Q_ENUM_DOM_USERS *q_e, char *q, char *base, int align, int depth);
+void make_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS *r_u,
uint32 num_sam_entries, struct smb_passwd pass[MAX_SAM_ENTRIES], uint32 status);
-char* samr_io_r_enum_sam_db(BOOL io, SAMR_R_ENUM_SAM_DB *r_u, char *q, char *base, int align, int depth);
+char* samr_io_r_enum_dom_users(BOOL io, SAMR_R_ENUM_DOM_USERS *r_u, char *q, char *base, int align, int depth);
+void make_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_e, LSA_POL_HND *pol, uint32 size);
+char* samr_io_q_enum_dom_aliases(BOOL io, SAMR_Q_ENUM_DOM_ALIASES *q_e, char *q, char *base, int align, int depth);
+void make_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u,
+ uint32 num_sam_entries, struct smb_passwd grps[MAX_SAM_ENTRIES],
+ uint32 status);
+char* samr_io_r_enum_dom_aliases(BOOL io, SAMR_R_ENUM_DOM_ALIASES *r_u, char *q, char *base, int align, int depth);
void make_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_e, LSA_POL_HND *pol,
uint16 switch_level, uint32 start_idx, uint32 size);
char* samr_io_q_query_dispinfo(BOOL io, SAMR_Q_QUERY_DISPINFO *q_e, char *q, char *base, int align, int depth);
struct smb_passwd pass[MAX_SAM_ENTRIES],
uint32 status);
char* samr_io_r_query_dispinfo(BOOL io, SAMR_R_QUERY_DISPINFO *r_u, char *q, char *base, int align, int depth);
+void make_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_e, LSA_POL_HND *pol,
+ uint16 switch_level, uint32 start_idx, uint32 size);
+char* samr_io_q_enum_dom_groups(BOOL io, SAMR_Q_ENUM_DOM_GROUPS *q_e, char *q, char *base, int align, int depth);
+void make_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS *r_u,
+ uint32 start_idx, uint32 num_sam_entries,
+ struct smb_passwd pass[MAX_SAM_ENTRIES],
+ uint32 status);
+char* samr_io_r_enum_dom_groups(BOOL io, SAMR_R_ENUM_DOM_GROUPS *r_u, char *q, char *base, int align, int depth);
+void make_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_e,
+ LSA_POL_HND *pol,
+ uint16 switch_level);
+char* samr_io_q_query_aliasinfo(BOOL io, SAMR_Q_QUERY_ALIASINFO *q_e, char *q, char *base, int align, int depth);
+void make_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *r_u,
+ uint16 switch_level, char *acct_desc,
+ uint32 status);
+char* samr_io_r_query_aliasinfo(BOOL io, SAMR_R_QUERY_ALIASINFO *r_u, char *q, char *base, int align, int depth);
char* samr_io_q_lookup_rids(BOOL io, SAMR_Q_LOOKUP_RIDS *q_u, char *q, char *base, int align, int depth);
void make_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u,
uint32 num_rids, uint32 rid, uint32 status);
char* samr_io_r_unknown_24(BOOL io, SAMR_R_UNKNOWN_24 *r_u, char *q, char *base, int align, int depth);
char* samr_io_q_unknown_32(BOOL io, SAMR_Q_UNKNOWN_32 *q_u, char *q, char *base, int align, int depth);
char* samr_io_r_unknown_32(BOOL io, SAMR_R_UNKNOWN_32 *r_u, char *q, char *base, int align, int depth);
-void make_samr_q_open_policy(SAMR_Q_OPEN_POLICY *q_u,
+void make_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN *q_u,
char *srv_name, uint32 unknown_0);
-char* samr_io_q_open_policy(BOOL io, SAMR_Q_OPEN_POLICY *q_u, char *q, char *base, int align, int depth);
-char* samr_io_r_open_policy(BOOL io, SAMR_R_OPEN_POLICY *r_u, char *q, char *base, int align, int depth);
+char* samr_io_q_open_domain(BOOL io, SAMR_Q_OPEN_DOMAIN *q_u, char *q, char *base, int align, int depth);
+char* samr_io_r_open_domain(BOOL io, SAMR_R_OPEN_DOMAIN *r_u, char *q, char *base, int align, int depth);
+void make_samr_q_open_alias(SAMR_Q_OPEN_ALIAS *q_u,
+ uint32 unknown_0, uint32 rid);
+char* samr_io_q_open_alias(BOOL io, SAMR_Q_OPEN_ALIAS *q_u, char *q, char *base, int align, int depth);
+char* samr_io_r_open_alias(BOOL io, SAMR_R_OPEN_ALIAS *r_u, char *q, char *base, int align, int depth);
/*The following definitions come from rpc_pipes/smbparse.c */
char* smb_io_dom_rid3(BOOL io, DOM_RID3 *rid3, char *q, char *base, int align, int depth);
void make_dom_rid4(DOM_RID4 *rid4, uint16 unknown, uint16 attr, uint32 rid);
char* smb_io_dom_rid4(BOOL io, DOM_RID4 *rid4, char *q, char *base, int align, int depth);
-void make_sam_str2(SAM_STR2 *sam, char *sam_acct, char *sam_name, char *sam_desc);
-char* smb_io_sam_str2(BOOL io, SAM_STR2 *sam, uint32 acct_buf, uint32 name_buf, uint32 desc_buf, char *q, char *base, int align, int depth);
-void make_sam_entry2(SAM_ENTRY2 *sam, uint32 user_idx, struct smb_passwd *pass);
-char* smb_io_sam_entry2(BOOL io, SAM_ENTRY2 *sam, char *q, char *base, int align, int depth);
+void make_sam_str1(SAM_STR1 *sam, char *sam_acct, char *sam_name, char *sam_desc);
+char* smb_io_sam_str1(BOOL io, SAM_STR1 *sam, uint32 acct_buf, uint32 name_buf, uint32 desc_buf, char *q, char *base, int align, int depth);
+void make_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx, struct smb_passwd *pass);
+char* smb_io_sam_entry1(BOOL io, SAM_ENTRY1 *sam, char *q, char *base, int align, int depth);
+void make_sam_str3(SAM_STR3 *sam, char *grp_acct, char *grp_desc);
+char* smb_io_sam_str3(BOOL io, SAM_STR3 *sam, uint32 acct_buf, uint32 desc_buf, char *q, char *base, int align, int depth);
+void make_sam_entry3(SAM_ENTRY3 *sam, uint32 grp_idx, struct smb_passwd *pass);
+char* smb_io_sam_entry3(BOOL io, SAM_ENTRY3 *sam, char *q, char *base, int align, int depth);
void make_sam_entry(SAM_ENTRY *sam, char *sam_name, uint32 rid);
char* smb_io_sam_entry(BOOL io, SAM_ENTRY *sam, char *q, char *base, int align, int depth);
void make_clnt_srv(DOM_CLNT_SRV *log, char *logon_srv, char *comp_name);