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