📄 clientgen.c
字号:
SSVAL(cli->outbuf,smb_vwv0,aSYSTEM | aHIDDEN); p = smb_buf(cli->outbuf); *p++ = 4; pstrcpy(p,fname); cli_send_smb(cli); if (!cli_receive_smb(cli)) { return False; } if (CVAL(cli->inbuf,smb_rcls) != 0) { return False; } return True;}/****************************************************************************create a directory****************************************************************************/BOOL cli_mkdir(struct cli_state *cli, char *dname){ char *p; memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); set_message(cli->outbuf,0, 2 + strlen(dname),True); CVAL(cli->outbuf,smb_com) = SMBmkdir; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); p = smb_buf(cli->outbuf); *p++ = 4; pstrcpy(p,dname); cli_send_smb(cli); if (!cli_receive_smb(cli)) { return False; } if (CVAL(cli->inbuf,smb_rcls) != 0) { return False; } return True;}/****************************************************************************remove a directory****************************************************************************/BOOL cli_rmdir(struct cli_state *cli, char *dname){ char *p; memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); set_message(cli->outbuf,0, 2 + strlen(dname),True); CVAL(cli->outbuf,smb_com) = SMBrmdir; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); p = smb_buf(cli->outbuf); *p++ = 4; pstrcpy(p,dname); cli_send_smb(cli); if (!cli_receive_smb(cli)) { return False; } if (CVAL(cli->inbuf,smb_rcls) != 0) { return False; } return True;}/****************************************************************************open a file****************************************************************************/int cli_nt_create(struct cli_state *cli, char *fname){ char *p; memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); set_message(cli->outbuf,24,1 + strlen(fname),True); CVAL(cli->outbuf,smb_com) = SMBntcreateX; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); SSVAL(cli->outbuf,smb_vwv0,0xFF); SIVAL(cli->outbuf,smb_ntcreate_Flags, 0x06); SIVAL(cli->outbuf,smb_ntcreate_RootDirectoryFid, 0x0); SIVAL(cli->outbuf,smb_ntcreate_DesiredAccess, 0x2019f); SIVAL(cli->outbuf,smb_ntcreate_FileAttributes, 0x0); SIVAL(cli->outbuf,smb_ntcreate_ShareAccess, 0x03); SIVAL(cli->outbuf,smb_ntcreate_CreateDisposition, 0x01); SIVAL(cli->outbuf,smb_ntcreate_CreateOptions, 0x0); SIVAL(cli->outbuf,smb_ntcreate_ImpersonationLevel, 0x02); SSVAL(cli->outbuf,smb_ntcreate_NameLength, strlen(fname)); p = smb_buf(cli->outbuf); pstrcpy(p,fname); p = skip_string(p,1); cli_send_smb(cli); if (!cli_receive_smb(cli)) { return -1; } if (CVAL(cli->inbuf,smb_rcls) != 0) { return -1; } return SVAL(cli->inbuf,smb_vwv2 + 1);}/****************************************************************************open a file****************************************************************************/int cli_open(struct cli_state *cli, char *fname, int flags, int share_mode){ char *p; unsigned openfn=0; unsigned accessmode=0; /* you must open for RW not just write - otherwise getattrE doesn't work! */ if ((flags & O_ACCMODE) == O_WRONLY && strncmp(cli->dev, "LPT", 3)) { flags = (flags & ~O_ACCMODE) | O_RDWR; } if (flags & O_CREAT) openfn |= (1<<4); if (!(flags & O_EXCL)) { if (flags & O_TRUNC) openfn |= (1<<1); else openfn |= (1<<0); } accessmode = (share_mode<<4); if ((flags & O_ACCMODE) == O_RDWR) { accessmode |= 2; } else if ((flags & O_ACCMODE) == O_WRONLY) { accessmode |= 1; } #if defined(O_SYNC) if ((flags & O_SYNC) == O_SYNC) { accessmode |= (1<<14); }#endif /* O_SYNC */ memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); set_message(cli->outbuf,15,1 + strlen(fname),True); CVAL(cli->outbuf,smb_com) = SMBopenX; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); SSVAL(cli->outbuf,smb_vwv0,0xFF); SSVAL(cli->outbuf,smb_vwv2,0); /* no additional info */ SSVAL(cli->outbuf,smb_vwv3,accessmode); SSVAL(cli->outbuf,smb_vwv4,aSYSTEM | aHIDDEN); SSVAL(cli->outbuf,smb_vwv5,0); SSVAL(cli->outbuf,smb_vwv8,openfn); p = smb_buf(cli->outbuf); pstrcpy(p,fname); p = skip_string(p,1); cli_send_smb(cli); if (!cli_receive_smb(cli)) { return -1; } if (CVAL(cli->inbuf,smb_rcls) != 0) { return -1; } return SVAL(cli->inbuf,smb_vwv2);}/**************************************************************************** close a file****************************************************************************/BOOL cli_close(struct cli_state *cli, int fnum){ memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); set_message(cli->outbuf,3,0,True); CVAL(cli->outbuf,smb_com) = SMBclose; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); SSVAL(cli->outbuf,smb_vwv0,fnum); SIVALS(cli->outbuf,smb_vwv1,-1); cli_send_smb(cli); if (!cli_receive_smb(cli)) { return False; } if (CVAL(cli->inbuf,smb_rcls) != 0) { return False; } return True;}/**************************************************************************** lock a file****************************************************************************/BOOL cli_lock(struct cli_state *cli, int fnum, uint32 offset, uint32 len, int timeout){ char *p; int saved_timeout = cli->timeout; memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0', smb_size); set_message(cli->outbuf,8,10,True); CVAL(cli->outbuf,smb_com) = SMBlockingX; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); CVAL(cli->outbuf,smb_vwv0) = 0xFF; SSVAL(cli->outbuf,smb_vwv2,fnum); CVAL(cli->outbuf,smb_vwv3) = 0; SIVALS(cli->outbuf, smb_vwv4, timeout); SSVAL(cli->outbuf,smb_vwv6,0); SSVAL(cli->outbuf,smb_vwv7,1); p = smb_buf(cli->outbuf); SSVAL(p, 0, cli->pid); SIVAL(p, 2, offset); SIVAL(p, 6, len); cli_send_smb(cli); cli->timeout = (timeout == -1) ? 0x7FFFFFFF : timeout; if (!cli_receive_smb(cli)) { cli->timeout = saved_timeout; return False; } cli->timeout = saved_timeout; if (CVAL(cli->inbuf,smb_rcls) != 0) { return False; } return True;}/**************************************************************************** unlock a file****************************************************************************/BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len, int timeout){ char *p; memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); set_message(cli->outbuf,8,10,True); CVAL(cli->outbuf,smb_com) = SMBlockingX; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); CVAL(cli->outbuf,smb_vwv0) = 0xFF; SSVAL(cli->outbuf,smb_vwv2,fnum); CVAL(cli->outbuf,smb_vwv3) = 0; SIVALS(cli->outbuf, smb_vwv4, timeout); SSVAL(cli->outbuf,smb_vwv6,1); SSVAL(cli->outbuf,smb_vwv7,0); p = smb_buf(cli->outbuf); SSVAL(p, 0, cli->pid); SIVAL(p, 2, offset); SIVAL(p, 6, len); cli_send_smb(cli); if (!cli_receive_smb(cli)) { return False; } if (CVAL(cli->inbuf,smb_rcls) != 0) { return False; } return True;}/****************************************************************************issue a single SMBread and don't wait for a reply****************************************************************************/static void cli_issue_read(struct cli_state *cli, int fnum, off_t offset, size_t size, int i){ memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); set_message(cli->outbuf,10,0,True); CVAL(cli->outbuf,smb_com) = SMBreadX; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); CVAL(cli->outbuf,smb_vwv0) = 0xFF; SSVAL(cli->outbuf,smb_vwv2,fnum); SIVAL(cli->outbuf,smb_vwv3,offset); SSVAL(cli->outbuf,smb_vwv5,size); SSVAL(cli->outbuf,smb_vwv6,size); SSVAL(cli->outbuf,smb_mid,cli->mid + i); cli_send_smb(cli);}/**************************************************************************** read from a file****************************************************************************/size_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_t size){ char *p; int total = -1; int issued=0; int received=0; int mpx = MAX(cli->max_mux-1, 1); int block = (cli->max_xmit - (smb_size+32)) & ~1023; int mid; int blocks = (size + (block-1)) / block; if (size == 0) return 0; while (received < blocks) { int size2; while (issued - received < mpx && issued < blocks) { int size1 = MIN(block, size-issued*block); cli_issue_read(cli, fnum, offset+issued*block, size1, issued); issued++; } if (!cli_receive_smb(cli)) { return total; } received++; mid = SVAL(cli->inbuf, smb_mid) - cli->mid; size2 = SVAL(cli->inbuf, smb_vwv5); if (CVAL(cli->inbuf,smb_rcls) != 0) { blocks = MIN(blocks, mid-1); continue; } if (size2 <= 0) { blocks = MIN(blocks, mid-1); /* this distinguishes EOF from an error */ total = MAX(total, 0); continue; } if (size2 > block) { DEBUG(0,("server returned more than we wanted!\n")); exit(1); } if (mid >= issued) { DEBUG(0,("invalid mid from server!\n")); exit(1); } p = smb_base(cli->inbuf) + SVAL(cli->inbuf,smb_vwv6); memcpy(buf+mid*block, p, size2); total = MAX(total, mid*block + size2); } while (received < issued) { cli_receive_smb(cli); received++; } return total;}/****************************************************************************issue a single SMBwrite and don't wait for a reply****************************************************************************/static void cli_issue_write(struct cli_state *cli, int fnum, off_t offset, uint16 mode, char *buf, size_t size, int i){ char *p; memset(cli->outbuf,'\0',smb_size); memset(cli->inbuf,'\0',smb_size); set_message(cli->outbuf,12,size,True); CVAL(cli->outbuf,smb_com) = SMBwriteX; SSVAL(cli->outbuf,smb_tid,cli->cnum); cli_setup_packet(cli); CVAL(cli->outbuf,smb_vwv0) = 0xFF; SSVAL(cli->outbuf,smb_vwv2,fnum); SIVAL(cli->outbuf,smb_vwv3,offset); SIVAL(cli->outbuf,smb_vwv5,IS_BITS_SET_ALL(mode, 0x0008) ? 0xFFFFFFFF : 0); SSVAL(cli->outbuf,smb_vwv7,mode); SSVAL(cli->outbuf,smb_vwv8,IS_BITS_SET_ALL(mode, 0x0008) ? size : 0); SSVAL(cli->outbuf,smb_vwv10,size); SSVAL(cli->outbuf,smb_vwv11, smb_buf(cli->outbuf) - smb_base(cli->outbuf)); p = smb_base(cli->outbuf) + SVAL(cli->outbuf,smb_vwv11); memcpy(p, buf, size); SSVAL(cli->outbuf,smb_mid,cli->mid + i); show_msg(cli->outbuf); cli_send_smb(cli);}/**************************************************************************** write to a file write_mode: 0x0001 disallow write cacheing 0x0002 return bytes remaining 0x0004 use raw named pipe protocol 0x0008 start of message mode named pipe protocol****************************************************************************/ssize_t cli_write(struct cli_state *cli, int fnum, uint16 write_mode, char *buf, off_t offset, size_t size){ int bwritten = 0; int issued = 0; int received = 0; int mpx = MAX(cli->max_mux-1, 1); int block = (cli->max_xmit - (smb_size+32)) & ~1023; int blocks = (size + (block-1)) / block; while (received < blocks) { while ((issued - received < mpx) && (issued < blocks)) { int bsent = issued * block; int size1 = MIN(block, size - bsent); cli_issue_write(cli, fnum, offset + bsent, write_mode, buf + bsent, size1, issued); issued++; } if (!cli_receive_smb(cli)) { return bwritten; } received++; if (CVAL(cli->inbuf,smb_rcls) != 0) { break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -