parse_prs.c

来自「samba-3.0.22.tar.gz 编译smb服务器的源码」· C语言 代码 · 共 1,734 行 · 第 1/4 页

C
1,734
字号
	return True;}/******************************************************************* Copy all the data from a parse_struct into a buffer. ********************************************************************/BOOL prs_copy_all_data_out(char *dst, prs_struct *src){	uint32 len = prs_offset(src);	if (!len)		return True;	prs_set_offset(src, 0);	return prs_copy_data_out(dst, src, len);}/******************************************************************* Set the data as X-endian (external interface). ********************************************************************/void prs_set_endian_data(prs_struct *ps, BOOL endian){	ps->bigendian_data = endian;}/******************************************************************* Align a the data_len to a multiple of align bytes - filling with zeros. ********************************************************************/BOOL prs_align(prs_struct *ps){	uint32 mod = ps->data_offset & (ps->align-1);	if (ps->align != 0 && mod != 0) {		uint32 extra_space = (ps->align - mod);		if(!prs_grow(ps, extra_space))			return False;		memset(&ps->data_p[ps->data_offset], '\0', (size_t)extra_space);		ps->data_offset += extra_space;	}	return True;}/****************************************************************** Align on a 2 byte boundary *****************************************************************/ BOOL prs_align_uint16(prs_struct *ps){	BOOL ret;	uint8 old_align = ps->align;	ps->align = 2;	ret = prs_align(ps);	ps->align = old_align;		return ret;}/****************************************************************** Align on a 8 byte boundary *****************************************************************/ BOOL prs_align_uint64(prs_struct *ps){	BOOL ret;	uint8 old_align = ps->align;	ps->align = 8;	ret = prs_align(ps);	ps->align = old_align;		return ret;}/****************************************************************** Align on a specific byte boundary *****************************************************************/ BOOL prs_align_custom(prs_struct *ps, uint8 boundary){	BOOL ret;	uint8 old_align = ps->align;	ps->align = boundary;	ret = prs_align(ps);	ps->align = old_align;		return ret;}/******************************************************************* Align only if required (for the unistr2 string mainly) ********************************************************************/BOOL prs_align_needed(prs_struct *ps, uint32 needed){	if (needed==0)		return True;	else		return prs_align(ps);}/******************************************************************* Ensure we can read/write to a given offset. ********************************************************************/char *prs_mem_get(prs_struct *ps, uint32 extra_size){	if(UNMARSHALLING(ps)) {		/*		 * If reading, ensure that we can read the requested size item.		 */		if (ps->data_offset + extra_size > ps->buffer_size) {			DEBUG(0,("prs_mem_get: reading data of size %u would overrun "				"buffer by %u bytes.\n",				(unsigned int)extra_size,				(unsigned int)(ps->data_offset + extra_size - ps->buffer_size) ));			return NULL;		}	} else {		/*		 * Writing - grow the buffer if needed.		 */		if(!prs_grow(ps, extra_size))			return NULL;	}	return &ps->data_p[ps->data_offset];}/******************************************************************* Change the struct type. ********************************************************************/void prs_switch_type(prs_struct *ps, BOOL io){	if ((ps->io ^ io) == True)		ps->io=io;}/******************************************************************* Force a prs_struct to be dynamic even when it's size is 0. ********************************************************************/void prs_force_dynamic(prs_struct *ps){	ps->is_dynamic=True;}/******************************************************************* Associate a session key with a parse struct. ********************************************************************/void prs_set_session_key(prs_struct *ps, const char sess_key[16]){	ps->sess_key = sess_key;}/******************************************************************* Stream a uint8. ********************************************************************/BOOL prs_uint8(const char *name, prs_struct *ps, int depth, uint8 *data8){	char *q = prs_mem_get(ps, 1);	if (q == NULL)		return False;    if (UNMARSHALLING(ps))		*data8 = CVAL(q,0);	else		SCVAL(q,0,*data8);    DEBUG(5,("%s%04x %s: %02x\n", tab_depth(depth), ps->data_offset, name, *data8));	ps->data_offset += 1;	return True;}/******************************************************************* Stream a uint16* (allocate memory if unmarshalling) ********************************************************************/BOOL prs_pointer( const char *name, prs_struct *ps, int depth,                  void **data, size_t data_size,                 BOOL(*prs_fn)(const char*, prs_struct*, int, void*) ){	uint32 data_p;	/* output f000baaa to stream if the pointer is non-zero. */	data_p = *data ? 0xf000baaa : 0;	if ( !prs_uint32("ptr", ps, depth, &data_p ))		return False;	/* we're done if there is no data */	if ( !data_p )		return True;	if (UNMARSHALLING(ps)) {		if ( !(*data = PRS_ALLOC_MEM_VOID(ps, data_size)) )			return False;	}	return prs_fn(name, ps, depth, *data);}/******************************************************************* Stream a uint16. ********************************************************************/BOOL prs_uint16(const char *name, prs_struct *ps, int depth, uint16 *data16){	char *q = prs_mem_get(ps, sizeof(uint16));	if (q == NULL)		return False;	if (UNMARSHALLING(ps)) {		if (ps->bigendian_data)			*data16 = RSVAL(q,0);		else			*data16 = SVAL(q,0);	} else {		if (ps->bigendian_data)			RSSVAL(q,0,*data16);		else			SSVAL(q,0,*data16);	}	DEBUG(5,("%s%04x %s: %04x\n", tab_depth(depth), ps->data_offset, name, *data16));	ps->data_offset += sizeof(uint16);	return True;}/******************************************************************* Stream a uint32. ********************************************************************/BOOL prs_uint32(const char *name, prs_struct *ps, int depth, uint32 *data32){	char *q = prs_mem_get(ps, sizeof(uint32));	if (q == NULL)		return False;	if (UNMARSHALLING(ps)) {		if (ps->bigendian_data)			*data32 = RIVAL(q,0);		else			*data32 = IVAL(q,0);	} else {		if (ps->bigendian_data)			RSIVAL(q,0,*data32);		else			SIVAL(q,0,*data32);	}	DEBUG(5,("%s%04x %s: %08x\n", tab_depth(depth), ps->data_offset, name, *data32));	ps->data_offset += sizeof(uint32);	return True;}/******************************************************************* Stream an int32. ********************************************************************/BOOL prs_int32(const char *name, prs_struct *ps, int depth, int32 *data32){	char *q = prs_mem_get(ps, sizeof(int32));	if (q == NULL)		return False;	if (UNMARSHALLING(ps)) {		if (ps->bigendian_data)			*data32 = RIVALS(q,0);		else			*data32 = IVALS(q,0);	} else {		if (ps->bigendian_data)			RSIVALS(q,0,*data32);		else			SIVALS(q,0,*data32);	}	DEBUG(5,("%s%04x %s: %08x\n", tab_depth(depth), ps->data_offset, name, *data32));	ps->data_offset += sizeof(int32);	return True;}/******************************************************************* Stream a NTSTATUS ********************************************************************/BOOL prs_ntstatus(const char *name, prs_struct *ps, int depth, NTSTATUS *status){	char *q = prs_mem_get(ps, sizeof(uint32));	if (q == NULL)		return False;	if (UNMARSHALLING(ps)) {		if (ps->bigendian_data)			*status = NT_STATUS(RIVAL(q,0));		else			*status = NT_STATUS(IVAL(q,0));	} else {		if (ps->bigendian_data)			RSIVAL(q,0,NT_STATUS_V(*status));		else			SIVAL(q,0,NT_STATUS_V(*status));	}	DEBUG(5,("%s%04x %s: %s\n", tab_depth(depth), ps->data_offset, name, 		 nt_errstr(*status)));	ps->data_offset += sizeof(uint32);	return True;}/******************************************************************* Stream a WERROR ********************************************************************/BOOL prs_werror(const char *name, prs_struct *ps, int depth, WERROR *status){	char *q = prs_mem_get(ps, sizeof(uint32));	if (q == NULL)		return False;	if (UNMARSHALLING(ps)) {		if (ps->bigendian_data)			*status = W_ERROR(RIVAL(q,0));		else			*status = W_ERROR(IVAL(q,0));	} else {		if (ps->bigendian_data)			RSIVAL(q,0,W_ERROR_V(*status));		else			SIVAL(q,0,W_ERROR_V(*status));	}	DEBUG(5,("%s%04x %s: %s\n", tab_depth(depth), ps->data_offset, name, 		 dos_errstr(*status)));	ps->data_offset += sizeof(uint32);	return True;}/****************************************************************** Stream an array of uint8s. Length is number of uint8s. ********************************************************************/BOOL prs_uint8s(BOOL charmode, const char *name, prs_struct *ps, int depth, uint8 *data8s, int len){	int i;	char *q = prs_mem_get(ps, len);	if (q == NULL)		return False;	if (UNMARSHALLING(ps)) {		for (i = 0; i < len; i++)			data8s[i] = CVAL(q,i);	} else {		for (i = 0; i < len; i++)			SCVAL(q, i, data8s[i]);	}	DEBUG(5,("%s%04x %s: ", tab_depth(depth), ps->data_offset ,name));	if (charmode)		print_asc(5, (unsigned char*)data8s, len);	else {		for (i = 0; i < len; i++)			DEBUG(5,("%02x ", data8s[i]));	}	DEBUG(5,("\n"));	ps->data_offset += len;	return True;}/****************************************************************** Stream an array of uint16s. Length is number of uint16s. ********************************************************************/BOOL prs_uint16s(BOOL charmode, const char *name, prs_struct *ps, int depth, uint16 *data16s, int len){	int i;	char *q = prs_mem_get(ps, len * sizeof(uint16));	if (q == NULL)		return False;	if (UNMARSHALLING(ps)) {		if (ps->bigendian_data) {			for (i = 0; i < len; i++)				data16s[i] = RSVAL(q, 2*i);		} else {			for (i = 0; i < len; i++)				data16s[i] = SVAL(q, 2*i);		}	} else {		if (ps->bigendian_data) {			for (i = 0; i < len; i++)				RSSVAL(q, 2*i, data16s[i]);		} else {			for (i = 0; i < len; i++)				SSVAL(q, 2*i, data16s[i]);		}	}	DEBUG(5,("%s%04x %s: ", tab_depth(depth), ps->data_offset, name));	if (charmode)		print_asc(5, (unsigned char*)data16s, 2*len);	else {		for (i = 0; i < len; i++)			DEBUG(5,("%04x ", data16s[i]));	}

⌨️ 快捷键说明

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