/*
- Unix SMB/Netbios implementation.
- Version 1.9.
+ Unix SMB/CIFS implementation.
SMB parameters and setup
- Copyright (C) Andrew Tridgell 1992-1998
- Copyright (C) Luke Kenneth Casson Leighton 1996-1998
- Copyright (C) Paul Ashton 1997-1998
+ Copyright (C) Andrew Tridgell 1992-2000
+ Copyright (C) Luke Kenneth Casson Leighton 1996-2000
+ Copyright (C) Paul Ashton 1997-2000
+ Copyright (C) Jean François Micouleau 1998-2001
+ Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#ifndef _RPC_SAMR_H /* _RPC_SAMR_H */
#define _RPC_SAMR_H
-
#include "rpc_misc.h"
-
/*******************************************************************
the following information comes from a QuickView on samsrv.dll,
and gives an idea of exactly what is needed:
x SamrCreateUserInDomain
? SamrDeleteAlias
SamrDeleteGroup
-SamrDeleteUser
+x SamrDeleteUser
x SamrEnumerateAliasesInDomain
SamrEnumerateDomainsInSamServer
x SamrEnumerateGroupsInDomain
x SamrQueryInformationAlias
SamrQueryInformationDomain
? SamrQueryInformationUser
-SamrQuerySecurityObject
+x SamrQuerySecurityObject
SamrRemoveMemberFromAlias
SamrRemoveMemberFromForiegnDomain
SamrRemoveMemberFromGroup
#define SAMR_CONNECT_ANON 0x00
#define SAMR_CLOSE_HND 0x01
-
+#define SAMR_SET_SEC_OBJECT 0x02
#define SAMR_QUERY_SEC_OBJECT 0x03
+
+#define SAMR_UNKNOWN_4 0x04 /* profile info? */
#define SAMR_LOOKUP_DOMAIN 0x05
+#define SAMR_ENUM_DOMAINS 0x06
#define SAMR_OPEN_DOMAIN 0x07
-
#define SAMR_QUERY_DOMAIN_INFO 0x08
+#define SAMR_SET_DOMAIN_INFO 0x09
#define SAMR_CREATE_DOM_GROUP 0x0a
#define SAMR_ENUM_DOM_GROUPS 0x0b
#define SAMR_DELETE_DOM_GROUP 0x17
#define SAMR_DEL_GROUPMEM 0x18
#define SAMR_QUERY_GROUPMEM 0x19
+#define SAMR_UNKNOWN_1A 0x1a
#define SAMR_OPEN_ALIAS 0x1b
#define SAMR_QUERY_ALIASINFO 0x1c
#define SAMR_QUERY_ALIASMEM 0x21
#define SAMR_OPEN_USER 0x22
-#define SAMR_CREATE_USER 0x32
-#define SAMR_SET_USERINFO 0x3A
-
+#define SAMR_DELETE_DOM_USER 0x23
#define SAMR_QUERY_USERINFO 0x24
+#define SAMR_SET_USERINFO2 0x25
#define SAMR_QUERY_USERGROUPS 0x27
-#define SAMR_QUERY_DISPINFO 0x28
+#define SAMR_QUERY_DISPINFO 0x28
+#define SAMR_UNKNOWN_29 0x29
+#define SAMR_UNKNOWN_2a 0x2a
+#define SAMR_UNKNOWN_2b 0x2b
#define SAMR_GET_USRDOM_PWINFO 0x2c
+#define SAMR_REMOVE_SID_FOREIGN_DOMAIN 0x2d
+#define SAMR_UNKNOWN_2E 0x2e /* looks like an alias for SAMR_QUERY_DOMAIN_INFO */
+#define SAMR_UNKNOWN_2f 0x2f
#define SAMR_QUERY_DISPINFO3 0x30 /* Alias for SAMR_QUERY_DISPINFO
with info level 3 */
+#define SAMR_UNKNOWN_31 0x31
+#define SAMR_CREATE_USER 0x32
#define SAMR_QUERY_DISPINFO4 0x33 /* Alias for SAMR_QUERY_DISPINFO
with info level 4 */
#define SAMR_ADDMULTI_ALIASMEM 0x34
+#define SAMR_UNKNOWN_35 0x35
+#define SAMR_UNKNOWN_36 0x36
#define SAMR_CHGPASSWD_USER 0x37
#define SAMR_GET_DOM_PWINFO 0x38
-
#define SAMR_CONNECT 0x39
-
+#define SAMR_SET_USERINFO 0x3A
+#define SAMR_CONNECT4 0x3E
typedef struct logon_hours_info
{
uint32 user_rid; /* Primary User ID */
uint32 group_rid; /* Primary Group ID */
- uint16 acb_info; /* account info (ACB_xxxx bit-mask) */
- /* uint8 pad[2] */
+ uint32 acb_info; /* account info (ACB_xxxx bit-mask) */
- uint32 unknown_3; /* 0x09f8 27fa */
+ uint32 fields_present; /* 0x09f8 27fa */
uint16 logon_divs; /* 0x0000 00a8 which is 168 which is num hrs in a week */
/* uint8 pad[2] */
uint32 ptr_logon_hrs; /* pointer to logon hours */
- uint8 padding1[8];
+ /* Was unknown_5. */
+ uint16 bad_password_count;
+ uint16 logon_count;
+
+ uint8 padding1[6];
+
+ uint8 passmustchange; /* 0x00 must change = 0x01 */
- uint32 unknown_5; /* 0x0001 0000 */
+ uint8 padding2;
uint8 pass[516];
UNISTR2 uni_acct_desc ; /* user description unicode string */
UNISTR2 uni_workstations; /* login from workstations unicode string */
UNISTR2 uni_unknown_str ; /* don't know what this is, yet. */
- UNISTR2 uni_munged_dial ; /* munged path name and dial-back tel number */
+ UNISTR2 uni_munged_dial ; /* munged path name and dial-back tel no */
uint32 unknown_6; /* 0x0000 04ec */
uint32 padding4;
typedef struct sam_user_info_24
{
uint8 pass[516];
-
+ uint16 pw_len;
} SAM_USER_INFO_24;
+/*
+ * NB. This structure is *definately* incorrect. It's my best guess
+ * currently for W2K SP2. The password field is encrypted in a different
+ * way than normal... And there are definately other problems. JRA.
+ */
+
+/* SAM_USER_INFO_25 */
+typedef struct sam_user_info_25
+{
+ /* TIMES MAY NOT IN RIGHT ORDER!!!! */
+ NTTIME logon_time; /* logon time */
+ NTTIME logoff_time; /* logoff time */
+ NTTIME kickoff_time; /* kickoff time */
+ NTTIME pass_last_set_time; /* password last set time */
+ NTTIME pass_can_change_time; /* password can change time */
+ NTTIME pass_must_change_time; /* password must change time */
+
+ UNIHDR hdr_user_name; /* NULL - user name unicode string header */
+ UNIHDR hdr_full_name; /* user's full name unicode string header */
+ UNIHDR hdr_home_dir; /* home directory unicode string header */
+ UNIHDR hdr_dir_drive; /* home drive unicode string header */
+ UNIHDR hdr_logon_script; /* logon script unicode string header */
+ UNIHDR hdr_profile_path; /* profile path unicode string header */
+ UNIHDR hdr_acct_desc ; /* user description */
+ UNIHDR hdr_workstations; /* comma-separated workstations user can log in from */
+ UNIHDR hdr_unknown_str ; /* don't know what this is, yet. */
+ UNIHDR hdr_munged_dial ; /* munged path name and dial-back tel number */
+
+ uint8 lm_pwd[16]; /* lm user passwords */
+ uint8 nt_pwd[16]; /* nt user passwords */
+
+ uint32 user_rid; /* Primary User ID */
+ uint32 group_rid; /* Primary Group ID */
+
+ uint32 acb_info; /* account info (ACB_xxxx bit-mask) */
+
+ uint32 unknown_6[6];
+
+ uint8 pass[532];
+
+ UNISTR2 uni_user_name; /* NULL - username unicode string */
+ UNISTR2 uni_full_name; /* user's full name unicode string */
+ UNISTR2 uni_home_dir; /* home directory unicode string */
+ UNISTR2 uni_dir_drive; /* home directory drive unicode string */
+ UNISTR2 uni_logon_script; /* logon script unicode string */
+ UNISTR2 uni_profile_path; /* profile path unicode string */
+ UNISTR2 uni_acct_desc ; /* user description unicode string */
+ UNISTR2 uni_workstations; /* login from workstations unicode string */
+ UNISTR2 uni_unknown_str ; /* don't know what this is, yet. */
+ UNISTR2 uni_munged_dial ; /* munged path name and dial-back tel no */
+} SAM_USER_INFO_25;
+
/* SAM_USER_INFO_21 */
typedef struct sam_user_info_21
uint32 user_rid; /* Primary User ID */
uint32 group_rid; /* Primary Group ID */
- uint16 acb_info; /* account info (ACB_xxxx bit-mask) */
- /* uint8 pad[2] */
+ uint32 acb_info; /* account info (ACB_xxxx bit-mask) */
- uint32 unknown_3; /* 0x00ff ffff */
+ /* Was unknown_3 */
+ uint32 fields_present; /* 0x00ff ffff */
uint16 logon_divs; /* 0x0000 00a8 which is 168 which is num hrs in a week */
/* uint8 pad[2] */
uint32 ptr_logon_hrs; /* unknown pointer */
- uint32 unknown_5; /* 0x0002 0000 */
+ /* Was unknown_5. */
+ uint16 bad_password_count;
+ uint16 logon_count;
+
+ uint8 padding1[6];
+
+ uint8 passmustchange; /* 0x00 must change = 0x01 */
- uint8 padding1[8];
+ uint8 padding2;
UNISTR2 uni_user_name; /* username unicode string */
UNISTR2 uni_full_name; /* user's full name unicode string */
} SAM_USER_INFO_21;
+#define PASS_MUST_CHANGE_AT_NEXT_LOGON 0x01
+#define PASS_DONT_CHANGE_AT_NEXT_LOGON 0x00
+
+/* SAM_USER_INFO_20 */
+typedef struct sam_user_info_20
+{
+ UNIHDR hdr_munged_dial ; /* munged path name and dial-back tel number */
+
+ UNISTR2 uni_munged_dial ; /* munged path name and dial-back tel number */
+
+} SAM_USER_INFO_20;
+
+/* SAM_USER_INFO_12 */
+typedef struct sam_user_info_12
+{
+ uint8 lm_pwd[16]; /* lm user passwords */
+ uint8 nt_pwd[16]; /* nt user passwords */
+
+ uint8 lm_pwd_active;
+ uint8 nt_pwd_active;
+
+} SAM_USER_INFO_12;
/* SAM_USER_INFO_11 */
typedef struct sam_user_info_11
typedef struct r_samr_close_hnd_info
{
POLICY_HND pol; /* policy handle */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_CLOSE_HND;
/****************************************************************************
-SAMR_Q_UNKNOWN_2C - a "set user info" occurs just after this
+SAMR_Q_GET_USRDOM_PWINFO - a "set user info" occurs just after this
*****************************************************************************/
-/* SAMR_Q_UNKNOWN_2C */
-typedef struct q_samr_unknown_2c_info
+/* SAMR_Q_GET_USRDOM_PWINFO */
+typedef struct q_samr_usrdom_pwinfo_info
{
POLICY_HND user_pol; /* policy handle */
-} SAMR_Q_UNKNOWN_2C;
+} SAMR_Q_GET_USRDOM_PWINFO;
/****************************************************************************
-SAMR_R_UNKNOWN_2C - a "set user info" occurs just after this
+SAMR_R_GET_USRDOM_PWINFO - a "set user info" occurs just after this
*****************************************************************************/
-/* SAMR_R_UNKNOWN_2C */
-typedef struct r_samr_unknown_2c_info
+/* SAMR_R_GET_USRDOM_PWINFO */
+typedef struct r_samr_usrdom_pwinfo_info
{
- uint32 unknown_0; /* 0x0016 0000 */
- uint32 unknown_1; /* 0x0000 0000 */
- uint32 status;
-
-} SAMR_R_UNKNOWN_2C;
+ uint16 unknown_0; /* 0000 */
+ uint16 unknown_1; /* 0x0016 or 0x0015 */
+ uint32 unknown_2; /* 0x0000 0000 */
+ NTSTATUS status;
+} SAMR_R_GET_USRDOM_PWINFO;
/****************************************************************************
-SAMR_Q_UNKNOWN_3 - info level 4. returns SIDs.
+SAMR_Q_SET_SEC_OBJ - info level 4.
*****************************************************************************/
-/* SAMR_Q_UNKNOWN_3 - probably get domain info... */
-typedef struct q_samr_unknown_3_info
+/* SAMR_Q_SET_SEC_OBJ - */
+typedef struct q_samr_set_sec_obj_info
{
- POLICY_HND user_pol; /* policy handle */
- uint16 switch_value; /* 0x0000 0004 */
- /* uint8 pad[2] */
-
-} SAMR_Q_UNKNOWN_3;
-
-/* DOM_SID3 example:
- 0x14 0x035b 0x0002 S-1-1
- 0x18 0x07ff 0x000f S-1-5-20-DOMAIN_ALIAS_RID_ADMINS
- 0x18 0x07ff 0x000f S-1-5-20-DOMAIN_ALIAS_RID_ACCOUNT_OPS
- 0x24 0x0044 0x0002 S-1-5-21-nnn-nnn-nnn-0x03f1
- */
+ POLICY_HND pol; /* policy handle */
+ uint32 sec_info; /* xxxx_SECURITY_INFORMATION 0x0000 0004 */
+ SEC_DESC_BUF *buf;
-/* DOM_SID3 example:
- 0x24 0x0044 0x0002 S-1-5-21-nnn-nnn-nnn-0x03ee
- 0x18 0x07ff 0x000f S-1-5-20-DOMAIN_ALIAS_RID_ADMINS
- 0x14 0x035b 0x0002 S-1-1
- */
+} SAMR_Q_SET_SEC_OBJ;
-/* DOM_SID3 - security id */
-typedef struct sid_info_3
+/* SAMR_R_SET_SEC_OBJ - */
+typedef struct r_samr_set_sec_obj_info
{
- uint16 len; /* length, bytes, including length of len :-) */
- /* uint8 pad[2]; */
-
- DOM_SID sid;
+ NTSTATUS status; /* return status */
-} DOM_SID3;
+} SAMR_R_SET_SEC_OBJ;
-#define MAX_SAM_SIDS 15
+/****************************************************************************
+SAMR_Q_QUERY_SEC_OBJ - info level 4. returns SIDs.
+*****************************************************************************/
-/* SAM_SID_STUFF */
-typedef struct sid_stuff_info
+/* SAMR_Q_QUERY_SEC_OBJ - probably get domain info... */
+typedef struct q_samr_query_sec_obj_info
{
- uint16 unknown_2; /* 0x0001 */
- uint16 unknown_3; /* 0x8004 */
-
- uint8 padding1[8];
-
- uint32 unknown_4; /* 0x0000 0014 */
- uint32 unknown_5; /* 0x0000 0014 */
-
- uint16 unknown_6; /* 0x0002 */
- uint16 unknown_7; /* 0x5800 */
-
- uint32 num_sids;
-
- uint16 padding2;
-
- DOM_SID3 sid[MAX_SAM_SIDS];
+ POLICY_HND user_pol; /* policy handle */
+ uint32 sec_info; /* xxxx_SECURITY_INFORMATION 0x0000 0004 */
-} SAM_SID_STUFF;
+} SAMR_Q_QUERY_SEC_OBJ;
-/* SAMR_R_UNKNOWN_3 - probably an open */
-typedef struct r_samr_unknown_3_info
+/* SAMR_R_QUERY_SEC_OBJ - probably an open */
+typedef struct r_samr_query_sec_obj_info
{
- uint32 ptr_0;
- uint32 sid_stuff_len0;
-
- uint32 ptr_1;
- uint32 sid_stuff_len1;
-
- SAM_SID_STUFF sid_stuff;
+ uint32 ptr;
+ SEC_DESC_BUF *buf;
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
-} SAMR_R_UNKNOWN_3;
+} SAMR_R_QUERY_SEC_OBJ;
/****************************************************************************
typedef struct sam_unknown_info_3_info
{
- uint32 unknown_0; /* 0x0000 0000 */
- uint32 unknown_1; /* 0x8000 0000 */
+ NTTIME logout;
+ /* 0x8000 0000 */ /* DON'T forcibly disconnect remote users from server when logon hours expire*/
+
+ /* 0x0000 0000 */ /* forcibly disconnect remote users from server when logon hours expire*/
} SAM_UNK_INFO_3;
} SAM_UNK_INFO_7;
+typedef struct sam_unknown_info_12_inf
+{
+ NTTIME duration;
+ NTTIME reset_count;
+ uint16 bad_attempt_lockout;
+
+} SAM_UNK_INFO_12;
+
+typedef struct sam_unknown_info_5_inf
+{
+ UNIHDR hdr_server; /* server name unicode header */
+ UNISTR2 uni_server; /* server name unicode string */
+
+} SAM_UNK_INFO_5;
+
typedef struct sam_unknown_info_2_inf
{
uint32 unknown_0; /* 0x0000 0000 */
typedef struct sam_unknown_info_1_inf
{
- uint8 padding[12]; /* 12 bytes zeros */
- uint32 unknown_1; /* 0x8000 0000 */
- uint32 unknown_2; /* 0x0000 0000 */
+ uint16 min_length_password;
+ uint16 password_history;
+ uint32 flag;
+ NTTIME expire;
+ NTTIME min_passwordage;
} SAM_UNK_INFO_1;
SAM_UNK_INFO_1 inf1;
SAM_UNK_INFO_2 inf2;
SAM_UNK_INFO_3 inf3;
+ SAM_UNK_INFO_5 inf5;
SAM_UNK_INFO_6 inf6;
SAM_UNK_INFO_7 inf7;
+ SAM_UNK_INFO_12 inf12;
} info;
SAM_UNK_CTR *ctr;
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_QUERY_DOMAIN_INFO;
uint32 ptr_sid;
DOM_SID2 dom_sid;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_LOOKUP_DOMAIN;
/* SAMR_Q_OPEN_DOMAIN */
typedef struct q_samr_open_domain_info
{
- POLICY_HND connect_pol; /* policy handle */
+ POLICY_HND pol; /* policy handle */
uint32 flags; /* 0x2000 0000; 0x0000 0211; 0x0000 0280; 0x0000 0200 - flags? */
DOM_SID2 dom_sid; /* domain SID */
typedef struct r_samr_open_domain_info
{
POLICY_HND domain_pol; /* policy handle associated with the SID */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_OPEN_DOMAIN;
-
-#define MAX_SAM_ENTRIES 250
+#define MAX_SAM_ENTRIES_W2K 0x400
+#define MAX_SAM_ENTRIES_W95 50
+/* The following should be the greater of the preceeding two. */
+#define MAX_SAM_ENTRIES MAX_SAM_ENTRIES_W2K
typedef struct samr_entry_info
{
} SAM_ENTRY;
+/* SAMR_Q_ENUM_DOMAINS - SAM rids and names */
+typedef struct q_samr_enum_domains_info
+{
+ POLICY_HND pol; /* policy handle */
+
+ uint32 start_idx; /* enumeration handle */
+ uint32 max_size; /* 0x0000 ffff */
+
+} SAMR_Q_ENUM_DOMAINS;
+
+/* SAMR_R_ENUM_DOMAINS - SAM rids and Domain names */
+typedef struct r_samr_enum_domains_info
+{
+ uint32 next_idx; /* next starting index required for enum */
+ uint32 ptr_entries1;
+
+ uint32 num_entries2;
+ uint32 ptr_entries2;
+
+ uint32 num_entries3;
+
+ SAM_ENTRY *sam;
+ UNISTR2 *uni_dom_name;
+
+ uint32 num_entries4;
+
+ NTSTATUS status;
+
+} SAMR_R_ENUM_DOMAINS;
+
/* SAMR_Q_ENUM_DOM_USERS - SAM rids and names */
typedef struct q_samr_enum_dom_users_info
{
uint32 num_entries4;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_ENUM_DOM_USERS;
uint32 num_entries3;
- SAM_ENTRY sam[MAX_SAM_ENTRIES];
- UNISTR2 uni_grp_name[MAX_SAM_ENTRIES];
+ SAM_ENTRY *sam;
+ UNISTR2 *uni_grp_name;
uint32 num_entries4;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_ENUM_DOM_GROUPS;
uint32 num_entries3;
- SAM_ENTRY sam[MAX_SAM_ENTRIES];
- UNISTR2 uni_grp_name[MAX_SAM_ENTRIES];
+ SAM_ENTRY *sam;
+ UNISTR2 *uni_grp_name;
uint32 num_entries4;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_ENUM_DOM_ALIASES;
uint32 rid_user;
uint16 acb_info;
- uint16 pad;
UNIHDR hdr_acct_name;
UNIHDR hdr_user_name;
typedef struct sam_entry_info_1
{
- SAM_ENTRY1 sam[MAX_SAM_ENTRIES];
- SAM_STR1 str[MAX_SAM_ENTRIES];
+ SAM_ENTRY1 *sam;
+ SAM_STR1 *str;
} SAM_DISPINFO_1;
uint32 rid_user;
uint16 acb_info;
- uint16 pad;
UNIHDR hdr_srv_name;
UNIHDR hdr_srv_desc;
typedef struct sam_entry_info_2
{
- SAM_ENTRY2 sam[MAX_SAM_ENTRIES];
- SAM_STR2 str[MAX_SAM_ENTRIES];
+ SAM_ENTRY2 *sam;
+ SAM_STR2 *str;
} SAM_DISPINFO_2;
typedef struct sam_entry_info_3
{
- SAM_ENTRY3 sam[MAX_SAM_ENTRIES];
- SAM_STR3 str[MAX_SAM_ENTRIES];
+ SAM_ENTRY3 *sam;
+ SAM_STR3 *str;
} SAM_DISPINFO_3;
typedef struct sam_entry_info_4
{
- SAM_ENTRY4 sam[MAX_SAM_ENTRIES];
- SAM_STR4 str[MAX_SAM_ENTRIES];
+ SAM_ENTRY4 *sam;
+ SAM_STR4 *str;
} SAM_DISPINFO_4;
typedef struct sam_entry_info_5
{
- SAM_ENTRY5 sam[MAX_SAM_ENTRIES];
- SAM_STR5 str[MAX_SAM_ENTRIES];
+ SAM_ENTRY5 *sam;
+ SAM_STR5 *str;
} SAM_DISPINFO_5;
SAM_DISPINFO_CTR *ctr;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_QUERY_DISPINFO;
typedef struct r_samr_delete_dom_group_info
{
POLICY_HND pol; /* policy handle */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_DELETE_DOM_GROUP;
UNIHDR hdr_acct_desc;
UNISTR2 uni_acct_desc;
- uint16 unknown_1; /* 0x0002 */
- uint16 unknown_2; /* 0x0001 */
+ uint32 access_mask;
} SAMR_Q_CREATE_DOM_GROUP;
POLICY_HND pol; /* policy handle */
uint32 rid;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_CREATE_DOM_GROUP;
UNIHDR hdr_acct_name;
uint32 unknown_1; /* 0x0000 0003 - number of group members? */
- uint32 unknown_2; /* 0x0000 0001 - number of group members? */
+ uint32 num_members; /* 0x0000 0001 - number of group members? */
UNIHDR hdr_acct_desc;
} GROUP_INFO1;
+typedef struct samr_group_info3
+{
+ uint32 unknown_1; /* 0x0000 0003 - number of group members? */
+
+} GROUP_INFO3;
+
typedef struct samr_group_info4
{
+ uint16 level;
UNIHDR hdr_acct_desc;
UNISTR2 uni_acct_desc;
typedef struct group_info_ctr
{
uint16 switch_value1;
- uint16 switch_value2;
union
{
- GROUP_INFO4 info4;
GROUP_INFO1 info1;
+ GROUP_INFO3 info3;
+ GROUP_INFO4 info4;
} group;
uint32 ptr;
GROUP_INFO_CTR *ctr;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_QUERY_GROUPINFO;
/* SAMR_R_SET_GROUPINFO - SAM Group Info */
typedef struct r_samr_set_group_info
{
- uint32 status;
+ NTSTATUS status;
} SAMR_R_SET_GROUPINFO;
typedef struct r_samr_delete_dom_alias_info
{
POLICY_HND pol; /* policy handle */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_DELETE_DOM_ALIAS;
UNIHDR hdr_acct_desc;
UNISTR2 uni_acct_desc;
- uint16 unknown_1; /* 0x001f */
- uint16 unknown_2; /* 0x000f */
+ uint32 access_mask; /* 0x001f000f */
} SAMR_Q_CREATE_DOM_ALIAS;
POLICY_HND alias_pol; /* policy handle */
uint32 rid;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_CREATE_DOM_ALIAS;
} SAMR_Q_QUERY_ALIASINFO;
+typedef struct samr_alias_info1
+{
+ UNIHDR hdr_acct_name;
+ UNIHDR hdr_acct_desc;
+ uint32 num_member;
+ UNISTR2 uni_acct_name;
+ UNISTR2 uni_acct_desc;
+
+} ALIAS_INFO1;
+
typedef struct samr_alias_info3
{
UNIHDR hdr_acct_desc;
union
{
+ ALIAS_INFO1 info1;
ALIAS_INFO3 info3;
} alias;
typedef struct r_samr_query_aliasinfo_info
{
uint32 ptr;
- ALIAS_INFO_CTR *ctr;
+ ALIAS_INFO_CTR ctr;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_QUERY_ALIASINFO;
typedef struct q_samr_set_alias_info
{
POLICY_HND alias_pol; /* policy handle */
- ALIAS_INFO_CTR *ctr;
+ ALIAS_INFO_CTR ctr;
} SAMR_Q_SET_ALIASINFO;
/* SAMR_R_SET_ALIASINFO - SAM alias info */
typedef struct r_samr_set_aliasinfo_info
{
- uint32 status;
+ NTSTATUS status;
} SAMR_R_SET_ALIASINFO;
DOM_GID *gid; /* group info */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_QUERY_USERGROUPS;
-
-/* SAMR_Q_SET_USERINFO - set sam info */
-typedef struct q_samr_set_user_info
+/* SAM_USERINFO_CTR - sam user info */
+typedef struct sam_userinfo_ctr_info
{
- POLICY_HND pol; /* policy handle associated with user */
- uint16 switch_value; /* 0x0017 */
- uint16 switch_value2; /* 0x0017 */
+ uint16 switch_value;
union
{
+ SAM_USER_INFO_10 *id10; /* auth-level 0x10 */
+ SAM_USER_INFO_11 *id11; /* auth-level 0x11 */
+ SAM_USER_INFO_12 *id12; /* auth-level 0x12 */
+ SAM_USER_INFO_20 *id20; /* auth-level 20 */
+ SAM_USER_INFO_21 *id21; /* auth-level 21 */
SAM_USER_INFO_23 *id23; /* auth-level 0x17 */
SAM_USER_INFO_24 *id24; /* auth-level 0x18 */
+ SAM_USER_INFO_25 *id25; /* auth-level 0x19 */
void* id; /* to make typecasting easy */
} info;
+} SAM_USERINFO_CTR;
+
+
+/* SAMR_Q_SET_USERINFO2 - set sam info */
+typedef struct q_samr_set_user_info2
+{
+ POLICY_HND pol; /* policy handle associated with user */
+ uint16 switch_value; /* 0x0010 */
+
+ SAM_USERINFO_CTR *ctr;
+
+} SAMR_Q_SET_USERINFO2;
+
+/* SAMR_R_SET_USERINFO2 - set sam info */
+typedef struct r_samr_set_user_info2
+{
+ NTSTATUS status; /* return status */
+
+} SAMR_R_SET_USERINFO2;
+
+/* SAMR_Q_SET_USERINFO - set sam info */
+typedef struct q_samr_set_user_info
+{
+ POLICY_HND pol; /* policy handle associated with user */
+ uint16 switch_value;
+ SAM_USERINFO_CTR *ctr;
+
} SAMR_Q_SET_USERINFO;
/* SAMR_R_SET_USERINFO - set sam info */
typedef struct r_samr_set_user_info
{
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_SET_USERINFO;
typedef struct r_samr_query_user_info
{
uint32 ptr; /* pointer */
- uint16 switch_value; /* 0x0015, 0x0011 or 0x0010 - same as in query */
- /* uint8[2] padding. */
+ SAM_USERINFO_CTR *ctr;
- union
- {
- SAM_USER_INFO_10 *id10; /* auth-level 0x10 */
- SAM_USER_INFO_11 *id11; /* auth-level 0x11 */
- SAM_USER_INFO_21 *id21; /* auth-level 21 */
- SAM_USER_INFO_23 *id23; /* auth-level 0x17 */
- SAM_USER_INFO_24 *id24; /* auth-level 0x18 */
- void* id; /* to make typecasting easy */
-
- } info;
-
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_QUERY_USERINFO;
uint32 num_entries2;
uint32 *rid; /* domain RIDs being looked up */
- uint32 status; /* return code */
+ NTSTATUS status; /* return code */
} SAMR_R_QUERY_USERALIASES;
/* SAMR_Q_LOOKUP_NAMES */
typedef struct q_samr_lookup_names_info
{
- POLICY_HND pol; /* policy handle */
+ POLICY_HND pol; /* policy handle */
uint32 num_names1; /* number of names being looked up */
uint32 flags; /* 0x0000 03e8 - unknown */
uint32 ptr; /* 0x0000 0000 - 32 bit unknown */
uint32 num_names2; /* number of names being looked up */
- UNIHDR hdr_name[MAX_LOOKUP_SIDS]; /* unicode account name header */
- UNISTR2 uni_name[MAX_LOOKUP_SIDS]; /* unicode account name string */
+ UNIHDR *hdr_name; /* unicode account name header */
+ UNISTR2 *uni_name; /* unicode account name string */
} SAMR_Q_LOOKUP_NAMES;
uint32 ptr_rids; /* pointer to aliases */
uint32 num_rids2; /* number of aliases being looked up */
- uint32 rid[MAX_LOOKUP_SIDS]; /* rids */
+ uint32 *rids; /* rids */
uint32 num_types1; /* number of users in aliases being looked up */
uint32 ptr_types; /* pointer to users in aliases */
uint32 num_types2; /* number of users in aliases being looked up */
- uint32 type[MAX_LOOKUP_SIDS]; /* SID_ENUM type */
+ uint32 *types; /* SID_ENUM type */
- uint32 status; /* return code */
+ NTSTATUS status; /* return code */
} SAMR_R_LOOKUP_NAMES;
uint32 *type; /* SID_ENUM type */
- uint32 status;
+ NTSTATUS status;
} SAMR_R_LOOKUP_RIDS;
typedef struct q_samr_open_user_info
{
POLICY_HND domain_pol; /* policy handle */
- uint32 unknown_0; /* 32 bit unknown - 0x02011b */
+ uint32 access_mask; /* 32 bit unknown - 0x02011b */
uint32 user_rid; /* user RID */
} SAMR_Q_OPEN_USER;
typedef struct r_samr_open_user_info
{
POLICY_HND user_pol; /* policy handle associated with unknown id */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_OPEN_USER;
UNIHDR hdr_name; /* unicode account name header */
UNISTR2 uni_name; /* unicode account name */
- uint16 acb_info; /* account control info */
- uint32 unknown_1; /* 0xe005 00b0 */
+ uint32 acb_info; /* account control info */
+ uint32 access_mask; /* 0xe005 00b0 */
} SAMR_Q_CREATE_USER;
{
POLICY_HND user_pol; /* policy handle associated with user */
- uint32 unknown_0; /* 0x0007 03ff */
+ uint32 access_granted;
uint32 user_rid; /* user RID */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_CREATE_USER;
+/* SAMR_Q_DELETE_DOM_USER - delete domain user */
+typedef struct q_samr_delete_dom_user_info
+{
+ POLICY_HND user_pol; /* policy handle */
+
+} SAMR_Q_DELETE_DOM_USER;
+
+
+/* SAMR_R_DELETE_DOM_USER - delete domain user */
+typedef struct r_samr_delete_dom_user_info
+{
+ POLICY_HND pol; /* policy handle */
+ NTSTATUS status; /* return status */
+
+} SAMR_R_DELETE_DOM_USER;
+
/* SAMR_Q_QUERY_GROUPMEM - query group members */
typedef struct q_samr_query_groupmem_info
uint32 num_attrs;
uint32 *attr;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_QUERY_GROUPMEM;
typedef struct q_samr_del_group_mem_info
{
POLICY_HND pol; /* policy handle */
-
uint32 rid; /* rid */
} SAMR_Q_DEL_GROUPMEM;
/* SAMR_R_DEL_GROUPMEM - probably an del group member */
typedef struct r_samr_del_group_mem_info
{
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_DEL_GROUPMEM;
/* SAMR_R_ADD_GROUPMEM - probably an add group member */
typedef struct r_samr_add_group_mem_info
{
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_ADD_GROUPMEM;
typedef struct q_samr_open_group_info
{
POLICY_HND domain_pol; /* policy handle */
- uint32 unknown; /* 0x0000 0001, 0x0000 0003, 0x0000 001f */
+ uint32 access_mask; /* 0x0000 0001, 0x0000 0003, 0x0000 001f */
uint32 rid_group; /* rid */
} SAMR_Q_OPEN_GROUP;
typedef struct r_samr_open_group_info
{
POLICY_HND pol; /* policy handle */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_OPEN_GROUP;
DOM_SID2 *sid;
- uint32 status;
+ NTSTATUS status;
} SAMR_R_QUERY_ALIASMEM;
/* SAMR_R_ADD_ALIASMEM - add alias member */
typedef struct r_samr_add_alias_mem_info
{
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_ADD_ALIASMEM;
/* SAMR_R_DEL_ALIASMEM - delete alias member */
typedef struct r_samr_del_alias_mem_info
{
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_DEL_ALIASMEM;
{
POLICY_HND dom_pol;
- uint32 unknown_0; /* 0x0000 0008 */
- uint32 rid_alias; /* rid */
+ uint32 access_mask;
+ uint32 rid_alias;
} SAMR_Q_OPEN_ALIAS;
typedef struct r_samr_open_alias_info
{
POLICY_HND pol; /* policy handle */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_OPEN_ALIAS;
uint32 ptr; /* ptr? */
uint16 unknown_0; /* 0x005c */
uint16 unknown_1; /* 0x0001 */
- uint32 unknown_2; /* 0x0000 0020 */
+ uint32 access_mask;
} SAMR_Q_CONNECT_ANON;
typedef struct r_samr_connect_anon_info
{
POLICY_HND connect_pol; /* policy handle */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_CONNECT_ANON;
uint32 ptr_srv_name; /* pointer (to server name?) */
UNISTR2 uni_srv_name; /* unicode server name starting with '\\' */
- uint32 unknown_0; /* 32 bit unknown */
+ uint32 access_mask;
} SAMR_Q_CONNECT;
typedef struct r_samr_connect_info
{
POLICY_HND connect_pol; /* policy handle */
- uint32 status; /* return status */
+ NTSTATUS status; /* return status */
} SAMR_R_CONNECT;
-/* SAMR_Q_UNKNOWN_38 */
-typedef struct q_samr_unknown_38
+/* SAMR_Q_CONNECT4 */
+typedef struct q_samr_connect4_info
+{
+ uint32 ptr_srv_name; /* pointer to server name */
+ UNISTR2 uni_srv_name;
+
+ uint32 unk_0; /* possible server name type, 1 for IP num, 2 for name */
+ uint32 access_mask;
+} SAMR_Q_CONNECT4;
+
+/* SAMR_R_CONNECT4 - same format as connect */
+typedef struct r_samr_connect_info SAMR_R_CONNECT4;
+
+/* SAMR_Q_GET_DOM_PWINFO */
+typedef struct q_samr_get_dom_pwinfo
{
uint32 ptr;
UNIHDR hdr_srv_name;
UNISTR2 uni_srv_name;
-} SAMR_Q_UNKNOWN_38;
+} SAMR_Q_GET_DOM_PWINFO;
-/* SAMR_R_UNKNOWN_38 */
-typedef struct r_samr_unknown_38
+/* SAMR_R_GET_DOM_PWINFO */
+typedef struct r_samr_get_dom_pwinfo
{
- uint16 unk_0;
- uint16 unk_1;
- uint16 unk_2;
- uint16 unk_3;
+ /*
+ * Previously this was 3 uint16's. However, after some tests
+ * it appears that the data len for the signing needs to be 16.
+ * Not sure how 3 unit16's ever worked since the length always
+ * turned out to 12. 3 uint32's + NT_STATUS == 16 bytes. Tested
+ * using NT and 2k. --jerry
+ */
+ uint32 unk_0;
+ uint32 unk_1;
+ uint32 unk_2;
+ NTSTATUS status;
-} SAMR_R_UNKNOWN_38;
+} SAMR_R_GET_DOM_PWINFO;
/* SAMR_ENC_PASSWD */
typedef struct enc_passwd_info
/* SAMR_R_CHGPASSWD_USER */
typedef struct r_samr_chgpasswd_user_info
{
- uint32 status; /* 0 == OK, C000006A (NT_STATUS_WRONG_PASSWORD) */
+ NTSTATUS status; /* 0 == OK, C000006A (NT_STATUS_WRONG_PASSWORD) */
} SAMR_R_CHGPASSWD_USER;
-#endif /* _RPC_SAMR_H */
+/* SAMR_Q_REMOVE_SID_FOREIGN_DOMAIN */
+typedef struct q_samr_remove_sid_foreign_domain_info
+{
+ POLICY_HND dom_pol; /* policy handle */
+ DOM_SID2 sid; /* SID */
+
+} SAMR_Q_REMOVE_SID_FOREIGN_DOMAIN;
+
+
+/* SAMR_R_REMOVE_SID_FOREIGN_DOMAIN */
+typedef struct r_samr_remove_sid_foreign_domain_info
+{
+ NTSTATUS status; /* return status */
+
+} SAMR_R_REMOVE_SID_FOREIGN_DOMAIN;
+
+
+
+/* these are from the old rpc_samr.h - they are needed while the merge
+ is still going on */
+#define MAX_SAM_SIDS 15
+
+/* DOM_SID3 - security id */
+typedef struct sid_info_3
+{
+ uint16 len; /* length, bytes, including length of len :-) */
+ /* uint8 pad[2]; */
+
+ DOM_SID sid;
+
+} DOM_SID3;
+
+/* SAMR_Q_UNKNOWN_2E */
+typedef struct q_samr_unknown_2e_info
+{
+ POLICY_HND domain_pol; /* policy handle */
+ uint16 switch_value;
+
+} SAMR_Q_UNKNOWN_2E;
+
+/* SAMR_R_UNKNOWN_2E */
+typedef struct r_samr_unknown_2e_info
+{
+ uint32 ptr_0;
+ uint16 switch_value;
+ SAM_UNK_CTR *ctr;
+ NTSTATUS status; /* return status */
+
+} SAMR_R_UNKNOWN_2E;
+
+/* SAMR_Q_SET_DOMAIN_INFO */
+typedef struct q_samr_set_domain_info
+{
+ POLICY_HND domain_pol; /* policy handle */
+ uint16 switch_value0;
+ uint16 switch_value;
+ SAM_UNK_CTR *ctr;
+
+} SAMR_Q_SET_DOMAIN_INFO;
+
+/* SAMR_R_SET_DOMAIN_INFO */
+typedef struct r_samr_set_domain_info
+{
+ NTSTATUS status; /* return status */
+
+} SAMR_R_SET_DOMAIN_INFO;
+
+#endif /* _RPC_SAMR_H */