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

📄 clientgen.c

📁 MC Linux/Unix 终端下文件管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
	p += 2;	pstrcpy(p,user);	strupper(p);	p += 21;	p++;	p += 15;	p++; 	pstrcpy(p, workstation); 	strupper(p);	p += 16;	SSVAL(p, 0, CLI_BUFFER_SIZE);	p += 2;	SSVAL(p, 0, CLI_BUFFER_SIZE);	p += 2;		if (cli_api(cli,                     param, PTR_DIFF(p,param),1024,  /* param, length, max */                    NULL, 0, CLI_BUFFER_SIZE,           /* data, length, max */                    &rparam, &rprcnt,               /* return params, return size */                    &rdata, &rdrcnt                 /* return data, return size */                   )) {		cli->rap_error = SVAL(rparam,0);		p = rdata;				if (cli->rap_error == 0) {			DEBUG(4,("NetWkstaUserLogon success\n"));			cli->privileges = SVAL(p, 24);			fstrcpy(cli->eff_name,p+2);		} else {			DEBUG(1,("NetwkstaUserLogon gave error %d\n", cli->rap_error));		}	}		if (rparam)      free(rparam);	if (rdata)      free(rdata);	return (cli->rap_error == 0);}/****************************************************************************call a NetShareEnum - try and browse available connections on a host****************************************************************************/int cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, const char *, void *), void * state){  char *rparam = NULL;  char *rdata = NULL;  char *p;  int rdrcnt,rprcnt;  pstring param;  int count = -1;  /* now send a SMBtrans command with api RNetShareEnum */  p = param;  SSVAL(p,0,0); /* api number */  p += 2;  pstrcpy(p,"WrLeh");  p = skip_string(p,1);  pstrcpy(p,"B13BWz");  p = skip_string(p,1);  SSVAL(p,0,1);  /*   * Win2k needs a *smaller* buffer than 0xFFFF here -   * it returns "out of server memory" with 0xFFFF !!! JRA.   */  SSVAL(p,2,0xFFE0);  p += 4;  if (cli_api(cli,               param, PTR_DIFF(p,param), 1024,  /* Param, length, maxlen */              NULL, 0, 0xFFE0,            /* data, length, maxlen - Win2k needs a small buffer here too ! */              &rparam, &rprcnt,                /* return params, length */              &rdata, &rdrcnt))                /* return data, length */    {      int res = SVAL(rparam,0);      int converter=SVAL(rparam,2);      int i;            if (res == 0 || res == ERRmoredata) {	      count=SVAL(rparam,4);	      p = rdata;	      for (i=0;i<count;i++,p+=20) {		      char *sname = p;		      int type = SVAL(p,14);		      int comment_offset = IVAL(p,16) & 0xFFFF;		      char *cmnt = comment_offset?(rdata+comment_offset-converter):"";		      fn(sname, type, cmnt, state);	      }      } else {	      DEBUG(4,("NetShareEnum res=%d\n", res));      }          } else {	      DEBUG(4,("NetShareEnum failed\n"));    }    if (rparam)    free(rparam);  if (rdata)    free(rdata);  return count;}/****************************************************************************call a NetServerEnum for the specified workgroup and servertype mask.This function then calls the specified callback function for each name returned.The callback function takes 3 arguments: the machine name, the server type andthe comment.****************************************************************************/BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype,		       void (*fn)(const char *, uint32, const char *, void *), void *state){	char *rparam = NULL;	char *rdata = NULL;	int rdrcnt,rprcnt;	char *p;	pstring param;	int uLevel = 1;	int count = -1;  	/* send a SMBtrans command with api NetServerEnum */	p = param;	SSVAL(p,0,0x68); /* api number */	p += 2;	pstrcpy(p,"WrLehDz");	p = skip_string(p,1);  	pstrcpy(p,"B16BBDz");  	p = skip_string(p,1);	SSVAL(p,0,uLevel);	SSVAL(p,2,CLI_BUFFER_SIZE);	p += 4;	SIVAL(p,0,stype);	p += 4;		pstrcpy(p, workgroup);	p = skip_string(p,1);		if (cli_api(cli,                     param, PTR_DIFF(p,param), 8,        /* params, length, max */                    NULL, 0, CLI_BUFFER_SIZE,               /* data, length, max */                    &rparam, &rprcnt,                   /* return params, return size */                    &rdata, &rdrcnt                     /* return data, return size */                   )) {		int res = SVAL(rparam,0);		int converter=SVAL(rparam,2);		int i;					if (res == 0 || res == ERRmoredata) {			count=SVAL(rparam,4);			p = rdata;								for (i = 0;i < count;i++, p += 26) {				char *sname = p;				int comment_offset = (IVAL(p,22) & 0xFFFF)-converter;				char *cmnt = comment_offset?(rdata+comment_offset):"";				if (comment_offset < 0 || comment_offset > rdrcnt) continue;				stype = IVAL(p,18) & ~SV_TYPE_LOCAL_LIST_ONLY;				fn(sname, stype, cmnt, state);			}		}	}  	if (rparam)      free(rparam);	if (rdata)      free(rdata);		return(count > 0);}static  struct {    int prot;    char *name;  }const prots[] =     {      {PROTOCOL_CORE,"PC NETWORK PROGRAM 1.0"},      {PROTOCOL_COREPLUS,"MICROSOFT NETWORKS 1.03"},      {PROTOCOL_LANMAN1,"MICROSOFT NETWORKS 3.0"},      {PROTOCOL_LANMAN1,"LANMAN1.0"},      {PROTOCOL_LANMAN2,"LM1.2X002"},      {PROTOCOL_LANMAN2,"Samba"},      {PROTOCOL_NT1,"NT LANMAN 1.0"},      {PROTOCOL_NT1,"NT LM 0.12"},      {-1,NULL}    };/****************************************************************************send a session setup ****************************************************************************/BOOL cli_session_setup(struct cli_state *cli, 		       char *user, 		       char *pass, int passlen,		       char *ntpass, int ntpasslen,		       char *workgroup){	char *p;	fstring pword, ntpword;	if (cli->protocol < PROTOCOL_LANMAN1)		return True;	if (passlen > sizeof(pword)-1 || ntpasslen > sizeof(ntpword)-1) {		return False;	}        if (((passlen == 0) || (passlen == 1)) && (pass[0] == '\0')) {          /* Null session connect. */          pword[0] = '\0';          ntpword[0] = '\0';        } else {          if ((cli->sec_mode & 2) && passlen != 24) {            passlen = 24;            ntpasslen = 24;            SMBencrypt((uchar *)pass,(uchar *)cli->cryptkey,(uchar *)pword);            SMBNTencrypt((uchar *)ntpass,(uchar *)cli->cryptkey,(uchar *)ntpword);          } else {		  fstrcpy(pword, pass);		  fstrcpy(ntpword, "");		  ntpasslen = 0;          }        }	/* if in share level security then don't send a password now */	if (!(cli->sec_mode & 1)) {		fstrcpy(pword, "");		passlen=1;		fstrcpy(ntpword, "");		ntpasslen=1;	} 	/* send a session setup command */	memset(cli->outbuf,'\0',smb_size);	if (cli->protocol < PROTOCOL_NT1)	{		set_message(cli->outbuf,10,1 + strlen(user) + passlen,True);		CVAL(cli->outbuf,smb_com) = SMBsesssetupX;		cli_setup_packet(cli);		CVAL(cli->outbuf,smb_vwv0) = 0xFF;		SSVAL(cli->outbuf,smb_vwv2,cli->max_xmit);		SSVAL(cli->outbuf,smb_vwv3,2);		SSVAL(cli->outbuf,smb_vwv4,1);		SIVAL(cli->outbuf,smb_vwv5,cli->sesskey);		SSVAL(cli->outbuf,smb_vwv7,passlen);		p = smb_buf(cli->outbuf);		memcpy(p,pword,passlen);		p += passlen;		pstrcpy(p,user);		strupper(p);	}	else	{		set_message(cli->outbuf,13,0,True);		CVAL(cli->outbuf,smb_com) = SMBsesssetupX;		cli_setup_packet(cli);				CVAL(cli->outbuf,smb_vwv0) = 0xFF;		SSVAL(cli->outbuf,smb_vwv2,CLI_BUFFER_SIZE);		SSVAL(cli->outbuf,smb_vwv3,2);		SSVAL(cli->outbuf,smb_vwv4,cli->pid);		SIVAL(cli->outbuf,smb_vwv5,cli->sesskey);		SSVAL(cli->outbuf,smb_vwv7,passlen);		SSVAL(cli->outbuf,smb_vwv8,ntpasslen);		SSVAL(cli->outbuf,smb_vwv11,0);		p = smb_buf(cli->outbuf);		memcpy(p,pword,passlen); 		p += SVAL(cli->outbuf,smb_vwv7);		memcpy(p,ntpword,ntpasslen); 		p += SVAL(cli->outbuf,smb_vwv8);		pstrcpy(p,user);		strupper(p);		p = skip_string(p,1);		pstrcpy(p,workgroup);		strupper(p);		p = skip_string(p,1);		pstrcpy(p,"Unix");p = skip_string(p,1);		pstrcpy(p,"Samba");p = skip_string(p,1);		set_message(cli->outbuf,13,PTR_DIFF(p,smb_buf(cli->outbuf)),False);	}      cli_send_smb(cli);      if (!cli_receive_smb(cli))	      return False;      show_msg(cli->inbuf);      if (CVAL(cli->inbuf,smb_rcls) != 0) {	      return False;      }      /* use the returned vuid from now on */      cli->vuid = SVAL(cli->inbuf,smb_uid);      if (cli->protocol >= PROTOCOL_NT1) {        /*         * Save off some of the connected server         * info.         */        char *server_domain,*server_os,*server_type;        server_os = smb_buf(cli->inbuf);        server_type = skip_string(server_os,1);        server_domain = skip_string(server_type,1);        fstrcpy(cli->server_os, server_os);        fstrcpy(cli->server_type, server_type);        fstrcpy(cli->server_domain, server_domain);      }      fstrcpy(cli->user_name, user);      return True;}/**************************************************************************** Send a uloggoff.*****************************************************************************/BOOL cli_ulogoff(struct cli_state *cli){        memset(cli->outbuf,'\0',smb_size);        set_message(cli->outbuf,2,0,True);        CVAL(cli->outbuf,smb_com) = SMBulogoffX;        cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0,0xFF);	SSVAL(cli->outbuf,smb_vwv2,0);  /* no additional info */        cli_send_smb(cli);        if (!cli_receive_smb(cli))                return False;        return CVAL(cli->inbuf,smb_rcls) == 0;}/****************************************************************************send a tconX****************************************************************************/BOOL cli_send_tconX(struct cli_state *cli, 		    char *share, char *dev, char *pass, int passlen){	fstring fullshare, pword;	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	fstrcpy(cli->share, share);	/* in user level security don't send a password now */	if (cli->sec_mode & 1) {		passlen = 1;		pass = "";	}	if ((cli->sec_mode & 2) && *pass && passlen != 24) {		passlen = 24;		SMBencrypt((uchar *)pass,(uchar *)cli->cryptkey,(uchar *)pword);	} else {		memcpy(pword, pass, passlen);	}	slprintf(fullshare, sizeof(fullshare)-1,		 "\\\\%s\\%s", cli->desthost, share);	unix_to_dos(fullshare, True);	strupper(fullshare);	set_message(cli->outbuf,4,		    2 + strlen(fullshare) + passlen + strlen(dev),True);	CVAL(cli->outbuf,smb_com) = SMBtconX;	cli_setup_packet(cli);	SSVAL(cli->outbuf,smb_vwv0,0xFF);	SSVAL(cli->outbuf,smb_vwv3,passlen);	p = smb_buf(cli->outbuf);	memcpy(p,pword,passlen);	p += passlen;	fstrcpy(p,fullshare);	p = skip_string(p,1);	pstrcpy(p,dev);	SCVAL(cli->inbuf,smb_rcls, 1);	cli_send_smb(cli);	if (!cli_receive_smb(cli))		return False;	if (CVAL(cli->inbuf,smb_rcls) != 0) {		return False;	}	fstrcpy(cli->dev, "A:");	if (cli->protocol >= PROTOCOL_NT1) {		fstrcpy(cli->dev, smb_buf(cli->inbuf));	}	if (strcasecmp(share,"IPC$")==0) {		fstrcpy(cli->dev, "IPC");	}	/* only grab the device if we have a recent protocol level */	if (cli->protocol >= PROTOCOL_NT1 &&	    smb_buflen(cli->inbuf) == 3) {		/* almost certainly win95 - enable bug fixes */		cli->win95 = True;	}	cli->cnum = SVAL(cli->inbuf,smb_tid);	return True;}/****************************************************************************send a tree disconnect****************************************************************************/BOOL cli_tdis(struct cli_state *cli){	memset(cli->outbuf,'\0',smb_size);	set_message(cli->outbuf,0,0,True);	CVAL(cli->outbuf,smb_com) = SMBtdis;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);		cli_send_smb(cli);	if (!cli_receive_smb(cli))		return False;		return CVAL(cli->inbuf,smb_rcls) == 0;}/****************************************************************************rename a file****************************************************************************/BOOL cli_rename(struct cli_state *cli, char *fname_src, char *fname_dst){        char *p;        memset(cli->outbuf,'\0',smb_size);        memset(cli->inbuf,'\0',smb_size);        set_message(cli->outbuf,1, 4 + strlen(fname_src) + strlen(fname_dst), True);        CVAL(cli->outbuf,smb_com) = SMBmv;        SSVAL(cli->outbuf,smb_tid,cli->cnum);        cli_setup_packet(cli);        SSVAL(cli->outbuf,smb_vwv0,aSYSTEM | aHIDDEN);        p = smb_buf(cli->outbuf);        *p++ = 4;        pstrcpy(p,fname_src);        p = skip_string(p,1);        *p++ = 4;        pstrcpy(p,fname_dst);        cli_send_smb(cli);        if (!cli_receive_smb(cli)) {                return False;        }        if (CVAL(cli->inbuf,smb_rcls) != 0) {                return False;        }        return True;}/****************************************************************************delete a file****************************************************************************/BOOL cli_unlink(struct cli_state *cli, char *fname){	char *p;	memset(cli->outbuf,'\0',smb_size);	memset(cli->inbuf,'\0',smb_size);	set_message(cli->outbuf,1, 2 + strlen(fname),True);	CVAL(cli->outbuf,smb_com) = SMBunlink;	SSVAL(cli->outbuf,smb_tid,cli->cnum);	cli_setup_packet(cli);

⌨️ 快捷键说明

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