1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-02 00:22:11 +03:00

done! printer_info_2, devicemode, sec_desc, & printer data all enumerate

and display correctly in regedit.exe.

Not sure about REG_SZ values in PrinterDriverData.  If we store these
in UNICODE, I'll have to fix up a few things.

REG_BINARY & REG_DWORD are fine.
This commit is contained in:
Gerald Carter
-
parent d76e0838cf
commit 2a30c243ec
5 changed files with 196 additions and 39 deletions

View File

@ -1,9 +1,10 @@
/*
Unix SMB/CIFS implementation.
SMB parameters and setup
Copyright (C) Andrew Tridgell 1992-1997
Copyright (C) Luke Kenneth Casson Leighton 1996-1997
Copyright (C) Paul Ashton 1997
Copyright (C) Andrew Tridgell 1992-1997.
Copyright (C) Luke Kenneth Casson Leighton 1996-1997.
Copyright (C) Paul Ashton 1997.
Copyright (C) Gerald Carter 2002.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -94,16 +95,7 @@ typedef struct {
fstring valuename;
uint16 type;
uint32 size; /* in bytes */
void *data_p;
#if 0
union {
char *string;
uint32 *dword;
uint8 *binary;
void *void_ptr; /* for casting only */
} data;
#endif
uint8 *data_p;
} REGISTRY_VALUE;
/* container for regostry values */

View File

@ -202,7 +202,19 @@ REGISTRY_VALUE* regval_ctr_specific_value( REGVAL_CTR *ctr, uint32 idx )
}
/***********************************************************************
Ad a new regostry value to the array
Retrive the TALLOC_CTX associated with a REGISTRY_VALUE
**********************************************************************/
TALLOC_CTX* regval_ctr_getctx( REGVAL_CTR *val )
{
if ( !val )
return NULL;
return val->ctx;
}
/***********************************************************************
Add a new regostry value to the array
**********************************************************************/
int regval_ctr_addvalue( REGVAL_CTR *ctr, char *name, uint16 type,
@ -235,25 +247,6 @@ int regval_ctr_addvalue( REGVAL_CTR *ctr, char *name, uint16 type,
ctr->values[ctr->num_values]->type = type;
ctr->values[ctr->num_values]->data_p = talloc_memdup( ctr->ctx, data_p, size );
ctr->values[ctr->num_values]->size = size;
#if 0
switch ( type )
{
case REG_SZ:
ctr->values[ctr->num_values]->data.string = talloc_strdup( ctr->ctx, data_p );
break;
case REG_MULTI_SZ:
ctr->values[ctr->num_values]->data.string = talloc_memdup( ctr->ctx, data_p, size );
break;
case REG_DWORD:
ctr->values[ctr->num_values]->data.dword = *(uint32*)data_p;
break;
case REG_BINARY:
ctr->values[ctr->num_values]->data.binary = talloc_memdup( ctr->ctx, data_p, size );
break;
}
#endif
ctr->num_values++;
}

View File

@ -453,6 +453,11 @@ static int print_subpath_printers( char *key, REGSUBKEY_CTR *subkeys )
int n_services = lp_numservices();
int snum;
fstring sname;
int num_subkeys = 0;
char *keystr, *key2 = NULL;
char *base, *new_path;
NT_PRINTER_INFO_LEVEL *printer = NULL;
DEBUG(10,("print_subpath_printers: key=>[%s]\n", key ? key : "NULL" ));
@ -468,13 +473,178 @@ static int print_subpath_printers( char *key, REGSUBKEY_CTR *subkeys )
regsubkey_ctr_addkey( subkeys, sname );
}
num_subkeys = regsubkey_ctr_numkeys( subkeys );
goto done;
}
else
{
/* get information for a specific printer */
/* get information for a specific printer */
key2 = strdup( key );
keystr = key2;
reg_split_path( keystr, &base, &new_path );
if ( !new_path ) {
/* sanity check on the printer name */
if ( !W_ERROR_IS_OK( get_a_printer(&printer, 2, base) ) )
goto done;
free_a_printer( &printer, 2 );
regsubkey_ctr_addkey( subkeys, "PrinterDriverData" );
}
return regsubkey_ctr_numkeys( subkeys );
/* no other subkeys below here */
done:
SAFE_FREE( key2 );
return num_subkeys;
}
/**********************************************************************
handle enumeration of values below KEY_PRINTING\Printers
*********************************************************************/
static int print_subpath_values_printers( char *key, REGVAL_CTR *val )
{
int num_values = 0;
char *keystr, *key2 = NULL;
char *base, *new_path;
NT_PRINTER_INFO_LEVEL *printer = NULL;
NT_PRINTER_INFO_LEVEL_2 *info2;
DEVICEMODE *devmode;
prs_struct prs;
uint32 offset;
int snum;
int i;
fstring valuename;
uint8 *data;
uint32 type, data_len;
fstring printername;
/*
* There are tw cases to deal with here
* (1) enumeration of printer_info_2 values
* (2) enumeration of the PrinterDriverData subney
*/
if ( !key ) {
/* top level key has no values */
goto done;
}
key2 = strdup( key );
keystr = key2;
reg_split_path( keystr, &base, &new_path );
fstrcpy( printername, base );
if ( !new_path )
{
/* we are dealing with the printer itself */
if ( !W_ERROR_IS_OK( get_a_printer(&printer, 2, printername) ) )
goto done;
info2 = printer->info_2;
regval_ctr_addvalue( val, "Attributes", REG_DWORD, (char*)&info2->attributes, sizeof(info2->attributes) );
regval_ctr_addvalue( val, "Priority", REG_DWORD, (char*)&info2->priority, sizeof(info2->attributes) );
regval_ctr_addvalue( val, "ChangeID", REG_DWORD, (char*)&info2->changeid, sizeof(info2->changeid) );
regval_ctr_addvalue( val, "Default Priority", REG_DWORD, (char*)&info2->default_priority, sizeof(info2->default_priority) );
regval_ctr_addvalue( val, "Status", REG_DWORD, (char*)&info2->status, sizeof(info2->status) );
regval_ctr_addvalue( val, "StartTime", REG_DWORD, (char*)&info2->starttime, sizeof(info2->starttime) );
regval_ctr_addvalue( val, "UntilTime", REG_DWORD, (char*)&info2->untiltime, sizeof(info2->untiltime) );
regval_ctr_addvalue( val, "cjobs", REG_DWORD, (char*)&info2->cjobs, sizeof(info2->cjobs) );
regval_ctr_addvalue( val, "AveragePPM", REG_DWORD, (char*)&info2->averageppm, sizeof(info2->averageppm) );
regval_ctr_addvalue( val, "Name", REG_SZ, info2->printername, sizeof(info2->printername)+1 );
regval_ctr_addvalue( val, "Location", REG_SZ, info2->location, sizeof(info2->location)+1 );
regval_ctr_addvalue( val, "Comment", REG_SZ, info2->comment, sizeof(info2->comment)+1 );
regval_ctr_addvalue( val, "Parameters", REG_SZ, info2->parameters, sizeof(info2->parameters)+1 );
regval_ctr_addvalue( val, "Port", REG_SZ, info2->portname, sizeof(info2->portname)+1 );
regval_ctr_addvalue( val, "Server", REG_SZ, info2->servername, sizeof(info2->servername)+1 );
regval_ctr_addvalue( val, "Share", REG_SZ, info2->sharename, sizeof(info2->sharename)+1 );
regval_ctr_addvalue( val, "Driver", REG_SZ, info2->drivername, sizeof(info2->drivername)+1 );
regval_ctr_addvalue( val, "Separator File", REG_SZ, info2->sepfile, sizeof(info2->sepfile)+1 );
regval_ctr_addvalue( val, "Print Processor", REG_SZ, info2->printprocessor, sizeof(info2->printprocessor)+1 );
/* use a prs_struct for converting the devmode and security
descriptor to REG_BIARY */
prs_init( &prs, MAX_PDU_FRAG_LEN, regval_ctr_getctx(val), MARSHALL);
/* stream the device mode */
snum = lp_servicenumber(info2->sharename);
if ( (devmode = construct_dev_mode( snum )) != NULL )
{
if ( spoolss_io_devmode( "devmode", &prs, 0, devmode ) ) {
offset = prs_offset( &prs );
regval_ctr_addvalue( val, "Default Devmode", REG_BINARY, prs_data_p(&prs), offset );
}
}
prs_mem_clear( &prs );
prs_set_offset( &prs, 0 );
if ( info2->secdesc_buf && info2->secdesc_buf->len )
{
if ( sec_io_desc("sec_desc", &info2->secdesc_buf->sec, &prs, 0 ) ) {
offset = prs_offset( &prs );
regval_ctr_addvalue( val, "Security", REG_BINARY, prs_data_p(&prs), offset );
}
}
prs_mem_free( &prs );
free_a_printer( &printer, 2 );
num_values = regval_ctr_numvals( val );
goto done;
}
keystr = new_path;
reg_split_path( keystr, &base, &new_path );
/* here should be no more path components here */
if ( new_path || strcmp(base, "PrinterDriverData") )
goto done;
/* now enumerate the PrinterDriverData key */
if ( !W_ERROR_IS_OK( get_a_printer(&printer, 2, printername) ) )
goto done;
info2 = printer->info_2;
/* iterate over all printer data and fill the regval container */
for ( i=0; get_specific_param_by_index(*printer, 2, i, valuename, &data, &type, &data_len); i++ )
{
regval_ctr_addvalue( val, valuename, type, data, data_len );
}
free_a_printer( &printer, 2 );
num_values = regval_ctr_numvals( val );
done:
SAFE_FREE( key2 );
return num_values;
}
/**********************************************************************
@ -529,6 +699,8 @@ static int handle_printing_subpath( char *key, REGSUBKEY_CTR *subkeys, REGVAL_CT
case KEY_INDEX_PRINTER:
if ( subkeys )
print_subpath_printers( p, subkeys );
if ( val )
print_subpath_values_printers( p, val );
break;
/* default case for top level key that has no handler */

View File

@ -3374,7 +3374,7 @@ static void free_dev_mode(DEVICEMODE *dev)
Create a DEVMODE struct. Returns malloced memory.
****************************************************************************/
static DEVICEMODE *construct_dev_mode(int snum)
DEVICEMODE *construct_dev_mode(int snum)
{
char adevice[32];
char aform[32];

View File

@ -142,7 +142,7 @@ END {
gotstart = 1;
}
if( $0 ~ /^SAM_ACCT_INFO_NODE|^SMB_ACL_T|^ADS_MODLIST|^PyObject|^SORTED_TREE|^REGISTRY_HOOK|^REGISTRY_VALUE/ ) {
if( $0 ~ /^SAM_ACCT_INFO_NODE|^SMB_ACL_T|^ADS_MODLIST|^PyObject|^SORTED_TREE|^REGISTRY_HOOK|^REGISTRY_VALUE|^DEVICEMODE/ ) {
gotstart = 1;
}