Home | History | Annotate | Download | only in ndl
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _MLSVC_NETR_NDL_
     27 #define _MLSVC_NETR_NDL_
     28 
     29 /*
     30  ***********************************************************************
     31  *
     32  * NetLogon RPC (NETR) interface definition.
     33  *
     34  ***********************************************************************
     35  */
     36 
     37 #include "ndrtypes.ndl"
     38 
     39 
     40 #define NETR_OPNUM_UasLogon			0x00
     41 #define NETR_OPNUM_UasLogoff			0x01
     42 #define NETR_OPNUM_SamLogon			0x02
     43 #define NETR_OPNUM_SamLogoff			0x03
     44 #define NETR_OPNUM_ServerReqChallenge		0x04
     45 #define NETR_OPNUM_ServerAuthenticate		0x05
     46 #define NETR_OPNUM_ServerPasswordSet		0x06
     47 #define NETR_OPNUM_DatabaseDeltas		0x07
     48 #define NETR_OPNUM_DatabaseSync			0x08
     49 #define NETR_OPNUM_AccountDeltas		0x09
     50 #define NETR_OPNUM_AccountSync			0x0a
     51 #define NETR_OPNUM_GetDCName			0x0b
     52 #define NETR_OPNUM_LogonControl			0x0c
     53 #define NETR_OPNUM_GetAnyDCName			0x0d
     54 #define NETR_OPNUM_LogonControl2		0x0E
     55 #define NETR_OPNUM_ServerAuthenticate2		0x0F
     56 #define NETR_OPNUM_DatabaseSync2		0x10
     57 #define NETR_OPNUM_DatabaseRedo			0x11
     58 #define NETR_OPNUM_LogonControl2Ex		0x12
     59 #define NETR_OPNUM_TrustDomainList		0x13
     60 
     61 
     62 struct netr_sid {
     63 	BYTE		Revision;
     64 	BYTE		SubAuthCount;
     65 	BYTE		Authority[6];
     66   SIZE_IS(SubAuthCount)
     67 	DWORD		SubAuthority[ANY_SIZE_ARRAY];
     68 };
     69 
     70 
     71 struct netr_string {
     72 	WORD		length;
     73 	WORD		allosize;
     74 	LPTSTR		str;
     75 };
     76 typedef struct netr_string netr_string_t;
     77 
     78 
     79 /*
     80  * Alternative varying/conformant string definition - for
     81  * non-null terminated strings. This definition must match
     82  * ndr_vcbuf_t.
     83  */
     84 struct netr_vcs {
     85 	/*
     86 	 * size_is (actually a copy of length_is) will
     87 	 * be inserted here by the marshalling library.
     88 	 */
     89 	DWORD vc_first_is;
     90 	DWORD vc_length_is;
     91   SIZE_IS(vc_length_is)
     92 	WORD buffer[ANY_SIZE_ARRAY];
     93 };
     94 
     95 struct netr_vcstr {
     96 	WORD wclen;
     97 	WORD wcsize;
     98 	struct netr_vcs *vcs;
     99 };
    100 typedef struct netr_vcstr netr_vcstr_t;
    101 
    102 struct netr_vcb {
    103 	/*
    104 	 * size_is (actually a copy of length_is) will
    105 	 * be inserted here by the marshalling library.
    106 	 */
    107 	DWORD vc_first_is;
    108 	DWORD vc_length_is;
    109   SIZE_IS(vc_length_is)
    110 	BYTE buffer[ANY_SIZE_ARRAY];
    111 };
    112 
    113 struct netr_vcbuf {
    114 	WORD len;
    115 	WORD size;
    116 	struct netr_vcb *vcb;
    117 };
    118 typedef struct netr_vcbuf netr_vcbuf_t;
    119 
    120 struct netr_credential {
    121 	BYTE data[8];
    122 };
    123 
    124 struct netr_authenticator {
    125 	struct netr_credential credential;
    126 	DWORD timestamp;
    127 };
    128 typedef struct netr_authenticator netr_auth_t;
    129 
    130 
    131 struct OLD_LARGE_INTEGER {
    132 	DWORD LowPart;
    133 	DWORD HighPart;
    134 };
    135 typedef struct OLD_LARGE_INTEGER netr_int64_t;
    136 
    137 
    138 struct OWF_PASSWORD {
    139 	BYTE data[16];
    140 };
    141 typedef struct OWF_PASSWORD netr_owf_password_t;
    142 
    143 
    144 struct CYPHER_BLOCK {
    145 	BYTE data[8];
    146 };
    147 
    148 
    149 struct USER_SESSION_KEY {
    150 	struct CYPHER_BLOCK data[2];
    151 };
    152 
    153 
    154 
    155 
    156 /*
    157  ***********************************************************************
    158  * ServerReqChallenge
    159  ***********************************************************************
    160  */
    161 ALIGN(2)
    162 OPERATION(NETR_OPNUM_ServerReqChallenge)
    163 struct netr_ServerReqChallenge {
    164 	IN		LPTSTR servername;
    165 	IN REFERENCE	LPTSTR hostname;
    166 	IN		struct netr_credential client_challenge;
    167 	OUT		struct netr_credential server_challenge;
    168 	OUT		DWORD status;
    169 };
    170 
    171 
    172 /*
    173  ***********************************************************************
    174  * ServerAuthenticate2
    175  ***********************************************************************
    176  */
    177 ALIGN(2)
    178 OPERATION(NETR_OPNUM_ServerAuthenticate2)
    179 struct netr_ServerAuthenticate2 {
    180 	IN		LPTSTR servername;
    181 	IN REFERENCE	LPTSTR account_name;
    182 	IN		WORD account_type;
    183 	IN REFERENCE	LPTSTR hostname;
    184 	IN		struct netr_credential client_credential;
    185 	OUT		struct netr_credential server_credential;
    186 	INOUT	DWORD negotiate_flags;
    187 	OUT		DWORD status;
    188 };
    189 
    190 
    191 /*
    192  ***********************************************************************
    193  * ServerPasswordSet
    194  ***********************************************************************
    195  */
    196 ALIGN(2)
    197 OPERATION(NETR_OPNUM_ServerPasswordSet)
    198 struct netr_PasswordSet {
    199 	IN		LPTSTR servername;
    200 	IN REFERENCE	LPTSTR account_name;
    201 	IN		WORD account_type;
    202 	IN REFERENCE	LPTSTR hostname;
    203 	INOUT	struct netr_authenticator auth;
    204 	IN		netr_owf_password_t uas_new_password;
    205 	OUT		DWORD status;
    206 };
    207 
    208 
    209 /*
    210  ***********************************************************************
    211  * SamLogon
    212  ***********************************************************************
    213  */
    214 
    215 /*
    216  * The challenge-response data should always be 24 bytes.
    217  */
    218 #define NETR_CR_PASSWORD_SIZE			24
    219 
    220 
    221 struct lm_challenge {
    222 	BYTE data[8];
    223 };
    224 typedef struct lm_challenge lm_challenge_t;
    225 
    226 /*
    227  * Input data
    228  */
    229 struct netr_logon_identity_info {
    230 	netr_vcstr_t domain_name;
    231 	DWORD parameter_control;
    232 	struct OLD_LARGE_INTEGER logon_id;
    233 	netr_vcstr_t username;
    234 	netr_vcstr_t workstation;
    235 };
    236 typedef struct netr_logon_identity_info netr_logon_id_t;
    237 
    238 
    239 /*
    240  * Level 1: interactive logon
    241  */
    242 struct netr_logon_info1 {
    243 	netr_logon_id_t identity;
    244 	netr_owf_password_t lm_owf_password;
    245 	netr_owf_password_t nt_owf_password;
    246 };
    247 
    248 
    249 /*
    250  * Level 2: network logon.
    251  */
    252 struct netr_logon_info2 {
    253 	netr_logon_id_t identity;
    254 	lm_challenge_t lm_challenge;
    255 	netr_vcbuf_t nt_response;
    256 	netr_vcbuf_t lm_response;
    257 };
    258 
    259 
    260 union netr_logon_info_u {
    261 	UNION_INFO_PTR(1,netr_logon_info);
    262 	UNION_INFO_PTR(2,netr_logon_info);
    263 	DEFAULT	DWORD nothing;
    264 };
    265 
    266 
    267 struct netr_login_info {
    268 	WORD logon_level;
    269 	WORD switch_value;
    270   SWITCH(switch_value)
    271 	union netr_logon_info_u ru;
    272 };
    273 
    274 
    275 /*
    276  * Output data
    277  */
    278 struct netr_group_membership {
    279 	DWORD rid;
    280 	DWORD attributes;
    281 };
    282 
    283 
    284 struct netr_sid_and_attributes {
    285 	struct netr_sid *sid;
    286 	DWORD attributes;
    287 };
    288 
    289 
    290 struct netr_validation_info3 {
    291 	struct OLD_LARGE_INTEGER LogonTime;
    292 	struct OLD_LARGE_INTEGER LogoffTime;
    293 	struct OLD_LARGE_INTEGER KickOffTime;
    294 	struct OLD_LARGE_INTEGER PasswordLastSet;
    295 	struct OLD_LARGE_INTEGER PasswordCanChange;
    296 	struct OLD_LARGE_INTEGER PasswordMustChange;
    297 	netr_string_t EffectiveName;
    298 	netr_string_t FullName;
    299 	netr_string_t LogonScript;
    300 	netr_string_t ProfilePath;
    301 	netr_string_t HomeDirectory;
    302 	netr_string_t HomeDirectoryDrive;
    303 	WORD LogonCount;
    304 	WORD BadPasswordCount;
    305 	DWORD UserId;
    306 	DWORD PrimaryGroupId;
    307 	DWORD GroupCount;
    308   SIZE_IS(GroupCount)
    309 	struct netr_group_membership *GroupIds;
    310 	DWORD UserFlags;
    311 	struct USER_SESSION_KEY UserSessionKey;
    312 	netr_string_t LogonServer;
    313 	netr_string_t LogonDomainName;
    314 	struct netr_sid *LogonDomainId;
    315 	DWORD ExpansionRoom[10];
    316 	DWORD SidCount;
    317   SIZE_IS(SidCount)
    318 	struct netr_sid_and_attributes *ExtraSids;
    319 };
    320 
    321 
    322 union netr_validation_u {
    323 	CASE(3) struct netr_validation_info3 *info3;
    324 	DEFAULT	DWORD nothing;
    325 };
    326 
    327 
    328 /*
    329  * This structure needs to be declared, even though it can't be used
    330  * in netr_SamLogon, in order to get the appropriate size to calculate
    331  * the correct fixup offsets.  If ndrgen did the right thing,
    332  * netr_validation_info would be one of the out parameters. However,
    333  * if we do it that way, the switch_value isn't known early enough to
    334  * do the fixup calculation. So it all has to go in netr_SamLogon.
    335  */
    336 struct netr_validation_info {
    337 	WORD validation_level;
    338   SWITCH(validation_level)
    339 	union netr_validation_u ru;
    340 };
    341 
    342 
    343 /*
    344  * WARNING
    345  *
    346  * Validation_level is really a WORD and authoritative is really a
    347  * BYTE. They are declared as DWORD here due to the way things are
    348  * unmarshalled. NT does not clear out the unused bytes in the
    349  * DWORD so they must be cast to get the correct value.
    350  */
    351 OPERATION(NETR_OPNUM_SamLogon)
    352 struct netr_SamLogon {
    353 	IN		LPTSTR servername;
    354 	IN		LPTSTR hostname;
    355 	IN		struct netr_authenticator *auth;
    356 	INOUT	struct netr_authenticator *ret_auth;
    357 	IN		struct netr_login_info logon_info;
    358 	INOUT	WORD validation_level;
    359   SWITCH(validation_level)
    360 	OUT		union netr_validation_u ru;
    361 	OUT		DWORD authoritative;
    362 	OUT		DWORD status;
    363 };
    364 
    365 
    366 /*
    367  ***********************************************************************
    368  * SamLogoff
    369  ***********************************************************************
    370  */
    371 OPERATION(NETR_OPNUM_SamLogoff)
    372 struct netr_SamLogoff {
    373 	IN		LPTSTR servername;
    374 	IN REFERENCE	LPTSTR hostname;
    375 	IN		struct netr_authenticator auth;
    376 	INOUT	struct netr_authenticator ret_auth;
    377 	IN		DWORD logon_level;
    378   SWITCH(logon_level)
    379 	IN		union netr_logon_info_u ru;
    380 	OUT		DWORD status;
    381 };
    382 
    383 
    384 /*
    385  ***********************************************************************
    386  * The NETR interface definition.
    387  ***********************************************************************
    388  */
    389 INTERFACE(0)
    390 union netr_interface {
    391 	CASE(NETR_OPNUM_ServerReqChallenge)
    392 		struct netr_ServerReqChallenge		ServerReqChallenge;
    393 	CASE(NETR_OPNUM_ServerAuthenticate2)
    394 		struct netr_ServerAuthenticate2		ServerAuthenticate2;
    395 	CASE(NETR_OPNUM_SamLogon)
    396 		struct netr_SamLogon			SamLogon;
    397 	CASE(NETR_OPNUM_SamLogoff)
    398 		struct netr_SamLogoff			SamLogoff;
    399 	CASE(NETR_OPNUM_ServerPasswordSet)
    400 		struct netr_PasswordSet			PasswordSet;
    401 };
    402 typedef union netr_interface netr_interface_t;
    403 EXTERNTYPEINFO(netr_interface)
    404 
    405 #endif /* _MLSVC_NETR_NDL_ */
    406