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