⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nmbd_processlogon.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
				q += 4;				DEBUG(5,("process_logon_packet: SAMLOGON sidsize %d, len = %d\n", domainsidsize, len));				if (domainsidsize < (len - PTR_DIFF(q, buf)) && (domainsidsize != 0)) {					q += domainsidsize;					q = ALIGN4(q, buf);				}				DEBUG(5,("process_logon_packet: len = %d PTR_DIFF(q, buf) = %ld\n", len, (unsigned long)PTR_DIFF(q, buf) ));				if (len - PTR_DIFF(q, buf) > 8) {					/* with NT5 clients we can sometimes						get additional data - a length specificed string						containing the domain name, then 16 bytes of						data (no idea what it is) */					int dom_len = CVAL(q, 0);					q++;					if (dom_len < (len - PTR_DIFF(q, buf)) && (dom_len != 0)) {						q += dom_len + 1;					}					q += 16;				}				if (PTR_DIFF(q + 8, buf) > len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				ntversion = IVAL(q, 0);				lmnttoken = SVAL(q, 4);				lm20token = SVAL(q, 6);				q += 8;				DEBUG(3,("process_logon_packet: SAMLOGON sidsize %d ntv %d\n", domainsidsize, ntversion));				/*				 * we respond regadless of whether the machine is in our password 				 * database. If it isn't then we let smbd send an appropriate error.				 * Let's ignore the SID.				 */				pull_ucs2_pstring(ascuser, uniuser);				pull_ucs2_fstring(asccomp, unicomp);				DEBUG(5,("process_logon_packet: SAMLOGON user %s\n", ascuser));				fstrcpy(reply_name, "\\\\"); /* Here it wants \\LOGONSERVER. */				fstrcat(reply_name, my_name);				DEBUG(5,("process_logon_packet: SAMLOGON request from %s(%s) for %s, returning logon svr %s domain %s code %x token=%x\n",					asccomp,inet_ntoa(p->ip), ascuser, reply_name, lp_workgroup(),				SAMLOGON_R ,lmnttoken));				/* Construct reply. */				q = outbuf;				/* we want the simple version unless we are an ADS PDC..which means  */				/* never, at least for now */				if ((ntversion < 11) || (SEC_ADS != lp_security()) || (ROLE_DOMAIN_PDC != lp_server_role())) {					if (SVAL(uniuser, 0) == 0) {						SSVAL(q, 0, SAMLOGON_UNK_R);	/* user unknown */					} else {						SSVAL(q, 0, SAMLOGON_R);					}					q += 2;					q += dos_PutUniCode(q, reply_name,sizeof(pstring), True);					q += dos_PutUniCode(q, ascuser, sizeof(pstring), True);					q += dos_PutUniCode(q, lp_workgroup(),sizeof(pstring), True);				}#ifdef HAVE_ADS				else {					struct uuid domain_guid;					UUID_FLAT flat_guid;					pstring domain;					pstring hostname;					char *component, *dc, *q1;					uint8 size;					char *q_orig = q;					int str_offset;					get_mydnsdomname(domain);					get_myname(hostname);						if (SVAL(uniuser, 0) == 0) {						SIVAL(q, 0, SAMLOGON_AD_UNK_R);	/* user unknown */					} else {						SIVAL(q, 0, SAMLOGON_AD_R);					}					q += 4;					SIVAL(q, 0, ADS_PDC|ADS_GC|ADS_LDAP|ADS_DS|						ADS_KDC|ADS_TIMESERV|ADS_CLOSEST|ADS_WRITABLE);					q += 4;					/* Push Domain GUID */					if (False == secrets_fetch_domain_guid(domain, &domain_guid)) {						DEBUG(2, ("Could not fetch DomainGUID for %s\n", domain));						return;					}					smb_uuid_pack(domain_guid, &flat_guid);					memcpy(q, &flat_guid.info, UUID_FLAT_SIZE);					q += UUID_FLAT_SIZE;					/* Forest */					str_offset = q - q_orig;					dc = domain;					q1 = q;					while ((component = strtok(dc, "."))) {						dc = NULL;						size = push_ascii(&q[1], component, -1, 0);						SCVAL(q, 0, size);						q += (size + 1);					}					/* Unk0 */					SCVAL(q, 0, 0);					q++;					/* Domain */					SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F));					SCVAL(q, 1, str_offset & 0xFF);					q += 2;					/* Hostname */					size = push_ascii(&q[1], hostname, -1, 0);					SCVAL(q, 0, size);					q += (size + 1);					SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F));					SCVAL(q, 1, str_offset & 0xFF);					q += 2;					/* NETBIOS of domain */					size = push_ascii(&q[1], lp_workgroup(), -1, STR_UPPER);					SCVAL(q, 0, size);					q += (size + 1);					/* Unk1 */					SCVAL(q, 0, 0);					q++;					/* NETBIOS of hostname */					size = push_ascii(&q[1], my_name, -1, 0);					SCVAL(q, 0, size);					q += (size + 1);					/* Unk2 */					SCVAL(q, 0, 0);					q++;					/* User name */					if (SVAL(uniuser, 0) != 0) {						size = push_ascii(&q[1], ascuser, -1, 0);						SCVAL(q, 0, size);						q += (size + 1);					}					q_orig = q;					/* Site name */					size = push_ascii(&q[1], "Default-First-Site-Name", -1, 0);					SCVAL(q, 0, size);					q += (size + 1);					/* Site name (2) */					str_offset = q - q_orig;					SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F));					SCVAL(q, 1, str_offset & 0xFF);					q += 2;					SCVAL(q, 0, PTR_DIFF(q,q1));					SCVAL(q, 1, 0x10); /* unknown */					SIVAL(q, 0, 0x00000002);					q += 4; /* unknown */					SIVAL(q, 0, (iface_ip(p->ip))->s_addr);					q += 4;					SIVAL(q, 0, 0x00000000);					q += 4; /* unknown */					SIVAL(q, 0, 0x00000000);					q += 4; /* unknown */				}	#endif				/* tell the client what version we are */				SIVAL(q, 0, ((ntversion < 11) || (SEC_ADS != lp_security())) ? 1 : 13); 				/* our ntversion */				SSVAL(q, 4, 0xffff); /* our lmnttoken */ 				SSVAL(q, 6, 0xffff); /* our lm20token */				q += 8;				dump_data(4, outbuf, PTR_DIFF(q, outbuf));				pull_ascii_fstring(getdc_str, getdc);				pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);				send_mailslot(True, getdc,					outbuf,PTR_DIFF(q,outbuf),					global_myname(), 0x0,					source_name,					dgram->source_name.name_type,					p->ip, *iface_ip(p->ip), p->port);  				break;			}		/* Announce change to UAS or SAM.  Send by the domain controller when a		replication event is required. */		case SAM_UAS_CHANGE:			{				struct sam_database_info *db_info;				char *q = buf + 2;				int i, db_count;				uint32 low_serial;          				/* Header */          				if (PTR_DIFF(q + 16, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				low_serial = IVAL(q, 0); q += 4;     /* Low serial number */				q += 4;                   /* Date/time */				q += 4;                   /* Pulse */				q += 4;                   /* Random */          				/* Domain info */          				q = skip_string(q, 1);    /* PDC name */				if (PTR_DIFF(q, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				q = skip_string(q, 1);    /* Domain name */				if (PTR_DIFF(q, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				q = skip_unibuf(q, PTR_DIFF(buf + len, q)); /* Unicode PDC name */				if (PTR_DIFF(q, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				q = skip_unibuf(q, PTR_DIFF(buf + len, q)); /* Unicode domain name */          				/* Database info */          				if (PTR_DIFF(q + 2, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				db_count = SVAL(q, 0); q += 2;				if (PTR_DIFF(q + (db_count*20), buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				db_info = SMB_MALLOC_ARRAY(struct sam_database_info, db_count);				if (db_info == NULL) {					DEBUG(3, ("out of memory allocating info for %d databases\n", db_count));					return;				}          				for (i = 0; i < db_count; i++) {					db_info[i].index = IVAL(q, 0);					db_info[i].serial_lo = IVAL(q, 4);					db_info[i].serial_hi = IVAL(q, 8);					db_info[i].date_lo = IVAL(q, 12);					db_info[i].date_hi = IVAL(q, 16);					q += 20;				}				/* Domain SID */#if 0				/* We must range check this. */				q += IVAL(q, 0) + 4;  /* 4 byte length plus data */          				q += 2;               /* Alignment? */				/* Misc other info */				q += 4;               /* NT version (0x1) */				q += 2;               /* LMNT token (0xff) */				q += 2;               /* LM20 token (0xff) */#endif				SAFE_FREE(db_info);        /* Not sure whether we need to do anything useful with these */				/* Send message to smbd */				send_repl_message(low_serial);				break;			}		default:			DEBUG(3,("process_logon_packet: Unknown domain request %d\n",code));			return;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -