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:
@ -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 */
|
||||
|
@ -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++;
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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];
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user