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

📄 smbcomread.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "headers.h"SmbProcessResultsmbcomreadandx(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b){	uchar andxcommand;	ushort andxoffset;	ulong andxoffsetfixup;	ulong datafixup;	ulong bytecountfixup;	ushort fid;	SmbTree *t;	SmbFile *f;	vlong offset;	ushort maxcount;	long toread;	long nb;	if (h->wordcount != 10 && h->wordcount != 12)		return SmbProcessResultFormat;	andxcommand = *pdata++;	pdata++;	andxoffset = smbnhgets(pdata); pdata += 2;	fid = smbnhgets(pdata); pdata += 2;	offset = smbnhgetl(pdata); pdata += 4;	maxcount = smbnhgets(pdata); pdata += 2;	pdata += 2;	// mincount	pdata += 4;	// timeout ?	pdata += 2;	// remaining	if (h->wordcount == 12)		offset |= (vlong)smbnhgetl(pdata) << 32;	t = smbidmapfind(s->tidmap, h->tid);	if (t == nil) {		smbseterror(s, ERRSRV, ERRinvtid);		return SmbProcessResultError;	}	f = smbidmapfind(s->fidmap, fid);	if (f == nil) {		smbseterror(s, ERRDOS, ERRbadfid);		return SmbProcessResultError;	}		if (!f->ioallowed) {		smbseterror(s, ERRDOS, ERRbadaccess);		return SmbProcessResultError;	}	h->wordcount = 12;	if (!smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, &andxoffsetfixup))		return SmbProcessResultMisc;	if (!smbbufferputs(s->response, -1)			// remaining		|| !smbbufferputs(s->response, 0)		// datacompactionmode		|| !smbbufferputs(s->response, 0))		// reserved		return SmbProcessResultMisc;	datafixup = smbbufferwriteoffset(s->response);	if (!smbbufferputbytes(s->response, nil, 6)		|| !smbbufferfill(s->response, 0, 8))		// reserved		return SmbProcessResultMisc;	bytecountfixup = smbbufferwriteoffset(s->response);	if (!smbbufferputs(s->response, 0)		|| !smbbufferputb(s->response, 0))		return SmbProcessResultMisc;	smbbufferwritelimit(s->response, smbbufferwriteoffset(s->response) + 65535);	smbbufferoffsetputs(s->response, datafixup + 2, smbbufferwriteoffset(s->response));	seek(f->fd, offset, 0);	toread = smbbufferwritespace(s->response);		if (toread > maxcount)		toread = maxcount;	nb = readn(f->fd, smbbufferwritepointer(s->response), toread);	if (nb < 0) {		smbseterror(s, ERRDOS, ERRbadaccess);		return SmbProcessResultError;	}	if (!smbbufferputbytes(s->response, nil, nb)		|| !smbbufferfixuprelatives(s->response, bytecountfixup)		|| !smbbufferoffsetputs(s->response, datafixup, nb)		|| !smbbufferoffsetputs(s->response, datafixup + 4, nb >> 16))		return SmbProcessResultMisc;	if (andxcommand != SMB_COM_NO_ANDX_COMMAND)		return smbchaincommand(s, h, andxoffsetfixup, andxcommand, andxoffset, b);	return SmbProcessResultReply;}

⌨️ 快捷键说明

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