8 uuid(46746756-7567-7567-5677-756756756756),
10 pointer_default(unique)
20 typedef [flag(NDR_PAHEX)] struct {
38 unistr_noterm *string;
41 /* This is awfully similar to a samr_user_info_23, but not identical.
42 Many of the field names have been swiped from there, because it is
43 so similar that they are likely the same, but many have been verified.
44 Some are in a different order, though... */
47 NTTIME logon_time; /* logon time */
48 NTTIME logoff_time; /* logoff time */
49 NTTIME kickoff_time; /* kickoff time */
50 NTTIME pass_last_set_time; /* password last set time */
51 NTTIME pass_can_change_time; /* password can change time */
52 NTTIME pass_must_change_time; /* password must change time */
54 pac_String account_name;
56 pac_String logon_script;
57 pac_String profile_path;
58 pac_String home_directory;
59 pac_String home_drive;
61 uint16 logon_count; /* number of times user has logged onto domain */
68 [size_is(groups_count)] GROUP_MEMBERSHIP *groups;
73 pac_String dom_controller;
79 uint32 reserved17; /* looks like it may be acb_info */
82 uint32 extra_sids_count;
83 [size_is(extra_sids_count)] EXTRA_SIDS *extra_sids;
85 dom_sid2 *res_group_dom_sid;
87 uint32 res_groups_count;
88 [size_is(res_groups_count)] GROUP_MEMBERSHIP *res_groups;
91 const uint8 PAC_TYPE_LOGON_INFO = 1;
92 const uint8 PAC_TYPE_SERVER_CHECKSUM = 6;
93 const uint8 PAC_TYPE_PRIVSVR_CHECKSUM = 7;
94 const uint8 PAC_TYPE_UNKNOWN_10 = 10;
96 typedef [nodiscriminant] union {
97 [case(PAC_TYPE_LOGON_INFO)] PAC_LOGON_INFO logon_info;
98 [case(PAC_TYPE_SERVER_CHECKSUM)] PAC_SIGNATURE_DATA srv_cksum;
99 [case(PAC_TYPE_PRIVSVR_CHECKSUM)] PAC_SIGNATURE_DATA privsrv_cksum;
100 [case(PAC_TYPE_UNKNOWN_10)] UNKNOWN_TYPE_10 type_10;
106 [relative,switch_is(type)] PAC_INFO *info;
110 typedef [public] struct {
113 PAC_INFO_HDR pac_info_hdr_ptr[num_buffers];
120 void decode_login_info(
121 [in] PAC_LOGON_INFO logon_info