関数 | |
void | rpcbuf_init (RPC_BUFFER *buffer, uint32 size, TALLOC_CTX *ctx) |
BOOL | prs_rpcbuffer (const char *desc, prs_struct *ps, int depth, RPC_BUFFER *buffer) |
BOOL | prs_rpcbuffer_p (const char *desc, prs_struct *ps, int depth, RPC_BUFFER **buffer) |
BOOL | rpcbuf_alloc_size (RPC_BUFFER *buffer, uint32 buffer_size) |
void | rpcbuf_move (RPC_BUFFER *src, RPC_BUFFER **dest) |
uint32 | rpcbuf_get_size (RPC_BUFFER *buffer) |
BOOL | smb_io_relstr (const char *desc, RPC_BUFFER *buffer, int depth, UNISTR *string) |
BOOL | smb_io_relarraystr (const char *desc, RPC_BUFFER *buffer, int depth, uint16 **string) |
BOOL | smb_io_relsecdesc (const char *desc, RPC_BUFFER *buffer, int depth, SEC_DESC **secdesc) |
uint32 | size_of_relative_string (UNISTR *string) |
void rpcbuf_init | ( | RPC_BUFFER * | buffer, | |
uint32 | size, | |||
TALLOC_CTX * | ctx | |||
) |
parse_buffer.c の 34 行で定義されています。
参照先 RPC_BUFFER::prs・prs_init()・RPC_BUFFER::size・RPC_BUFFER::string_at_end・RPC_BUFFER::struct_start.
参照元 _spoolss_xcvdataport()・_svcctl_enum_dependent_services()・_svcctl_query_service_config2()・_svcctl_query_service_sec()・_svcctl_query_service_status_ex()・rpccli_spoolss_enum_ports()・rpccli_spoolss_enum_printers()・rpccli_spoolss_enumforms()・rpccli_spoolss_enumjobs()・rpccli_spoolss_enumprinterdrivers()・rpccli_spoolss_getform()・rpccli_spoolss_getjob()・rpccli_spoolss_getprinter()・rpccli_spoolss_getprinterdriver()・rpccli_spoolss_getprinterdriverdir()・rpccli_spoolss_getprintprocessordirectory().
00035 { 00036 buffer->size = size; 00037 buffer->string_at_end = size; 00038 prs_init(&buffer->prs, size, ctx, MARSHALL); 00039 buffer->struct_start = prs_offset(&buffer->prs); 00040 }
BOOL prs_rpcbuffer | ( | const char * | desc, | |
prs_struct * | ps, | |||
int | depth, | |||
RPC_BUFFER * | buffer | |||
) |
parse_buffer.c の 46 行で定義されています。
参照先 RPC_BUFFER::prs・prs_debug()・prs_init()・prs_mem_free()・RPC_BUFFER::size・RPC_BUFFER::string_at_end.
参照元 prs_rpcbuffer_p()・spoolss_io_q_xcvdataport()・spoolss_io_r_xcvdataport()・svcctl_io_q_set_service_sec()・svcctl_io_r_enum_dependent_services()・svcctl_io_r_enum_services_status()・svcctl_io_r_query_service_config2()・svcctl_io_r_query_service_sec()・svcctl_io_r_query_service_status_ex().
00047 { 00048 prs_debug(ps, depth, desc, "prs_rpcbuffer"); 00049 depth++; 00050 00051 /* reading */ 00052 if (UNMARSHALLING(ps)) { 00053 buffer->size=0; 00054 buffer->string_at_end=0; 00055 00056 if (!prs_uint32("size", ps, depth, &buffer->size)) 00057 return False; 00058 00059 /* 00060 * JRA. I'm not sure if the data in here is in big-endian format if 00061 * the client is big-endian. Leave as default (little endian) for now. 00062 */ 00063 00064 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL)) 00065 return False; 00066 00067 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size)) 00068 return False; 00069 00070 if (!prs_set_offset(&buffer->prs, 0)) 00071 return False; 00072 00073 if (!prs_set_offset(ps, buffer->size+prs_offset(ps))) 00074 return False; 00075 00076 buffer->string_at_end=buffer->size; 00077 00078 return True; 00079 } 00080 else { 00081 BOOL ret = False; 00082 00083 if (!prs_uint32("size", ps, depth, &buffer->size)) 00084 goto out; 00085 00086 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size)) 00087 goto out; 00088 00089 ret = True; 00090 out: 00091 00092 /* We have finished with the data in buffer->prs - free it. */ 00093 prs_mem_free(&buffer->prs); 00094 00095 return ret; 00096 } 00097 }
BOOL prs_rpcbuffer_p | ( | const char * | desc, | |
prs_struct * | ps, | |||
int | depth, | |||
RPC_BUFFER ** | buffer | |||
) |
parse_buffer.c の 103 行で定義されています。
参照先 prs_rpcbuffer().
参照元 spoolss_io_q_addjob()・spoolss_io_q_enumforms()・spoolss_io_q_enumjobs()・spoolss_io_q_enumports()・spoolss_io_q_enumprinterdrivers()・spoolss_io_q_enumprinters()・spoolss_io_q_enumprintmonitors()・spoolss_io_q_enumprintprocdatatypes()・spoolss_io_q_enumprintprocessors()・spoolss_io_q_getform()・spoolss_io_q_getjob()・spoolss_io_q_getprinter()・spoolss_io_q_getprinterdriver2()・spoolss_io_q_getprinterdriverdir()・spoolss_io_q_getprintprocessordirectory()・spoolss_io_r_addjob()・spoolss_io_r_enumforms()・spoolss_io_r_enumjobs()・spoolss_io_r_enumports()・spoolss_io_r_enumprinterdrivers()・spoolss_io_r_enumprinters()・spoolss_io_r_enumprintmonitors()・spoolss_io_r_enumprintprocdatatypes()・spoolss_io_r_enumprintprocessors()・spoolss_io_r_getform()・spoolss_io_r_getjob()・spoolss_io_r_getprinter()・spoolss_io_r_getprinterdriver2()・spoolss_io_r_getprinterdriverdir()・spoolss_io_r_getprintprocessordirectory().
00104 { 00105 uint32 data_p; 00106 00107 /* caputure the pointer value to stream */ 00108 00109 data_p = *buffer ? 0xf000baaa : 0; 00110 00111 if ( !prs_uint32("ptr", ps, depth, &data_p )) 00112 return False; 00113 00114 /* we're done if there is no data */ 00115 00116 if ( !data_p ) 00117 return True; 00118 00119 if ( UNMARSHALLING(ps) ) { 00120 if ( !(*buffer = PRS_ALLOC_MEM(ps, RPC_BUFFER, 1)) ) 00121 return False; 00122 } else { 00123 /* Marshalling case. - coverity paranoia - should already be ok if data_p != 0 */ 00124 if (!*buffer) { 00125 return True; 00126 } 00127 } 00128 00129 return prs_rpcbuffer( desc, ps, depth, *buffer); 00130 }
BOOL rpcbuf_alloc_size | ( | RPC_BUFFER * | buffer, | |
uint32 | buffer_size | |||
) |
parse_buffer.c の 136 行で定義されています。
参照先 RPC_BUFFER::prs・RPC_BUFFER::string_at_end.
参照元 _spoolss_enumforms()・_spoolss_getform()・enum_all_printers_info_1()・enum_all_printers_info_1_remote()・enum_all_printers_info_2()・enumjobs_level1()・enumjobs_level2()・enumports_level_1()・enumports_level_2()・enumprinterdrivers_level1()・enumprinterdrivers_level2()・enumprinterdrivers_level3()・enumprintmonitors_level_1()・enumprintmonitors_level_2()・enumprintprocdatatypes_level_1()・enumprintprocessors_level_1()・getjob_level_1()・getjob_level_2()・getprinter_level_0()・getprinter_level_1()・getprinter_level_2()・getprinter_level_3()・getprinter_level_4()・getprinter_level_5()・getprinter_level_7()・getprinterdriver2_level1()・getprinterdriver2_level2()・getprinterdriver2_level3()・getprinterdriver2_level6()・getprinterdriverdir_level_1()・getprintprocessordirectory_level_1().
00137 { 00138 prs_struct *ps; 00139 uint32 extra_space; 00140 uint32 old_offset; 00141 00142 /* if we don't need anything. don't do anything */ 00143 00144 if ( buffer_size == 0x0 ) 00145 return True; 00146 00147 if (!buffer) { 00148 return False; 00149 } 00150 00151 ps= &buffer->prs; 00152 00153 /* damn, I'm doing the reverse operation of prs_grow() :) */ 00154 if (buffer_size < prs_data_size(ps)) 00155 extra_space=0; 00156 else 00157 extra_space = buffer_size - prs_data_size(ps); 00158 00159 /* 00160 * save the offset and move to the end of the buffer 00161 * prs_grow() checks the extra_space against the offset 00162 */ 00163 old_offset=prs_offset(ps); 00164 prs_set_offset(ps, prs_data_size(ps)); 00165 00166 if (!prs_grow(ps, extra_space)) 00167 return False; 00168 00169 prs_set_offset(ps, old_offset); 00170 00171 buffer->string_at_end=prs_data_size(ps); 00172 00173 return True; 00174 }
void rpcbuf_move | ( | RPC_BUFFER * | src, | |
RPC_BUFFER ** | dest | |||
) |
parse_buffer.c の 183 行で定義されています。
参照先 RPC_BUFFER::prs・prs_mem_clear().
参照元 _spoolss_addjob()・_spoolss_enumforms()・_spoolss_enumjobs()・_spoolss_enumports()・_spoolss_enumprinterdrivers()・_spoolss_enumprinters()・_spoolss_enumprintmonitors()・_spoolss_enumprintprocdatatypes()・_spoolss_enumprintprocessors()・_spoolss_getform()・_spoolss_getjob()・_spoolss_getprinter()・_spoolss_getprinterdriver2()・_spoolss_getprinterdriverdirectory()・_spoolss_getprintprocessordirectory().
00184 { 00185 if ( !src ) { 00186 *dest = NULL; 00187 return; 00188 } 00189 00190 prs_switch_type( &src->prs, MARSHALL ); 00191 00192 if ( !prs_set_offset(&src->prs, 0) ) 00193 return; 00194 00195 prs_force_dynamic( &src->prs ); 00196 prs_mem_clear( &src->prs ); 00197 00198 *dest = src; 00199 }
uint32 rpcbuf_get_size | ( | RPC_BUFFER * | buffer | ) |
parse_buffer.c の 205 行で定義されています。
参照先 RPC_BUFFER::size.
参照元 xcvlocal_monitorui()・xcvtcp_monitorui().
00206 { 00207 return (buffer->size); 00208 }
BOOL smb_io_relstr | ( | const char * | desc, | |
RPC_BUFFER * | buffer, | |||
int | depth, | |||
UNISTR * | string | |||
) |
parse_buffer.c の 231 行で定義されています。
参照先 RPC_BUFFER::prs・size_of_relative_string()・smb_io_unistr()・string・RPC_BUFFER::string_at_end・RPC_BUFFER::struct_start.
参照元 smb_io_form_1()・smb_io_job_info_1()・smb_io_job_info_2()・smb_io_port_1()・smb_io_port_2()・smb_io_port_info_1()・smb_io_port_info_2()・smb_io_printer_driver_info_1()・smb_io_printer_driver_info_2()・smb_io_printer_driver_info_3()・smb_io_printer_driver_info_6()・smb_io_printer_info_0()・smb_io_printer_info_1()・smb_io_printer_info_2()・smb_io_printer_info_4()・smb_io_printer_info_5()・smb_io_printer_info_7()・smb_io_printmonitor_info_1()・smb_io_printmonitor_info_2()・smb_io_printprocdatatype_info_1()・smb_io_printprocessor_info_1()・svcctl_io_enum_services_status().
00232 { 00233 prs_struct *ps=&buffer->prs; 00234 00235 if (MARSHALLING(ps)) { 00236 uint32 struct_offset = prs_offset(ps); 00237 uint32 relative_offset; 00238 00239 buffer->string_at_end -= (size_of_relative_string(string) - 4); 00240 if(!prs_set_offset(ps, buffer->string_at_end)) 00241 return False; 00242 #if 0 /* JERRY */ 00243 /* 00244 * Win2k does not align strings in a buffer 00245 * Tested against WinNT 4.0 SP 6a & 2k SP2 --jerry 00246 */ 00247 if (!prs_align(ps)) 00248 return False; 00249 #endif 00250 buffer->string_at_end = prs_offset(ps); 00251 00252 /* write the string */ 00253 if (!smb_io_unistr(desc, string, ps, depth)) 00254 return False; 00255 00256 if(!prs_set_offset(ps, struct_offset)) 00257 return False; 00258 00259 relative_offset=buffer->string_at_end - buffer->struct_start; 00260 /* write its offset */ 00261 if (!prs_uint32("offset", ps, depth, &relative_offset)) 00262 return False; 00263 } 00264 else { 00265 uint32 old_offset; 00266 00267 /* read the offset */ 00268 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end))) 00269 return False; 00270 00271 if (buffer->string_at_end == 0) 00272 return True; 00273 00274 old_offset = prs_offset(ps); 00275 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start)) 00276 return False; 00277 00278 /* read the string */ 00279 if (!smb_io_unistr(desc, string, ps, depth)) 00280 return False; 00281 00282 if(!prs_set_offset(ps, old_offset)) 00283 return False; 00284 } 00285 return True; 00286 }
BOOL smb_io_relarraystr | ( | const char * | desc, | |
RPC_BUFFER * | buffer, | |||
int | depth, | |||
uint16 ** | string | |||
) |
parse_buffer.c の 293 行で定義されています。
参照先 UNISTR::buffer・RPC_BUFFER::prs・smb_io_unistr()・str_len_uni()・RPC_BUFFER::string_at_end・RPC_BUFFER::struct_start.
参照元 smb_io_printer_driver_info_3()・smb_io_printer_driver_info_6().
00294 { 00295 UNISTR chaine; 00296 00297 prs_struct *ps=&buffer->prs; 00298 00299 if (MARSHALLING(ps)) { 00300 uint32 struct_offset = prs_offset(ps); 00301 uint32 relative_offset; 00302 uint16 *p; 00303 uint16 *q; 00304 uint16 zero=0; 00305 p=*string; 00306 q=*string; 00307 00308 /* first write the last 0 */ 00309 buffer->string_at_end -= 2; 00310 if(!prs_set_offset(ps, buffer->string_at_end)) 00311 return False; 00312 00313 if(!prs_uint16("leading zero", ps, depth, &zero)) 00314 return False; 00315 00316 while (p && (*p!=0)) { 00317 while (*q!=0) 00318 q++; 00319 00320 /* Yes this should be malloc not talloc. Don't change. */ 00321 00322 chaine.buffer = (uint16 *) 00323 SMB_MALLOC((q-p+1)*sizeof(uint16)); 00324 if (chaine.buffer == NULL) 00325 return False; 00326 00327 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16)); 00328 00329 buffer->string_at_end -= (q-p+1)*sizeof(uint16); 00330 00331 if(!prs_set_offset(ps, buffer->string_at_end)) { 00332 SAFE_FREE(chaine.buffer); 00333 return False; 00334 } 00335 00336 /* write the string */ 00337 if (!smb_io_unistr(desc, &chaine, ps, depth)) { 00338 SAFE_FREE(chaine.buffer); 00339 return False; 00340 } 00341 q++; 00342 p=q; 00343 00344 SAFE_FREE(chaine.buffer); 00345 } 00346 00347 if(!prs_set_offset(ps, struct_offset)) 00348 return False; 00349 00350 relative_offset=buffer->string_at_end - buffer->struct_start; 00351 /* write its offset */ 00352 if (!prs_uint32("offset", ps, depth, &relative_offset)) 00353 return False; 00354 00355 } else { 00356 00357 /* UNMARSHALLING */ 00358 00359 uint32 old_offset; 00360 uint16 *chaine2=NULL; 00361 int l_chaine=0; 00362 int l_chaine2=0; 00363 size_t realloc_size = 0; 00364 00365 *string=NULL; 00366 00367 /* read the offset */ 00368 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end)) 00369 return False; 00370 00371 old_offset = prs_offset(ps); 00372 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start)) 00373 return False; 00374 00375 do { 00376 if (!smb_io_unistr(desc, &chaine, ps, depth)) 00377 return False; 00378 00379 l_chaine=str_len_uni(&chaine); 00380 00381 /* we're going to add two more bytes here in case this 00382 is the last string in the array and we need to add 00383 an extra NULL for termination */ 00384 if (l_chaine > 0) { 00385 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16); 00386 00387 /* Yes this should be realloc - it's freed below. JRA */ 00388 00389 if((chaine2=(uint16 *)SMB_REALLOC(chaine2, realloc_size)) == NULL) { 00390 return False; 00391 } 00392 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16)); 00393 l_chaine2+=l_chaine+1; 00394 } 00395 00396 } while(l_chaine!=0); 00397 00398 /* the end should be bould NULL terminated so add 00399 the second one here */ 00400 if (chaine2) 00401 { 00402 chaine2[l_chaine2] = '\0'; 00403 *string=(uint16 *)TALLOC_MEMDUP(prs_get_mem_context(ps),chaine2,realloc_size); 00404 if (!*string) { 00405 return False; 00406 } 00407 SAFE_FREE(chaine2); 00408 } 00409 00410 if(!prs_set_offset(ps, old_offset)) 00411 return False; 00412 } 00413 return True; 00414 }
BOOL smb_io_relsecdesc | ( | const char * | desc, | |
RPC_BUFFER * | buffer, | |||
int | depth, | |||
SEC_DESC ** | secdesc | |||
) |
parse_buffer.c の 420 行で定義されています。
参照先 RPC_BUFFER::prs・prs_debug()・sec_desc_size()・sec_io_desc()・RPC_BUFFER::string_at_end・RPC_BUFFER::struct_start.
00421 { 00422 prs_struct *ps= &buffer->prs; 00423 00424 prs_debug(ps, depth, desc, "smb_io_relsecdesc"); 00425 depth++; 00426 00427 if (MARSHALLING(ps)) { 00428 uint32 struct_offset = prs_offset(ps); 00429 uint32 relative_offset; 00430 00431 if (! *secdesc) { 00432 relative_offset = 0; 00433 if (!prs_uint32("offset", ps, depth, &relative_offset)) 00434 return False; 00435 return True; 00436 } 00437 00438 if (*secdesc != NULL) { 00439 buffer->string_at_end -= sec_desc_size(*secdesc); 00440 00441 if(!prs_set_offset(ps, buffer->string_at_end)) 00442 return False; 00443 /* write the secdesc */ 00444 if (!sec_io_desc(desc, secdesc, ps, depth)) 00445 return False; 00446 00447 if(!prs_set_offset(ps, struct_offset)) 00448 return False; 00449 } 00450 00451 relative_offset=buffer->string_at_end - buffer->struct_start; 00452 /* write its offset */ 00453 00454 if (!prs_uint32("offset", ps, depth, &relative_offset)) 00455 return False; 00456 } else { 00457 uint32 old_offset; 00458 00459 /* read the offset */ 00460 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end)) 00461 return False; 00462 00463 old_offset = prs_offset(ps); 00464 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start)) 00465 return False; 00466 00467 /* read the sd */ 00468 if (!sec_io_desc(desc, secdesc, ps, depth)) 00469 return False; 00470 00471 if(!prs_set_offset(ps, old_offset)) 00472 return False; 00473 } 00474 return True; 00475 }
uint32 size_of_relative_string | ( | UNISTR * | string | ) |
parse_buffer.c の 485 行で定義されています。
参照先 size・str_len_uni()・string.
参照元 smb_io_relstr()・spoolss_size_form_1()・spoolss_size_job_info_1()・spoolss_size_job_info_2()・spoolss_size_port_info_1()・spoolss_size_port_info_2()・spoolss_size_printer_driver_info_1()・spoolss_size_printer_driver_info_2()・spoolss_size_printer_driver_info_3()・spoolss_size_printer_driver_info_6()・spoolss_size_printer_info_0()・spoolss_size_printer_info_1()・spoolss_size_printer_info_2()・spoolss_size_printer_info_4()・spoolss_size_printer_info_5()・spoolss_size_printer_info_7()・spoolss_size_printmonitor_info_1()・spoolss_size_printmonitor_info_2()・spoolss_size_printprocdatatype_info_1()・spoolss_size_printprocessor_info_1()・svcctl_sizeof_enum_services_status().
00486 { 00487 uint32 size=0; 00488 00489 size=str_len_uni(string); /* the string length */ 00490 size=size+1; /* add the trailing zero */ 00491 size=size*2; /* convert in char */ 00492 size=size+4; /* add the size of the ptr */ 00493 00494 #if 0 /* JERRY */ 00495 /* 00496 * Do not include alignment as Win2k does not align relative 00497 * strings within a buffer --jerry 00498 */ 00499 /* Ensure size is 4 byte multiple (prs_align is being called...). */ 00500 /* size += ((4 - (size & 3)) & 3); */ 00501 #endif 00502 00503 return size; 00504 }