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 + -
显示快捷键?