parse_spoolss.c

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

C
2,230
字号
		if( !prs_uint32("secdesc size ", ps, depth, &data->notify_data.sd.size ) )			return False;		if ( !sec_io_desc( "sec_desc", &data->notify_data.sd.desc, ps, depth ) )			return False;		break;	default:		DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",			  data->enc_type));		break;	}#if 0	if (isvalue==False) {		/* length of string in unicode include \0 */		x=data->notify_data.data.length+1;		if (data->field != 16)		if(!prs_uint32("string length", ps, depth, &x ))			return False;		if (MARSHALLING(ps)) {			/* These are already in little endian format. Don't byte swap. */			if (x == 1) {				/* No memory allocated for this string				   therefore following the data.string				   pointer is a bad idea.  Use a pointer to				   the uint32 length union member to				   provide a source for a unicode NULL */				if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2)) 					return False;			} else {				if (data->field == 16)					x /= 2;				if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))					return False;			}		} else {			/* Tallocate memory for string */			data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16, x * 2);			if (!data->notify_data.data.string) 				return False;			if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))				return False;		}	}#endif#if 0	/* JERRY */	/* Win2k does not seem to put this parse align here */	if(!prs_align(ps))		return False;#endif	return True;}/*******************************************************************reads or writes an NOTIFY INFO structure.********************************************************************/  static BOOL smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth){	int i;	prs_debug(ps, depth, desc, "smb_io_notify_info");	depth++; 	if(!prs_align(ps))		return False;	if(!prs_uint32("count", ps, depth, &info->count))		return False;	if(!prs_uint32("version", ps, depth, &info->version))		return False;	if(!prs_uint32("flags", ps, depth, &info->flags))		return False;	if(!prs_uint32("count", ps, depth, &info->count))		return False;	for (i=0;i<info->count;i++) {		if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))			return False;	}	/* now do the strings at the end of the stream */		for (i=0;i<info->count;i++) {		if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))			return False;	}	return True;}/***************************************************************************************************************************************/  BOOL spool_io_user_level_1( const char *desc, prs_struct *ps, int depth, SPOOL_USER_1 *q_u ){	prs_debug(ps, depth, desc, "");	depth++;	if (!prs_align(ps))		return False;	if (!prs_uint32("size", ps, depth, &q_u->size))		return False;	if (!prs_io_unistr2_p("", ps, depth, &q_u->client_name))		return False;	if (!prs_io_unistr2_p("", ps, depth, &q_u->user_name))		return False;	if (!prs_uint32("build", ps, depth, &q_u->build))		return False;	if (!prs_uint32("major", ps, depth, &q_u->major))		return False;	if (!prs_uint32("minor", ps, depth, &q_u->minor))		return False;	if (!prs_uint32("processor", ps, depth, &q_u->processor))		return False;	if (!prs_io_unistr2("", ps, depth, q_u->client_name))		return False;	if (!prs_align(ps))		return False;	if (!prs_io_unistr2("", ps, depth, q_u->user_name))		return False;	return True;}/***************************************************************************************************************************************/  static BOOL spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth){	if (q_u==NULL)		return False;	prs_debug(ps, depth, desc, "spool_io_user_level");	depth++;	if (!prs_align(ps))		return False;	if (!prs_uint32("level", ps, depth, &q_u->level))		return False;		switch ( q_u->level ) 	{			case 1:			if ( !prs_pointer( "" , ps, depth, (void**)&q_u->user.user1, 				sizeof(SPOOL_USER_1), (PRS_POINTER_CAST)spool_io_user_level_1 )) 			{				return False;			}			break;		default:			return False;		}		return True;}/******************************************************************* * read or write a DEVICEMODE struct. * on reading allocate memory for the private member ********************************************************************/#define DM_NUM_OPTIONAL_FIELDS 		8BOOL spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode){	int available_space;		/* size of the device mode left to parse */					/* only important on unmarshalling       */	int i = 0;	uint16 *unistr_buffer;	int j;						struct optional_fields {		fstring		name;		uint32*		field;	} opt_fields[DM_NUM_OPTIONAL_FIELDS] = {		{ "icmmethod",		NULL },		{ "icmintent",		NULL },		{ "mediatype",		NULL },		{ "dithertype",		NULL },		{ "reserved1",		NULL },		{ "reserved2",		NULL },		{ "panningwidth",	NULL },		{ "panningheight",	NULL }	};	/* assign at run time to keep non-gcc compilers happy */	opt_fields[0].field = &devmode->icmmethod;	opt_fields[1].field = &devmode->icmintent;	opt_fields[2].field = &devmode->mediatype;	opt_fields[3].field = &devmode->dithertype;	opt_fields[4].field = &devmode->reserved1;	opt_fields[5].field = &devmode->reserved2;	opt_fields[6].field = &devmode->panningwidth;	opt_fields[7].field = &devmode->panningheight;				prs_debug(ps, depth, desc, "spoolss_io_devmode");	depth++;	if (UNMARSHALLING(ps)) {		devmode->devicename.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);		if (devmode->devicename.buffer == NULL)			return False;		unistr_buffer = devmode->devicename.buffer;	}	else {		/* devicename is a static sized string but the buffer we set is not */		unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);		memset( unistr_buffer, 0x0, MAXDEVICENAME );		for ( j=0; devmode->devicename.buffer[j]; j++ )			unistr_buffer[j] = devmode->devicename.buffer[j];	}			if (!prs_uint16uni(True,"devicename", ps, depth, unistr_buffer, MAXDEVICENAME))		return False;		if (!prs_uint16("specversion",      ps, depth, &devmode->specversion))		return False;			if (!prs_uint16("driverversion",    ps, depth, &devmode->driverversion))		return False;	if (!prs_uint16("size",             ps, depth, &devmode->size))		return False;	if (!prs_uint16("driverextra",      ps, depth, &devmode->driverextra))		return False;	if (!prs_uint32("fields",           ps, depth, &devmode->fields))		return False;	if (!prs_uint16("orientation",      ps, depth, &devmode->orientation))		return False;	if (!prs_uint16("papersize",        ps, depth, &devmode->papersize))		return False;	if (!prs_uint16("paperlength",      ps, depth, &devmode->paperlength))		return False;	if (!prs_uint16("paperwidth",       ps, depth, &devmode->paperwidth))		return False;	if (!prs_uint16("scale",            ps, depth, &devmode->scale))		return False;	if (!prs_uint16("copies",           ps, depth, &devmode->copies))		return False;	if (!prs_uint16("defaultsource",    ps, depth, &devmode->defaultsource))		return False;	if (!prs_uint16("printquality",     ps, depth, &devmode->printquality))		return False;	if (!prs_uint16("color",            ps, depth, &devmode->color))		return False;	if (!prs_uint16("duplex",           ps, depth, &devmode->duplex))		return False;	if (!prs_uint16("yresolution",      ps, depth, &devmode->yresolution))		return False;	if (!prs_uint16("ttoption",         ps, depth, &devmode->ttoption))		return False;	if (!prs_uint16("collate",          ps, depth, &devmode->collate))		return False;	if (UNMARSHALLING(ps)) {		devmode->formname.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);		if (devmode->formname.buffer == NULL)			return False;		unistr_buffer = devmode->formname.buffer;	}	else {		/* devicename is a static sized string but the buffer we set is not */		unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);		memset( unistr_buffer, 0x0, MAXDEVICENAME );		for ( j=0; devmode->formname.buffer[j]; j++ )			unistr_buffer[j] = devmode->formname.buffer[j];	}		if (!prs_uint16uni(True, "formname",  ps, depth, unistr_buffer, MAXDEVICENAME))		return False;	if (!prs_uint16("logpixels",        ps, depth, &devmode->logpixels))		return False;	if (!prs_uint32("bitsperpel",       ps, depth, &devmode->bitsperpel))		return False;	if (!prs_uint32("pelswidth",        ps, depth, &devmode->pelswidth))		return False;	if (!prs_uint32("pelsheight",       ps, depth, &devmode->pelsheight))		return False;	if (!prs_uint32("displayflags",     ps, depth, &devmode->displayflags))		return False;	if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))		return False;	/* 	 * every device mode I've ever seen on the wire at least has up 	 * to the displayfrequency field.   --jerry (05-09-2002)	 */	 	/* add uint32's + uint16's + two UNICODE strings */	 	available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);		/* Sanity check - we only have uint32's left tp parse */		if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {		DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",			available_space, devmode->size));		DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));		return False;	}	/* 	 * Conditional parsing.  Assume that the DeviceMode has been 	 * zero'd by the caller. 	 */		while ((available_space > 0)  && (i < DM_NUM_OPTIONAL_FIELDS))	{		DEBUG(11, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));		if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))			return False;		available_space -= sizeof(uint32);		i++;	}	 		/* Sanity Check - we should no available space at this point unless 	   MS changes the device mode structure */			if (available_space) {		DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));		DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",			available_space, devmode->size));		DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));		return False;	}	if (devmode->driverextra!=0) {		if (UNMARSHALLING(ps)) {			devmode->dev_private=PRS_ALLOC_MEM(ps, uint8, devmode->driverextra);			if(devmode->dev_private == NULL)				return False;			DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for dev_private\n",devmode->driverextra)); 		}					DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of dev_private\n",devmode->driverextra));		if (!prs_uint8s(False, "dev_private",  ps, depth,				devmode->dev_private, devmode->driverextra))			return False;	}	return True;}/******************************************************************* Read or write a DEVICEMODE container********************************************************************/  static BOOL spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth){	if (dm_c==NULL)		return False;	prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");	depth++;	if(!prs_align(ps))		return False;		if (!prs_uint32("size", ps, depth, &dm_c->size))		return False;	if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))		return False;	if (dm_c->size==0 || dm_c->devmode_ptr==0) {		if (UNMARSHALLING(ps))			/* if while reading there is no DEVMODE ... */			dm_c->devmode=NULL;		return True;	}		/* so we have a DEVICEMODE to follow */			if (UNMARSHALLING(ps)) {		DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));		dm_c->devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1);		if(dm_c->devmode == NULL)			return False;	}		/* this is bad code, shouldn't be there */	if (!prs_uint32("size", ps, depth, &dm_c->size))		return False;			if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))		return False;	return True;}/***************************************************************************************************************************************/  static BOOL spoolss_io_printer_default(const char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth){	if (pd==NULL)		return False;	prs_debug(ps, depth, desc, "spoolss_io_printer_default");	depth++;	if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))		return False;	if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))		return False;		if (!prs_align(ps))		return False;	if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))		return False;	if (!prs_align(ps))		return False;	if (!prs_uint32("access_required", ps, depth, &pd->access_required))		return False;	return True;}/******************************************************************* * init a structure. ********************************************************************/BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,

⌨️ 快捷键说明

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