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

📄 smbtransaction.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (!smbbufferputb(ob, t->in.scount)		|| !smbbufferputb(ob, 0))		goto toosmall;	for (x = 0; x < t->in.scount; x++)		if (!smbbufferputs(ob, t->in.setup[x]))			goto toosmall;	bytecountfixupoffset = smbbufferwriteoffset(ob);	if (!smbbufferputs(ob, 0))		goto toosmall;	smbbufferwritelimit(ob, smbbufferwriteoffset(ob) + 65535);	if (!smbbufferputstring(ob, p, SMB_STRING_UPCASE, t->in.name))		goto toosmall;	if (t->in.pcount < t->in.tpcount) {		ulong align = smbbufferwriteoffset(ob) & 1;		ulong pthistime;		pthistime = smbbufferwritespace(ob) - align;		if (pthistime > t->in.tpcount - t->in.pcount)			pthistime = t->in.tpcount - t->in.pcount;		if (pthistime > 65535)			pthistime = 65535;		if (smbbufferwriteoffset(ob) > 65535)			pthistime = 0;		if (pthistime) {			assert(smbbufferalignl2(ob, 0));			assert(smbbufferoffsetputs(ob, countsfixupoffset, pthistime));			assert(smbbufferoffsetputs(ob, countsfixupoffset + 2, smbbufferwriteoffset(ob)));			assert(smbbufferputbytes(ob, t->in.parameters + t->in.pcount, pthistime));		}		t->in.pcount += pthistime;	}	if (t->in.dcount < t->in.tdcount) {		ulong align = smbbufferwriteoffset(ob) & 1;		ulong dthistime;		dthistime = smbbufferwritespace(ob) - align;		if (dthistime > t->in.tdcount - t->in.dcount)			dthistime = t->in.tdcount - t->in.dcount;		if (dthistime > 65535)			dthistime = 65535;		if (smbbufferwriteoffset(ob) > 65535)			dthistime = 0;		if (dthistime) {			assert(smbbufferalignl2(ob, 0));			assert(smbbufferoffsetputs(ob, countsfixupoffset + 4, dthistime));			assert(smbbufferoffsetputs(ob, countsfixupoffset + 6, smbbufferwriteoffset(ob)));			assert(smbbufferputbytes(ob, t->in.data + t->in.dcount, dthistime));		}		t->in.dcount += dthistime;	}	*bytecountp = smbbufferwriteoffset(ob) - bytecountfixupoffset - 2;	assert(smbbufferoffsetputs(ob, bytecountfixupoffset, *bytecountp));	return 1;}intsmbtransactionencodeprimary(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob,	uchar *wordcountp, ushort *bytecountp, char **errmsgp){	return _transactionencodeprimary(t, SMB_COM_TRANSACTION, h, p,ob, wordcountp, bytecountp, errmsgp);};intsmbtransactionencodeprimary2(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob,	uchar *wordcountp, ushort *bytecountp, char **errmsgp){	return _transactionencodeprimary(t, SMB_COM_TRANSACTION2, h, p,ob, wordcountp, bytecountp, errmsgp);};int_transactionencoderesponse(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, uchar cmd,	char **errmsgp){	SmbHeader mh;	ulong countsfixupoffset, bytecountfixupoffset;	int palign, dalign;	ulong pbytecount, dbytecount;	ulong poffset, doffset;	if (t->in.maxpcount > 65535 || t->in.maxdcount > 65535) {		smbstringprint(errmsgp, "counts too big");		return 0;	}	mh = *h;	mh.wordcount = 10;	mh.flags &= ~SMB_FLAGS_SERVER_TO_REDIR;	mh.command = cmd;	mh.errclass = SUCCESS;	mh.error = SUCCESS;	if (!smbbufferputheader(ob, &mh, p)		|| !smbbufferputs(ob, smbbufferwriteoffset(t->out.parameters))		|| !smbbufferputs(ob, smbbufferwriteoffset(t->out.data))		|| !smbbufferputs(ob, 0)) {	toosmall:		smbstringprint(errmsgp, "output buffer too small");		goto toosmall;	}	countsfixupoffset = smbbufferwriteoffset(ob);	if (!smbbufferputbytes(ob, nil, 6 * sizeof(ushort))		|| !smbbufferputb(ob, 0)	// scount == 0		|| !smbbufferputb(ob, 0))	// reserved2		goto toosmall;	/* now the byte count */	bytecountfixupoffset = smbbufferwriteoffset(ob);	if (!smbbufferputs(ob, 0))		goto toosmall;	smbbufferwritelimit(ob, smbbufferwriteoffset(ob) + 65535);	palign = bytecountfixupoffset & 1;	if (palign && !smbbufferputb(ob, 0))		goto toosmall;	pbytecount = smbbufferreadspace(t->out.parameters);	if (pbytecount > smbbufferwritespace(ob))		pbytecount = smbbufferwritespace(ob);	poffset = smbbufferwriteoffset(ob);	if (poffset > 65535)		goto toosmall;	if (!smbbufferputbytes(ob, smbbufferreadpointer(t->out.parameters), pbytecount))		goto toosmall;	dalign = smbbufferwritespace(ob) > 0 && (smbbufferwriteoffset(ob) & 1) != 0;	if (dalign && !smbbufferputb(ob, 0))		goto toosmall;	dbytecount = smbbufferreadspace(t->out.data);	if (dbytecount > smbbufferwritespace(ob))		dbytecount = smbbufferwritespace(ob);	doffset = smbbufferwriteoffset(ob);	if (doffset > 65535)		goto toosmall;	if (!smbbufferputbytes(ob, smbbufferreadpointer(t->out.data), dbytecount))		goto toosmall;	if (!smbbufferoffsetputs(ob, bytecountfixupoffset, palign + pbytecount + dalign + dbytecount)		|| !smbbufferoffsetputs(ob, countsfixupoffset, pbytecount)		|| !smbbufferoffsetputs(ob, countsfixupoffset + 2, poffset)		|| !smbbufferoffsetputs(ob, countsfixupoffset + 4, smbbufferreadoffset(t->out.parameters))		|| !smbbufferoffsetputs(ob, countsfixupoffset + 6, dbytecount)		|| !smbbufferoffsetputs(ob, countsfixupoffset + 8, doffset)		|| !smbbufferoffsetputs(ob, countsfixupoffset + 10, smbbufferreadoffset(t->out.data)))		goto toosmall;	assert(smbbufferoffsetputs(ob, bytecountfixupoffset, smbbufferwriteoffset(ob) - bytecountfixupoffset - 2));	smbbuffergetbytes(t->out.parameters, nil, pbytecount);	smbbuffergetbytes(t->out.data, nil, dbytecount);	return 1;}intsmbtransactionencoderesponse(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, char **errmsgp){	return _transactionencoderesponse(t, h, p, ob, SMB_COM_TRANSACTION, errmsgp);}intsmbtransactionencoderesponse2(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, char **errmsgp){	return _transactionencoderesponse(t, h, p, ob, SMB_COM_TRANSACTION2, errmsgp);}intsmbtransactionrespond(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, SmbTransactionMethod *method, void *magic, char **errmsgp){	/* generate one or more responses */	while (smbbufferreadspace(t->out.parameters) || smbbufferreadspace(t->out.data)) {		assert(method->encoderesponse);		if (!(*method->encoderesponse)(t, h, p, ob, errmsgp))			return 0;		assert(method->sendresponse);		if (!(*method->sendresponse)(magic, ob, errmsgp))			return 0;	}	return 1;}intsmbtransactionnbdgramsend(void *magic, SmbBuffer *ob, char **errmsgp){	NbDgramSendParameters *p = magic;//print("sending to %B\n", p->to);//nbdumpdata(smbbufferreadpointer(ob), smbbufferreadspace(ob));	if (!nbdgramsend(p, smbbufferreadpointer(ob), smbbufferreadspace(ob))) {		smbstringprint(errmsgp, "dgram send failed");		return 0;	}	return 1;}SmbTransactionMethod smbtransactionmethoddgram = {	.encodeprimary = smbtransactionencodeprimary,	.sendrequest = smbtransactionnbdgramsend,	.encoderesponse = smbtransactionencoderesponse,};intsmbtransactionexecute(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *iob, SmbTransactionMethod *method, void *magic, SmbHeader *rhp, char **errmsgp){	uchar sentwordcount;	ushort sentbytecount;	SmbHeader rh;	smbbufferreset(iob);	if (!(*method->encodeprimary)(t, h, p, iob, &sentwordcount, &sentbytecount, errmsgp))		return 0;//	smblogprint(-1, "sent...\n");//	smblogdata(-1, smblogprint, smbbufferreadpointer(iob), smbbufferreadspace(iob));	if (!(*method->sendrequest)(magic, iob, errmsgp))		return 0;	if (t->in.pcount < t->in.tpcount || t->in.dcount < t->in.tdcount) {		uchar wordcount;		ushort bytecount;		/* secondary needed */		if (method->encodesecondary == nil || method->receiveintermediate == nil) {			smbstringprint(errmsgp, "buffer too small and secondaries not allowed");			return 0;		}		if (!(*method->receiveintermediate)(magic, &wordcount, &bytecount, errmsgp))			return 0;		if (sentwordcount != wordcount || sentbytecount != bytecount) {			smbstringprint(errmsgp, "server intermediate reply counts differ");			return 0;		}		do {			if (!(*method->encodesecondary)(t, h, iob, errmsgp))				return 0;			if (!(*method->sendrequest)(magic, iob, errmsgp))				return 0;		} while (t->in.pcount < t->in.tpcount || t->in.dcount < t->in.tdcount);	}	if (method->receiveresponse == nil || method->decoderesponse == nil)		return 1;	do {		uchar *pdata;		ushort bytecount;		if (!(*method->receiveresponse)(magic, iob, errmsgp))			return 0;		if (!smbbuffergetheader(iob, &rh, &pdata, &bytecount)) {			smbstringprint(errmsgp, "smbtransactionexecute: invalid response header");			return 0;		}		if (!smbcheckheaderdirection(&rh, 1, errmsgp))			return 0;		if (rh.errclass != SUCCESS) {			smbstringprint(errmsgp, "smbtransactionexecute: remote error %d/%d", rh.errclass, rh.error);			return 0;		}		if (!smbbuffertrimreadlen(iob, bytecount)) {			smbstringprint(errmsgp, "smbtransactionexecute: invalid bytecount");			return 0;		}//		smblogprint(-1, "received...\n");//		smblogdata(-1, smblogprint, smbbufferreadpointer(iob), smbbufferreadspace(iob));		if (!(*method->decoderesponse)(t, &rh, pdata, iob, errmsgp))			return 0;	} while (smbbufferwriteoffset(t->out.parameters) < t->out.tpcount || smbbufferwriteoffset(t->out.data) < t->out.tdcount);	if (rhp)		*rhp = rh;	return 1;}

⌨️ 快捷键说明

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