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

📄 clitrans.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	cli_signing_trans_stop(cli);	return(True);}/**************************************************************************** Send a SMB nttrans request.****************************************************************************/BOOL cli_send_nt_trans(struct cli_state *cli, 		       int function, 		       int flags,		       uint16 *setup, unsigned int lsetup, unsigned int msetup,		       char *param, unsigned int lparam, unsigned int mparam,		       char *data, unsigned int ldata, unsigned int mdata){	unsigned int i;	unsigned int this_ldata,this_lparam;	unsigned int tot_data=0,tot_param=0;	uint16 mid;	char *outdata,*outparam;	this_lparam = MIN(lparam,cli->max_xmit - (500+lsetup*2)); /* hack */	this_ldata = MIN(ldata,cli->max_xmit - (500+lsetup*2+this_lparam));	memset(cli->outbuf,'\0',smb_size);	set_message(cli->outbuf,19+lsetup,0,True);	SCVAL(cli->outbuf,smb_com,SMBnttrans);	SSVAL(cli->outbuf,smb_tid, cli->cnum);	cli_setup_packet(cli);	/*	 * Save the mid we're using. We need this for finding	 * signing replies.	 */	mid = cli->mid;	outparam = smb_buf(cli->outbuf)+3;	outdata = outparam+this_lparam;	/* primary request */	SCVAL(cli->outbuf,smb_nt_MaxSetupCount,msetup);	SCVAL(cli->outbuf,smb_nt_Flags,flags);	SIVAL(cli->outbuf,smb_nt_TotalParameterCount, lparam);	SIVAL(cli->outbuf,smb_nt_TotalDataCount, ldata);	SIVAL(cli->outbuf,smb_nt_MaxParameterCount, mparam);	SIVAL(cli->outbuf,smb_nt_MaxDataCount, mdata);	SIVAL(cli->outbuf,smb_nt_ParameterCount, this_lparam);	SIVAL(cli->outbuf,smb_nt_ParameterOffset, smb_offset(outparam,cli->outbuf));	SIVAL(cli->outbuf,smb_nt_DataCount, this_ldata);	SIVAL(cli->outbuf,smb_nt_DataOffset, smb_offset(outdata,cli->outbuf));	SIVAL(cli->outbuf,smb_nt_SetupCount, lsetup);	SIVAL(cli->outbuf,smb_nt_Function, function);	for (i=0;i<lsetup;i++)		/* setup[] */		SSVAL(cli->outbuf,smb_nt_SetupStart+i*2,setup[i]);		if (this_lparam)			/* param[] */		memcpy(outparam,param,this_lparam);	if (this_ldata)			/* data[] */		memcpy(outdata,data,this_ldata);	cli_setup_bcc(cli, outdata+this_ldata);	show_msg(cli->outbuf);	if (!cli_send_smb(cli)) {		return False;	}		if (this_ldata < ldata || this_lparam < lparam) {		/* receive interim response */		if (!cli_receive_smb(cli) || cli_is_error(cli)) {			return(False);		}		tot_data = this_ldata;		tot_param = this_lparam;				while (tot_data < ldata || tot_param < lparam)  {			this_lparam = MIN(lparam-tot_param,cli->max_xmit - 500); /* hack */			this_ldata = MIN(ldata-tot_data,cli->max_xmit - (500+this_lparam));			set_message(cli->outbuf,18,0,True);			SCVAL(cli->outbuf,smb_com,SMBnttranss);			/* XXX - these should probably be aligned */			outparam = smb_buf(cli->outbuf);			outdata = outparam+this_lparam;						/* secondary request */			SIVAL(cli->outbuf,smb_nts_TotalParameterCount,lparam);			SIVAL(cli->outbuf,smb_nts_TotalDataCount,ldata);			SIVAL(cli->outbuf,smb_nts_ParameterCount,this_lparam);			SIVAL(cli->outbuf,smb_nts_ParameterOffset,smb_offset(outparam,cli->outbuf));			SIVAL(cli->outbuf,smb_nts_ParameterDisplacement,tot_param);			SIVAL(cli->outbuf,smb_nts_DataCount,this_ldata);			SIVAL(cli->outbuf,smb_nts_DataOffset,smb_offset(outdata,cli->outbuf));			SIVAL(cli->outbuf,smb_nts_DataDisplacement,tot_data);			if (this_lparam)			/* param[] */				memcpy(outparam,param+tot_param,this_lparam);			if (this_ldata)			/* data[] */				memcpy(outdata,data+tot_data,this_ldata);			cli_setup_bcc(cli, outdata+this_ldata);						/*			 * Save the mid we're using. We need this for finding			 * signing replies.			 */			mid = cli->mid;			show_msg(cli->outbuf);			if (!cli_send_smb(cli)) {				return False;			}						/* Ensure we use the same mid for the secondaries. */			cli->mid = mid;						tot_data += this_ldata;			tot_param += this_lparam;		}	}	/* Note we're in a trans state. Save the sequence	 * numbers for replies. */	cli_signing_trans_start(cli, mid);	return(True);}/**************************************************************************** Receive a SMB nttrans response allocating the necessary memory.****************************************************************************/BOOL cli_receive_nt_trans(struct cli_state *cli,			  char **param, unsigned int *param_len,			  char **data, unsigned int *data_len){	unsigned int total_data=0;	unsigned int total_param=0;	unsigned int this_data,this_param;	uint8 eclass;	uint32 ecode;	char *tdata;	char *tparam;	*data_len = *param_len = 0;	if (!cli_receive_smb(cli)) {		cli_signing_trans_stop(cli);		return False;	}	show_msg(cli->inbuf);		/* sanity check */	if (CVAL(cli->inbuf,smb_com) != SMBnttrans) {		DEBUG(0,("Expected SMBnttrans response, got command 0x%02x\n",			 CVAL(cli->inbuf,smb_com)));		cli_signing_trans_stop(cli);		return(False);	}	/*	 * An NT RPC pipe call can return ERRDOS, ERRmoredata	 * to a trans call. This is not an error and should not	 * be treated as such.	 */	if (cli_is_dos_error(cli)) {                cli_dos_error(cli, &eclass, &ecode);		if (!(eclass == ERRDOS && ecode == ERRmoredata)) {			cli_signing_trans_stop(cli);			return(False);		}	}	/*	 * Likewise for NT_STATUS_BUFFER_TOO_SMALL	 */	if (cli_is_nt_error(cli)) {		if (!NT_STATUS_EQUAL(cli_nt_error(cli),				     NT_STATUS_BUFFER_TOO_SMALL)) {			cli_signing_trans_stop(cli);			return(False);		}	}	/* parse out the lengths */	total_data = SVAL(cli->inbuf,smb_ntr_TotalDataCount);	total_param = SVAL(cli->inbuf,smb_ntr_TotalParameterCount);	/* allocate it */	if (total_data) {		tdata = SMB_REALLOC(*data,total_data);		if (!tdata) {			DEBUG(0,("cli_receive_nt_trans: failed to enlarge data buffer to %d\n",total_data));			cli_signing_trans_stop(cli);			return False;		} else {			*data = tdata;		}	}	if (total_param) {		tparam = SMB_REALLOC(*param,total_param);		if (!tparam) {			DEBUG(0,("cli_receive_nt_trans: failed to enlarge param buffer to %d\n", total_param));			cli_signing_trans_stop(cli);			return False;		} else {			*param = tparam;		}	}	while (1)  {		this_data = SVAL(cli->inbuf,smb_ntr_DataCount);		this_param = SVAL(cli->inbuf,smb_ntr_ParameterCount);		if (this_data + *data_len > total_data ||		    this_param + *param_len > total_param) {			DEBUG(1,("Data overflow in cli_receive_nt_trans\n"));			cli_signing_trans_stop(cli);			return False;		}		if (this_data + *data_len < this_data ||				this_data + *data_len < *data_len ||				this_param + *param_len < this_param ||				this_param + *param_len < *param_len) {			DEBUG(1,("Data overflow in cli_receive_nt_trans\n"));			cli_signing_trans_stop(cli);			return False;		}		if (this_data) {			unsigned int data_offset_out = SVAL(cli->inbuf,smb_ntr_DataDisplacement);			unsigned int data_offset_in = SVAL(cli->inbuf,smb_ntr_DataOffset);			if (data_offset_out > total_data ||					data_offset_out + this_data > total_data ||					data_offset_out + this_data < data_offset_out ||					data_offset_out + this_data < this_data) {				DEBUG(1,("Data overflow in cli_receive_nt_trans\n"));				cli_signing_trans_stop(cli);				return False;			}			if (data_offset_in > cli->bufsize ||					data_offset_in + this_data >  cli->bufsize ||					data_offset_in + this_data < data_offset_in ||					data_offset_in + this_data < this_data) {				DEBUG(1,("Data overflow in cli_receive_nt_trans\n"));				cli_signing_trans_stop(cli);				return False;			}			memcpy(*data + data_offset_out, smb_base(cli->inbuf) + data_offset_in, this_data);		}		if (this_param) {			unsigned int param_offset_out = SVAL(cli->inbuf,smb_ntr_ParameterDisplacement);			unsigned int param_offset_in = SVAL(cli->inbuf,smb_ntr_ParameterOffset);			if (param_offset_out > total_param ||					param_offset_out + this_param > total_param ||					param_offset_out + this_param < param_offset_out ||					param_offset_out + this_param < this_param) {				DEBUG(1,("Param overflow in cli_receive_nt_trans\n"));				cli_signing_trans_stop(cli);				return False;			}			if (param_offset_in > cli->bufsize ||					param_offset_in + this_param >  cli->bufsize ||					param_offset_in + this_param < param_offset_in ||					param_offset_in + this_param < this_param) {				DEBUG(1,("Param overflow in cli_receive_nt_trans\n"));				cli_signing_trans_stop(cli);				return False;			}			memcpy(*param + param_offset_out, smb_base(cli->inbuf) + param_offset_in, this_param);		}		*data_len += this_data;		*param_len += this_param;		if (total_data <= *data_len && total_param <= *param_len)			break;				if (!cli_receive_smb(cli)) {			cli_signing_trans_stop(cli);			return False;		}		show_msg(cli->inbuf);				/* sanity check */		if (CVAL(cli->inbuf,smb_com) != SMBnttrans) {			DEBUG(0,("Expected SMBnttrans response, got command 0x%02x\n",				 CVAL(cli->inbuf,smb_com)));			cli_signing_trans_stop(cli);			return(False);		}		if (cli_is_dos_error(cli)) {                        cli_dos_error(cli, &eclass, &ecode);			if(!(eclass == ERRDOS && ecode == ERRmoredata)) {				cli_signing_trans_stop(cli);				return(False);			}		}		/*		 * Likewise for NT_STATUS_BUFFER_TOO_SMALL		 */		if (cli_is_nt_error(cli)) {			if (!NT_STATUS_EQUAL(cli_nt_error(cli),					     NT_STATUS_BUFFER_TOO_SMALL)) {				cli_signing_trans_stop(cli);				return(False);			}		}		/* parse out the total lengths again - they can shrink! */		if (SVAL(cli->inbuf,smb_ntr_TotalDataCount) < total_data)			total_data = SVAL(cli->inbuf,smb_ntr_TotalDataCount);		if (SVAL(cli->inbuf,smb_ntr_TotalParameterCount) < total_param)			total_param = SVAL(cli->inbuf,smb_ntr_TotalParameterCount);				if (total_data <= *data_len && total_param <= *param_len)			break;	}		cli_signing_trans_stop(cli);	return(True);}

⌨️ 快捷键说明

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