2001-02-25 02:14:49 +00:00
/*
2002-01-30 06:08:46 +00:00
* Unix SMB / CIFS implementation .
2001-02-25 02:14:49 +00:00
* RPC Pipe client / server routines
2006-09-27 16:05:25 +00:00
*
* Copyright ( C ) Gerald Carter 2002 - 2006.
2001-02-25 02:14:49 +00:00
*
* 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
2007-07-09 19:25:36 +00:00
* the Free Software Foundation ; either version 3 of the License , or
2001-02-25 02:14:49 +00:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2007-07-10 05:23:25 +00:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2001-02-25 02:14:49 +00:00
*/
/* Implementation of registry functions. */
# include "includes.h"
2002-07-15 10:35:28 +00:00
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_RPC_SRV
2002-08-17 15:34:15 +00:00
/******************************************************************
2008-02-18 17:48:19 +01:00
Find a registry key handle and return a struct registry_key *
2002-08-17 15:34:15 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-15 10:35:28 +00:00
2006-12-01 20:01:09 +00:00
static struct registry_key * find_regkey_by_hnd ( pipes_struct * p ,
POLICY_HND * hnd )
2002-07-15 10:35:28 +00:00
{
2006-12-01 20:01:09 +00:00
struct registry_key * regkey = NULL ;
2002-07-15 10:35:28 +00:00
2005-12-03 06:46:46 +00:00
if ( ! find_policy_by_hnd ( p , hnd , ( void * * ) ( void * ) & regkey ) ) {
2002-08-17 15:34:15 +00:00
DEBUG ( 2 , ( " find_regkey_index_by_hnd: Registry Key not found: " ) ) ;
return NULL ;
2002-07-15 10:35:28 +00:00
}
2002-08-17 15:34:15 +00:00
return regkey ;
2002-07-15 10:35:28 +00:00
}
2002-08-17 15:34:15 +00:00
/*******************************************************************
Function for open a new registry handle and creating a handle
Note that P should be valid & hnd should already have space
2002-07-15 10:35:28 +00:00
2002-08-17 15:34:15 +00:00
When we open a key , we store the full path to the key as
HK [ LM | U ] \ < key > \ < key > \ . . .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 17:13:37 +00:00
static WERROR open_registry_key ( pipes_struct * p , POLICY_HND * hnd ,
2006-12-01 20:01:09 +00:00
struct registry_key * parent ,
2006-11-23 19:21:11 +00:00
const char * subkeyname ,
uint32 access_desired )
2002-07-15 10:35:28 +00:00
{
2006-12-01 20:01:09 +00:00
WERROR result = WERR_OK ;
struct registry_key * key ;
2003-01-19 05:04:03 +00:00
2006-12-01 20:01:09 +00:00
if ( parent = = NULL ) {
2009-01-07 18:44:52 +01:00
result = reg_openhive ( p - > mem_ctx , subkeyname , access_desired ,
2008-11-23 23:48:17 +01:00
p - > server_info - > ptok , & key ) ;
2006-12-01 20:01:09 +00:00
}
else {
2009-01-07 18:44:52 +01:00
result = reg_openkey ( p - > mem_ctx , parent , subkeyname ,
access_desired , & key ) ;
2006-11-23 19:21:11 +00:00
}
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-09-30 17:13:37 +00:00
return result ;
2006-11-23 19:21:11 +00:00
}
2005-09-30 17:13:37 +00:00
2009-01-07 18:44:52 +01:00
if ( ! create_policy_hnd ( p , hnd , key ) ) {
2006-11-23 19:21:11 +00:00
return WERR_BADFILE ;
}
2005-06-24 22:34:40 +00:00
2007-06-12 12:01:52 +00:00
return WERR_OK ;
2002-07-15 10:35:28 +00:00
}
/*******************************************************************
Function for open a new registry handle and creating a handle
Note that P should be valid & hnd should already have space
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-18 17:40:25 -07:00
static bool close_registry_key ( pipes_struct * p , POLICY_HND * hnd )
2002-07-15 10:35:28 +00:00
{
2006-12-01 20:01:09 +00:00
struct registry_key * regkey = find_regkey_by_hnd ( p , hnd ) ;
2002-07-15 10:35:28 +00:00
if ( ! regkey ) {
2006-12-01 20:01:09 +00:00
DEBUG ( 2 , ( " close_registry_key: Invalid handle (%s:%u:%u) \n " ,
OUR_HANDLE ( hnd ) ) ) ;
2002-07-15 10:35:28 +00:00
return False ;
}
close_policy_hnd ( p , hnd ) ;
return True ;
}
/********************************************************************
reg_close
2001-02-25 02:14:49 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_CloseKey ( pipes_struct * p , struct winreg_CloseKey * r )
2001-02-25 02:14:49 +00:00
{
/* close the policy handle */
2005-06-16 20:45:55 +00:00
2007-01-18 10:18:59 +00:00
if ( ! close_registry_key ( p , r - > in . handle ) )
2005-06-16 20:45:55 +00:00
return WERR_BADFID ;
2001-02-25 02:14:49 +00:00
2007-01-18 10:18:59 +00:00
ZERO_STRUCTP ( r - > out . handle ) ;
2006-12-03 16:18:31 +00:00
2005-01-10 20:33:41 +00:00
return WERR_OK ;
2001-02-25 02:14:49 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKLM ( pipes_struct * p , struct winreg_OpenHKLM * r )
2002-07-15 10:35:28 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKLM , r - > in . access_mask ) ;
2005-09-30 17:13:37 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKPD ( pipes_struct * p , struct winreg_OpenHKPD * r )
2005-09-30 17:13:37 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKPD , r - > in . access_mask ) ;
2002-08-17 15:34:15 +00:00
}
2002-07-15 10:35:28 +00:00
2002-08-17 15:34:15 +00:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKPT ( pipes_struct * p , struct winreg_OpenHKPT * r )
2002-08-17 15:34:15 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKPT , r - > in . access_mask ) ;
2005-09-30 17:13:37 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKCR ( pipes_struct * p , struct winreg_OpenHKCR * r )
2005-09-30 17:13:37 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKCR , r - > in . access_mask ) ;
2002-07-15 10:35:28 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKU ( pipes_struct * p , struct winreg_OpenHKU * r )
2001-02-25 02:14:49 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKU , r - > in . access_mask ) ;
2006-09-21 17:51:06 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKCU ( pipes_struct * p , struct winreg_OpenHKCU * r )
2006-09-21 17:51:06 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKCU , r - > in . access_mask ) ;
2006-09-21 17:51:06 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKCC ( pipes_struct * p , struct winreg_OpenHKCC * r )
2006-09-21 17:51:06 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKCC , r - > in . access_mask ) ;
2006-09-21 17:51:06 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKDD ( pipes_struct * p , struct winreg_OpenHKDD * r )
2006-09-21 17:51:06 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKDD , r - > in . access_mask ) ;
2006-09-21 17:51:06 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenHKPN ( pipes_struct * p , struct winreg_OpenHKPN * r )
2006-09-21 17:51:06 +00:00
{
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , NULL , KEY_HKPN , r - > in . access_mask ) ;
2001-02-25 02:14:49 +00:00
}
/*******************************************************************
reg_reply_open_entry
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_OpenKey ( pipes_struct * p , struct winreg_OpenKey * r )
2001-02-25 02:14:49 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * parent = find_regkey_by_hnd ( p , r - > in . parent_handle ) ;
2001-02-25 02:14:49 +00:00
2005-06-17 15:35:31 +00:00
if ( ! parent )
2005-06-16 20:45:55 +00:00
return WERR_BADFID ;
2005-06-24 22:34:40 +00:00
2007-01-18 10:18:59 +00:00
return open_registry_key ( p , r - > out . handle , parent , r - > in . keyname . name , r - > in . access_mask ) ;
2001-02-25 02:14:49 +00:00
}
/*******************************************************************
reg_reply_info
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_QueryValue ( pipes_struct * p , struct winreg_QueryValue * r )
2001-02-25 02:14:49 +00:00
{
2006-11-23 16:19:06 +00:00
WERROR status = WERR_BADFILE ;
2007-01-18 10:18:59 +00:00
struct registry_key * regkey = find_regkey_by_hnd ( p , r - > in . handle ) ;
2006-11-23 16:19:06 +00:00
prs_struct prs_hkpd ;
uint8_t * outbuf ;
uint32_t outbuf_size ;
2006-12-01 20:01:09 +00:00
DATA_BLOB val_blob ;
2007-10-18 17:40:25 -07:00
bool free_buf = False ;
bool free_prs = False ;
2001-02-25 02:14:49 +00:00
2006-12-01 20:01:09 +00:00
if ( ! regkey )
2005-06-16 20:45:55 +00:00
return WERR_BADFID ;
2006-09-21 17:51:06 +00:00
2008-10-15 21:42:59 +02:00
if ( ( r - > out . data_length = = NULL ) | | ( r - > out . type = = NULL ) ) {
2008-06-13 15:30:08 +02:00
return WERR_INVALID_PARAM ;
}
2008-10-15 21:42:59 +02:00
* r - > out . data_length = * r - > out . type = REG_NONE ;
2006-09-21 18:22:51 +00:00
2006-12-01 20:01:09 +00:00
DEBUG ( 7 , ( " _reg_info: policy key name = [%s] \n " , regkey - > key - > name ) ) ;
DEBUG ( 7 , ( " _reg_info: policy key type = [%08x] \n " , regkey - > key - > type ) ) ;
2002-08-17 15:34:15 +00:00
2005-09-30 17:13:37 +00:00
/* Handle QueryValue calls on HKEY_PERFORMANCE_DATA */
2006-12-01 20:01:09 +00:00
if ( regkey - > key - > type = = REG_KEY_HKPD )
2005-09-30 17:13:37 +00:00
{
2008-03-25 10:11:47 +01:00
if ( strequal ( r - > in . value_name - > name , " Global " ) ) {
2008-03-14 14:26:28 -08:00
if ( ! prs_init ( & prs_hkpd , * r - > in . data_size , p - > mem_ctx , MARSHALL ) )
return WERR_NOMEM ;
2006-11-23 16:19:06 +00:00
status = reg_perfcount_get_hkpd (
2007-01-18 10:18:59 +00:00
& prs_hkpd , * r - > in . data_size , & outbuf_size , NULL ) ;
2006-11-23 16:19:06 +00:00
outbuf = ( uint8_t * ) prs_hkpd . data_p ;
free_prs = True ;
2005-09-30 17:13:37 +00:00
}
2008-03-25 10:11:47 +01:00
else if ( strequal ( r - > in . value_name - > name , " Counter 009 " ) ) {
2006-11-23 16:19:06 +00:00
outbuf_size = reg_perfcount_get_counter_names (
reg_perfcount_get_base_index ( ) ,
2006-11-27 08:05:42 +00:00
( char * * ) ( void * ) & outbuf ) ;
2006-11-23 16:19:06 +00:00
free_buf = True ;
2005-09-30 17:13:37 +00:00
}
2008-03-25 10:11:47 +01:00
else if ( strequal ( r - > in . value_name - > name , " Explain 009 " ) ) {
2006-11-23 16:19:06 +00:00
outbuf_size = reg_perfcount_get_counter_help (
reg_perfcount_get_base_index ( ) ,
2006-11-27 08:05:42 +00:00
( char * * ) ( void * ) & outbuf ) ;
2006-11-23 16:19:06 +00:00
free_buf = True ;
2005-09-30 17:13:37 +00:00
}
2008-03-25 10:11:47 +01:00
else if ( isdigit ( r - > in . value_name - > name [ 0 ] ) ) {
2006-11-23 16:19:06 +00:00
/* we probably have a request for a specific object
* here */
2008-03-14 14:26:28 -08:00
if ( ! prs_init ( & prs_hkpd , * r - > in . data_size , p - > mem_ctx , MARSHALL ) )
return WERR_NOMEM ;
2006-11-23 16:19:06 +00:00
status = reg_perfcount_get_hkpd (
2007-01-18 10:18:59 +00:00
& prs_hkpd , * r - > in . data_size , & outbuf_size ,
2008-03-25 10:11:47 +01:00
r - > in . value_name - > name ) ;
2006-11-23 16:19:06 +00:00
outbuf = ( uint8_t * ) prs_hkpd . data_p ;
free_prs = True ;
2005-09-30 17:13:37 +00:00
}
2006-11-23 16:19:06 +00:00
else {
DEBUG ( 3 , ( " Unsupported key name [%s] for HKPD. \n " ,
2008-03-25 10:11:47 +01:00
r - > in . value_name - > name ) ) ;
2005-09-30 17:13:37 +00:00
return WERR_BADFILE ;
}
2006-11-23 16:19:06 +00:00
2007-01-18 10:18:59 +00:00
* r - > out . type = REG_BINARY ;
2005-09-30 17:13:37 +00:00
}
2006-11-23 16:19:06 +00:00
else {
2006-12-01 20:01:09 +00:00
struct registry_value * val ;
2006-11-23 16:19:06 +00:00
2008-03-25 10:11:47 +01:00
status = reg_queryvalue ( p - > mem_ctx , regkey , r - > in . value_name - > name ,
2006-12-01 20:01:09 +00:00
& val ) ;
if ( ! W_ERROR_IS_OK ( status ) ) {
2007-01-18 10:18:59 +00:00
if ( r - > out . data_size ) {
* r - > out . data_size = 0 ;
2006-11-23 22:58:50 +00:00
}
2008-10-15 21:42:59 +02:00
if ( r - > out . data_length ) {
* r - > out . data_length = 0 ;
2006-11-23 22:58:50 +00:00
}
2006-12-01 20:01:09 +00:00
return status ;
2006-09-21 17:51:06 +00:00
}
2006-09-26 22:03:52 +00:00
2006-12-01 20:01:09 +00:00
status = registry_push_value ( p - > mem_ctx , val , & val_blob ) ;
if ( ! W_ERROR_IS_OK ( status ) ) {
return status ;
}
outbuf = val_blob . data ;
outbuf_size = val_blob . length ;
2007-01-18 10:18:59 +00:00
* r - > out . type = val - > type ;
2006-11-23 16:19:06 +00:00
}
2008-10-15 21:42:59 +02:00
* r - > out . data_length = outbuf_size ;
2006-11-23 16:19:06 +00:00
2007-01-18 10:18:59 +00:00
if ( * r - > in . data_size = = 0 | | ! r - > out . data ) {
2006-11-23 16:19:06 +00:00
status = WERR_OK ;
2008-10-15 21:42:59 +02:00
} else if ( * r - > out . data_length > * r - > in . data_size ) {
2006-11-23 16:19:06 +00:00
status = WERR_MORE_DATA ;
} else {
2008-10-15 21:42:59 +02:00
memcpy ( r - > out . data , outbuf , * r - > out . data_length ) ;
2006-11-23 16:19:06 +00:00
status = WERR_OK ;
2006-09-21 17:51:06 +00:00
}
2008-10-15 21:42:59 +02:00
* r - > out . data_size = * r - > out . data_length ;
2006-11-23 16:19:06 +00:00
if ( free_prs ) prs_mem_free ( & prs_hkpd ) ;
if ( free_buf ) SAFE_FREE ( outbuf ) ;
2001-02-25 02:14:49 +00:00
2002-07-15 10:35:28 +00:00
return status ;
}
/*****************************************************************************
Implementation of REG_QUERY_KEY
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-21 17:51:06 +00:00
2007-01-18 10:18:59 +00:00
WERROR _winreg_QueryInfoKey ( pipes_struct * p , struct winreg_QueryInfoKey * r )
2002-07-15 10:35:28 +00:00
{
2005-01-10 20:33:41 +00:00
WERROR status = WERR_OK ;
2007-01-18 10:18:59 +00:00
struct registry_key * regkey = find_regkey_by_hnd ( p , r - > in . handle ) ;
2002-07-15 10:35:28 +00:00
if ( ! regkey )
2006-12-01 20:01:09 +00:00
return WERR_BADFID ;
2007-01-18 10:18:59 +00:00
r - > out . classname - > name = NULL ;
2006-12-01 20:01:09 +00:00
2007-01-18 10:18:59 +00:00
status = reg_queryinfokey ( regkey , r - > out . num_subkeys , r - > out . max_subkeylen ,
r - > out . max_classlen , r - > out . num_values , r - > out . max_valnamelen ,
r - > out . max_valbufsize , r - > out . secdescsize ,
r - > out . last_changed_time ) ;
2006-12-01 20:01:09 +00:00
if ( ! W_ERROR_IS_OK ( status ) ) {
return status ;
2005-06-30 20:16:16 +00:00
}
2002-08-17 15:34:15 +00:00
2006-12-01 20:01:09 +00:00
/*
* These calculations account for the registry buffers being
* UTF - 16. They are inexact at best , but so far they worked .
*/
2007-01-18 10:18:59 +00:00
* r - > out . max_subkeylen * = 2 ;
2002-07-15 10:35:28 +00:00
2007-01-18 10:18:59 +00:00
* r - > out . max_valnamelen + = 1 ;
* r - > out . max_valnamelen * = 2 ;
2006-09-26 21:01:57 +00:00
2006-12-01 20:01:09 +00:00
return WERR_OK ;
2002-07-15 10:35:28 +00:00
}
/*****************************************************************************
2005-03-23 23:26:33 +00:00
Implementation of REG_GETVERSION
2002-07-15 10:35:28 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_GetVersion ( pipes_struct * p , struct winreg_GetVersion * r )
2002-07-15 10:35:28 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * regkey = find_regkey_by_hnd ( p , r - > in . handle ) ;
2002-07-15 10:35:28 +00:00
if ( ! regkey )
2005-06-16 20:45:55 +00:00
return WERR_BADFID ;
2002-07-15 10:35:28 +00:00
2008-01-17 11:22:01 +01:00
return reg_getversion ( r - > out . version ) ;
2002-07-15 10:35:28 +00:00
}
2001-02-25 02:14:49 +00:00
2002-07-15 10:35:28 +00:00
/*****************************************************************************
Implementation of REG_ENUM_KEY
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_EnumKey ( pipes_struct * p , struct winreg_EnumKey * r )
2002-07-15 10:35:28 +00:00
{
2006-12-01 20:01:09 +00:00
WERROR err ;
2007-01-18 10:18:59 +00:00
struct registry_key * key = find_regkey_by_hnd ( p , r - > in . handle ) ;
2002-07-15 10:35:28 +00:00
2006-12-01 20:01:09 +00:00
if ( ! key )
2005-06-16 20:45:55 +00:00
return WERR_BADFID ;
2002-07-15 10:35:28 +00:00
2007-01-18 10:18:59 +00:00
if ( ! r - > in . name | | ! r - > in . keyclass )
2006-09-21 17:51:06 +00:00
return WERR_INVALID_PARAM ;
2006-12-01 20:01:09 +00:00
DEBUG ( 8 , ( " _reg_enum_key: enumerating key [%s] \n " , key - > key - > name ) ) ;
2006-11-27 07:41:59 +00:00
2007-01-18 10:18:59 +00:00
err = reg_enumkey ( p - > mem_ctx , key , r - > in . enum_index , ( char * * ) & r - > out . name - > name ,
r - > out . last_changed_time ) ;
2006-12-01 20:01:09 +00:00
if ( ! W_ERROR_IS_OK ( err ) ) {
return err ;
2006-09-21 18:54:25 +00:00
}
2007-01-18 10:18:59 +00:00
r - > out . keyclass - > name = " " ;
2006-12-01 20:01:09 +00:00
return WERR_OK ;
2002-08-17 15:34:15 +00:00
}
/*****************************************************************************
Implementation of REG_ENUM_VALUE
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-21 17:51:06 +00:00
2007-01-18 10:18:59 +00:00
WERROR _winreg_EnumValue ( pipes_struct * p , struct winreg_EnumValue * r )
2002-08-17 15:34:15 +00:00
{
2006-12-01 20:01:09 +00:00
WERROR err ;
2007-01-18 10:18:59 +00:00
struct registry_key * key = find_regkey_by_hnd ( p , r - > in . handle ) ;
2006-12-02 11:18:19 +00:00
char * valname ;
2006-12-01 20:01:09 +00:00
struct registry_value * val ;
DATA_BLOB value_blob ;
2002-08-17 15:34:15 +00:00
2006-12-01 20:01:09 +00:00
if ( ! key )
2006-11-23 22:58:50 +00:00
return WERR_BADFID ;
2002-08-17 15:34:15 +00:00
2007-01-18 10:18:59 +00:00
if ( ! r - > in . name )
2006-09-21 17:51:06 +00:00
return WERR_INVALID_PARAM ;
2006-11-23 22:58:50 +00:00
DEBUG ( 8 , ( " _winreg_EnumValue: enumerating values for key [%s] \n " ,
2006-12-01 20:01:09 +00:00
key - > key - > name ) ) ;
2002-08-17 15:34:15 +00:00
2007-01-18 10:18:59 +00:00
err = reg_enumvalue ( p - > mem_ctx , key , r - > in . enum_index , & valname , & val ) ;
2006-12-01 20:01:09 +00:00
if ( ! W_ERROR_IS_OK ( err ) ) {
return err ;
2002-08-17 15:34:15 +00:00
}
2005-10-14 21:09:56 +00:00
2006-12-01 20:01:09 +00:00
err = registry_push_value ( p - > mem_ctx , val , & value_blob ) ;
if ( ! W_ERROR_IS_OK ( err ) ) {
return err ;
2006-11-23 22:58:50 +00:00
}
2007-01-18 10:18:59 +00:00
if ( r - > out . name ! = NULL ) {
r - > out . name - > name = valname ;
2006-09-21 17:51:06 +00:00
}
2007-01-18 10:18:59 +00:00
if ( r - > out . type ! = NULL ) {
* r - > out . type = val - > type ;
2006-10-15 16:06:10 +00:00
}
2006-09-21 17:51:06 +00:00
2007-02-20 13:43:41 +00:00
if ( r - > out . value ! = NULL ) {
2007-02-16 14:50:57 +00:00
if ( ( r - > out . size = = NULL ) | | ( r - > out . length = = NULL ) ) {
2006-11-23 22:58:50 +00:00
return WERR_INVALID_PARAM ;
2006-10-15 16:06:10 +00:00
}
2007-02-16 14:50:57 +00:00
if ( value_blob . length > * r - > out . size ) {
2006-11-23 22:58:50 +00:00
return WERR_MORE_DATA ;
2006-10-15 16:06:10 +00:00
}
2007-02-20 13:43:41 +00:00
memcpy ( r - > out . value , value_blob . data , value_blob . length ) ;
2006-09-21 17:51:06 +00:00
}
2007-02-16 14:50:57 +00:00
if ( r - > out . length ! = NULL ) {
* r - > out . length = value_blob . length ;
2006-10-15 16:06:10 +00:00
}
2007-02-16 14:50:57 +00:00
if ( r - > out . size ! = NULL ) {
* r - > out . size = value_blob . length ;
2006-10-15 16:06:10 +00:00
}
2006-09-26 22:03:52 +00:00
2006-11-23 22:58:50 +00:00
return WERR_OK ;
2001-02-25 02:14:49 +00:00
}
2001-08-23 23:25:34 +00:00
/*******************************************************************
reg_shutdwon
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_InitiateSystemShutdown ( pipes_struct * p , struct winreg_InitiateSystemShutdown * r )
2001-08-23 23:25:34 +00:00
{
2007-01-18 10:18:59 +00:00
struct winreg_InitiateSystemShutdownEx s ;
s . in . hostname = r - > in . hostname ;
s . in . message = r - > in . message ;
s . in . timeout = r - > in . timeout ;
s . in . force_apps = r - > in . force_apps ;
2008-10-15 16:25:06 +02:00
s . in . do_reboot = r - > in . do_reboot ;
2007-01-18 10:18:59 +00:00
s . in . reason = 0 ;
2006-09-21 17:51:06 +00:00
/* thunk down to _winreg_InitiateSystemShutdownEx()
( just returns a status ) */
2005-03-23 23:26:33 +00:00
2007-01-18 10:18:59 +00:00
return _winreg_InitiateSystemShutdownEx ( p , & s ) ;
2005-03-23 23:26:33 +00:00
}
/*******************************************************************
reg_shutdown_ex
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define SHUTDOWN_R_STRING "-r"
# define SHUTDOWN_F_STRING "-f"
2007-01-18 10:18:59 +00:00
WERROR _winreg_InitiateSystemShutdownEx ( pipes_struct * p , struct winreg_InitiateSystemShutdownEx * r )
2005-03-23 23:26:33 +00:00
{
2007-11-27 11:22:58 -08:00
char * shutdown_script = NULL ;
2006-09-21 17:51:06 +00:00
char * msg = NULL ;
2007-11-27 11:22:58 -08:00
char * chkmsg = NULL ;
2006-09-21 17:51:06 +00:00
fstring str_timeout ;
fstring str_reason ;
2008-07-03 12:21:33 -07:00
fstring do_reboot ;
2001-08-23 23:25:34 +00:00
fstring f ;
2005-03-23 23:26:33 +00:00
int ret ;
2007-10-18 17:40:25 -07:00
bool can_shutdown ;
2005-05-23 16:25:31 +00:00
2007-11-27 11:22:58 -08:00
shutdown_script = talloc_strdup ( p - > mem_ctx , lp_shutdown_script ( ) ) ;
if ( ! shutdown_script ) {
return WERR_NOMEM ;
}
if ( ! * shutdown_script ) {
2005-03-23 23:26:33 +00:00
return WERR_ACCESS_DENIED ;
2007-11-27 11:22:58 -08:00
}
2005-03-23 23:26:33 +00:00
/* pull the message string and perform necessary sanity checks on it */
2008-10-15 16:13:02 +02:00
if ( r - > in . message & & r - > in . message - > string ) {
if ( ( msg = talloc_strdup ( p - > mem_ctx , r - > in . message - > string ) ) = = NULL ) {
2006-09-21 17:51:06 +00:00
return WERR_NOMEM ;
}
2007-11-27 11:22:58 -08:00
chkmsg = TALLOC_ARRAY ( p - > mem_ctx , char , strlen ( msg ) + 1 ) ;
if ( ! chkmsg ) {
return WERR_NOMEM ;
}
alpha_strcpy ( chkmsg , msg , NULL , strlen ( msg ) + 1 ) ;
}
2007-01-18 10:18:59 +00:00
fstr_sprintf ( str_timeout , " %d " , r - > in . timeout ) ;
2008-10-15 16:25:06 +02:00
fstr_sprintf ( do_reboot , r - > in . do_reboot ? SHUTDOWN_R_STRING : " " ) ;
2007-01-18 10:18:59 +00:00
fstr_sprintf ( f , r - > in . force_apps ? SHUTDOWN_F_STRING : " " ) ;
fstr_sprintf ( str_reason , " %d " , r - > in . reason ) ;
2001-08-23 23:25:34 +00:00
2007-11-27 11:22:58 -08:00
shutdown_script = talloc_all_string_sub ( p - > mem_ctx ,
shutdown_script , " %z " , chkmsg ? chkmsg : " " ) ;
if ( ! shutdown_script ) {
return WERR_NOMEM ;
}
shutdown_script = talloc_all_string_sub ( p - > mem_ctx ,
shutdown_script , " %t " , str_timeout ) ;
if ( ! shutdown_script ) {
return WERR_NOMEM ;
}
shutdown_script = talloc_all_string_sub ( p - > mem_ctx ,
2008-07-03 12:21:33 -07:00
shutdown_script , " %r " , do_reboot ) ;
2007-11-27 11:22:58 -08:00
if ( ! shutdown_script ) {
return WERR_NOMEM ;
}
shutdown_script = talloc_all_string_sub ( p - > mem_ctx ,
shutdown_script , " %f " , f ) ;
if ( ! shutdown_script ) {
return WERR_NOMEM ;
}
shutdown_script = talloc_all_string_sub ( p - > mem_ctx ,
shutdown_script , " %x " , str_reason ) ;
if ( ! shutdown_script ) {
return WERR_NOMEM ;
}
2005-05-23 16:25:31 +00:00
2008-11-23 23:48:17 +01:00
can_shutdown = user_has_privileges ( p - > server_info - > ptok ,
& se_remote_shutdown ) ;
2007-11-27 11:22:58 -08:00
2005-03-23 23:26:33 +00:00
/* IF someone has privs, run the shutdown script as root. OTHERWISE run it as not root
Take the error return from the script and provide it as the Windows return code . */
2007-11-27 11:22:58 -08:00
2005-04-05 17:49:16 +00:00
/********** BEGIN SeRemoteShutdownPrivilege BLOCK **********/
2007-11-27 11:22:58 -08:00
if ( can_shutdown )
2005-04-05 17:49:16 +00:00
become_root ( ) ;
2005-03-23 23:26:33 +00:00
ret = smbrun ( shutdown_script , NULL ) ;
2007-11-27 11:22:58 -08:00
2005-04-05 17:49:16 +00:00
if ( can_shutdown )
unbecome_root ( ) ;
/********** END SeRemoteShutdownPrivilege BLOCK **********/
2007-11-27 11:22:58 -08:00
2005-03-23 23:26:33 +00:00
DEBUG ( 3 , ( " _reg_shutdown_ex: Running the command `%s' gave %d \n " ,
shutdown_script , ret ) ) ;
2001-08-23 23:25:34 +00:00
2005-03-23 23:26:33 +00:00
return ( ret = = 0 ) ? WERR_OK : WERR_ACCESS_DENIED ;
2001-08-23 23:25:34 +00:00
}
2001-08-24 07:51:59 +00:00
2002-07-15 10:35:28 +00:00
/*******************************************************************
reg_abort_shutdwon
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_AbortSystemShutdown ( pipes_struct * p , struct winreg_AbortSystemShutdown * r )
2001-08-24 07:51:59 +00:00
{
2007-11-27 11:22:58 -08:00
const char * abort_shutdown_script ;
2005-03-23 23:26:33 +00:00
int ret ;
2007-10-18 17:40:25 -07:00
bool can_shutdown ;
2001-08-24 07:51:59 +00:00
2007-11-27 11:22:58 -08:00
abort_shutdown_script = lp_abort_shutdown_script ( ) ;
2001-08-24 07:51:59 +00:00
2007-11-27 11:22:58 -08:00
if ( ! * abort_shutdown_script )
2005-03-23 23:26:33 +00:00
return WERR_ACCESS_DENIED ;
2007-11-27 11:22:58 -08:00
2008-11-23 23:48:17 +01:00
can_shutdown = user_has_privileges ( p - > server_info - > ptok ,
& se_remote_shutdown ) ;
2007-11-27 11:22:58 -08:00
2005-04-05 17:49:16 +00:00
/********** BEGIN SeRemoteShutdownPrivilege BLOCK **********/
2007-11-27 11:22:58 -08:00
2005-04-05 17:49:16 +00:00
if ( can_shutdown )
become_root ( ) ;
2007-11-15 14:19:52 -08:00
2005-03-23 23:26:33 +00:00
ret = smbrun ( abort_shutdown_script , NULL ) ;
2007-11-15 14:19:52 -08:00
2005-04-05 17:49:16 +00:00
if ( can_shutdown )
unbecome_root ( ) ;
2007-11-15 14:19:52 -08:00
2005-04-05 17:49:16 +00:00
/********** END SeRemoteShutdownPrivilege BLOCK **********/
2005-03-23 23:26:33 +00:00
DEBUG ( 3 , ( " _reg_abort_shutdown: Running the command `%s' gave %d \n " ,
abort_shutdown_script , ret ) ) ;
2001-08-24 07:51:59 +00:00
2005-03-23 23:26:33 +00:00
return ( ret = = 0 ) ? WERR_OK : WERR_ACCESS_DENIED ;
2001-08-24 07:51:59 +00:00
}
2002-07-15 10:35:28 +00:00
2005-05-23 16:25:31 +00:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-11-27 11:22:58 -08:00
static int validate_reg_filename ( TALLOC_CTX * ctx , char * * pp_fname )
2005-05-23 16:25:31 +00:00
{
2007-11-27 11:22:58 -08:00
char * p = NULL ;
2005-05-23 16:25:31 +00:00
int num_services = lp_numservices ( ) ;
2007-11-27 11:22:58 -08:00
int snum = - 1 ;
const char * share_path ;
char * fname = * pp_fname ;
2007-11-15 14:19:52 -08:00
2005-05-23 16:25:31 +00:00
/* convert to a unix path, stripping the C:\ along the way */
2007-11-15 14:19:52 -08:00
2007-11-27 11:22:58 -08:00
if ( ! ( p = valid_share_pathname ( ctx , fname ) ) ) {
2005-05-23 16:25:31 +00:00
return - 1 ;
2007-11-27 11:22:58 -08:00
}
2005-05-23 16:25:31 +00:00
/* has to exist within a valid file share */
2007-11-15 14:19:52 -08:00
2007-11-27 11:22:58 -08:00
for ( snum = 0 ; snum < num_services ; snum + + ) {
if ( ! lp_snum_ok ( snum ) | | lp_print_ok ( snum ) ) {
2005-05-23 16:25:31 +00:00
continue ;
2007-11-27 11:22:58 -08:00
}
2007-11-15 14:19:52 -08:00
2007-11-27 11:22:58 -08:00
share_path = lp_pathname ( snum ) ;
2005-05-23 16:25:31 +00:00
/* make sure we have a path (e.g. [homes] ) */
2007-11-27 11:22:58 -08:00
if ( strlen ( share_path ) = = 0 ) {
2005-05-23 16:25:31 +00:00
continue ;
2007-11-27 11:22:58 -08:00
}
2005-05-23 16:25:31 +00:00
2007-11-27 11:22:58 -08:00
if ( strncmp ( share_path , p , strlen ( share_path ) ) = = 0 ) {
2005-05-23 16:25:31 +00:00
break ;
2007-11-27 11:22:58 -08:00
}
2005-05-23 16:25:31 +00:00
}
2007-11-15 14:19:52 -08:00
2007-11-27 11:22:58 -08:00
* pp_fname = p ;
2005-05-23 16:25:31 +00:00
return ( snum < num_services ) ? snum : - 1 ;
}
2002-08-17 15:34:15 +00:00
/*******************************************************************
2005-04-05 17:49:16 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_RestoreKey ( pipes_struct * p , struct winreg_RestoreKey * r )
2005-04-05 17:49:16 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * regkey = find_regkey_by_hnd ( p , r - > in . handle ) ;
2007-11-27 11:22:58 -08:00
char * fname = NULL ;
2005-05-23 16:25:31 +00:00
int snum ;
2007-11-27 11:22:58 -08:00
2005-04-05 17:49:16 +00:00
if ( ! regkey )
2007-11-27 11:22:58 -08:00
return WERR_BADFID ;
2005-04-05 17:49:16 +00:00
2007-01-18 10:18:59 +00:00
if ( ! r - > in . filename | | ! r - > in . filename - > name )
2006-09-27 16:05:25 +00:00
return WERR_INVALID_PARAM ;
2007-11-27 23:00:11 -08:00
fname = talloc_strdup ( p - > mem_ctx , r - > in . filename - > name ) ;
2007-11-27 11:22:58 -08:00
if ( ! fname ) {
return WERR_NOMEM ;
}
2005-04-07 04:58:38 +00:00
2006-12-01 20:01:09 +00:00
DEBUG ( 8 , ( " _winreg_RestoreKey: verifying restore of key [%s] from "
" \" %s \" \n " , regkey - > key - > name , fname ) ) ;
2005-04-05 17:49:16 +00:00
2007-11-27 11:22:58 -08:00
if ( ( snum = validate_reg_filename ( p - > mem_ctx , & fname ) ) = = - 1 )
2005-05-23 16:25:31 +00:00
return WERR_OBJECT_PATH_INVALID ;
2007-11-27 11:22:58 -08:00
2005-06-09 15:20:11 +00:00
/* user must posses SeRestorePrivilege for this this proceed */
2007-11-27 11:22:58 -08:00
2008-11-23 23:48:17 +01:00
if ( ! user_has_privileges ( p - > server_info - > ptok , & se_restore ) )
2005-06-09 15:20:11 +00:00
return WERR_ACCESS_DENIED ;
2007-11-27 11:22:58 -08:00
2006-12-01 20:01:09 +00:00
DEBUG ( 2 , ( " _winreg_RestoreKey: Restoring [%s] from %s in share %s \n " ,
regkey - > key - > name , fname , lp_servicename ( snum ) ) ) ;
2005-05-23 16:25:31 +00:00
2008-02-15 15:31:31 +01:00
return reg_restorekey ( regkey , fname ) ;
2005-04-05 17:49:16 +00:00
}
2007-01-18 10:18:59 +00:00
WERROR _winreg_SaveKey ( pipes_struct * p , struct winreg_SaveKey * r )
2002-08-17 15:34:15 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * regkey = find_regkey_by_hnd ( p , r - > in . handle ) ;
2007-11-27 11:22:58 -08:00
char * fname = NULL ;
int snum = - 1 ;
2002-08-17 15:34:15 +00:00
if ( ! regkey )
2007-11-27 11:22:58 -08:00
return WERR_BADFID ;
2002-08-17 15:34:15 +00:00
2007-01-18 10:18:59 +00:00
if ( ! r - > in . filename | | ! r - > in . filename - > name )
2006-09-27 16:05:25 +00:00
return WERR_INVALID_PARAM ;
2007-11-27 11:22:58 -08:00
fname = talloc_strdup ( p - > mem_ctx , r - > in . filename - > name ) ;
if ( ! fname ) {
return WERR_NOMEM ;
}
2005-04-07 04:58:38 +00:00
2006-12-01 20:01:09 +00:00
DEBUG ( 8 , ( " _winreg_SaveKey: verifying backup of key [%s] to \" %s \" \n " ,
regkey - > key - > name , fname ) ) ;
2007-11-27 11:22:58 -08:00
if ( ( snum = validate_reg_filename ( p - > mem_ctx , & fname ) ) = = - 1 )
2005-05-23 16:25:31 +00:00
return WERR_OBJECT_PATH_INVALID ;
2007-11-27 11:22:58 -08:00
2006-12-01 20:01:09 +00:00
DEBUG ( 2 , ( " _winreg_SaveKey: Saving [%s] to %s in share %s \n " ,
regkey - > key - > name , fname , lp_servicename ( snum ) ) ) ;
2007-11-27 11:22:58 -08:00
2008-02-15 15:14:20 +01:00
return reg_savekey ( regkey , fname ) ;
2006-09-21 17:51:06 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_SaveKeyEx ( pipes_struct * p , struct winreg_SaveKeyEx * r )
2006-09-21 17:51:06 +00:00
{
2006-09-27 16:05:25 +00:00
/* fill in your code here if you think this call should
do anything */
2006-10-10 08:39:11 +00:00
p - > rng_fault_state = True ;
2006-09-21 17:51:06 +00:00
return WERR_NOT_SUPPORTED ;
2002-08-17 15:34:15 +00:00
}
2005-06-16 20:04:16 +00:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_CreateKey ( pipes_struct * p , struct winreg_CreateKey * r )
2005-06-16 20:04:16 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * parent = find_regkey_by_hnd ( p , r - > in . handle ) ;
2006-12-01 20:01:09 +00:00
struct registry_key * new_key ;
2005-06-17 15:35:31 +00:00
WERROR result ;
if ( ! parent )
return WERR_BADFID ;
2006-09-21 17:51:06 +00:00
2008-03-28 15:39:52 +01:00
DEBUG ( 10 , ( " _winreg_CreateKey called with parent key '%s' and "
" subkey name '%s' \n " , parent - > key - > name , r - > in . name . name ) ) ;
2007-01-18 10:18:59 +00:00
result = reg_createkey ( NULL , parent , r - > in . name . name , r - > in . access_mask ,
& new_key , r - > out . action_taken ) ;
2006-12-01 20:01:09 +00:00
if ( ! W_ERROR_IS_OK ( result ) ) {
return result ;
2005-08-29 14:55:40 +00:00
}
2009-01-07 18:44:52 +01:00
if ( ! create_policy_hnd ( p , r - > out . new_handle , new_key ) ) {
2006-12-01 20:01:09 +00:00
TALLOC_FREE ( new_key ) ;
return WERR_BADFILE ;
2006-09-26 22:39:40 +00:00
}
2005-06-17 15:35:31 +00:00
2006-12-01 20:01:09 +00:00
return WERR_OK ;
2005-06-16 20:04:16 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_SetValue ( pipes_struct * p , struct winreg_SetValue * r )
2005-06-16 20:04:16 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * key = find_regkey_by_hnd ( p , r - > in . handle ) ;
2006-12-01 20:01:09 +00:00
struct registry_value * val ;
WERROR status ;
2005-06-17 15:35:31 +00:00
2006-12-01 20:01:09 +00:00
if ( ! key )
2005-06-17 15:35:31 +00:00
return WERR_BADFID ;
2006-11-23 22:58:50 +00:00
2007-01-18 10:18:59 +00:00
DEBUG ( 8 , ( " _reg_set_value: Setting value for [%s:%s] \n " ,
key - > key - > name , r - > in . name . name ) ) ;
2006-11-23 22:58:50 +00:00
2007-01-18 10:18:59 +00:00
status = registry_pull_value ( p - > mem_ctx , & val , r - > in . type , r - > in . data ,
r - > in . size , r - > in . size ) ;
2006-12-01 20:01:09 +00:00
if ( ! W_ERROR_IS_OK ( status ) ) {
return status ;
}
2006-11-23 22:58:50 +00:00
2007-01-18 10:18:59 +00:00
return reg_setvalue ( key , r - > in . name . name , val ) ;
2005-06-16 20:04:16 +00:00
}
2002-07-15 10:35:28 +00:00
2005-06-16 20:59:39 +00:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_DeleteKey ( pipes_struct * p , struct winreg_DeleteKey * r )
2005-06-16 20:59:39 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * parent = find_regkey_by_hnd ( p , r - > in . handle ) ;
2005-06-17 15:35:31 +00:00
if ( ! parent )
return WERR_BADFID ;
2005-09-30 17:13:37 +00:00
2007-01-18 10:18:59 +00:00
return reg_deletekey ( parent , r - > in . key . name ) ;
2005-06-16 20:59:39 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_DeleteValue ( pipes_struct * p , struct winreg_DeleteValue * r )
2005-06-16 20:59:39 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * key = find_regkey_by_hnd ( p , r - > in . handle ) ;
2005-06-25 17:31:40 +00:00
2006-12-01 20:01:09 +00:00
if ( ! key )
2005-06-17 15:35:31 +00:00
return WERR_BADFID ;
2006-11-23 22:58:50 +00:00
2007-01-18 10:18:59 +00:00
return reg_deletevalue ( key , r - > in . value . name ) ;
2005-06-16 20:59:39 +00:00
}
2005-06-24 22:34:40 +00:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_GetKeySecurity ( pipes_struct * p , struct winreg_GetKeySecurity * r )
2005-06-24 22:34:40 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * key = find_regkey_by_hnd ( p , r - > in . handle ) ;
2006-11-30 07:38:40 +00:00
WERROR err ;
struct security_descriptor * secdesc ;
uint8 * data ;
size_t len ;
2005-06-24 22:34:40 +00:00
if ( ! key )
return WERR_BADFID ;
/* access checks first */
2006-12-01 20:01:09 +00:00
if ( ! ( key - > key - > access_granted & STD_RIGHT_READ_CONTROL_ACCESS ) )
2005-06-24 22:34:40 +00:00
return WERR_ACCESS_DENIED ;
2006-11-30 07:38:40 +00:00
2008-01-17 11:06:32 +01:00
err = reg_getkeysecurity ( p - > mem_ctx , key , & secdesc ) ;
2006-11-30 07:38:40 +00:00
if ( ! W_ERROR_IS_OK ( err ) ) {
return err ;
}
err = ntstatus_to_werror ( marshall_sec_desc ( p - > mem_ctx , secdesc ,
& data , & len ) ) ;
if ( ! W_ERROR_IS_OK ( err ) ) {
return err ;
}
2007-01-18 10:18:59 +00:00
if ( len > r - > out . sd - > size ) {
r - > out . sd - > size = len ;
2006-11-30 07:38:40 +00:00
return WERR_INSUFFICIENT_BUFFER ;
}
2007-01-18 10:18:59 +00:00
r - > out . sd - > size = len ;
r - > out . sd - > len = len ;
r - > out . sd - > data = data ;
2005-06-24 22:34:40 +00:00
2006-11-30 07:38:40 +00:00
return WERR_OK ;
2005-06-24 22:34:40 +00:00
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_SetKeySecurity ( pipes_struct * p , struct winreg_SetKeySecurity * r )
2005-06-24 22:34:40 +00:00
{
2007-01-18 10:18:59 +00:00
struct registry_key * key = find_regkey_by_hnd ( p , r - > in . handle ) ;
2006-11-30 07:38:40 +00:00
struct security_descriptor * secdesc ;
WERROR err ;
2005-06-24 22:34:40 +00:00
if ( ! key )
return WERR_BADFID ;
/* access checks first */
2006-12-01 20:01:09 +00:00
if ( ! ( key - > key - > access_granted & STD_RIGHT_WRITE_DAC_ACCESS ) )
2005-06-24 22:34:40 +00:00
return WERR_ACCESS_DENIED ;
2006-11-30 07:38:40 +00:00
2007-01-18 10:18:59 +00:00
err = ntstatus_to_werror ( unmarshall_sec_desc ( p - > mem_ctx , r - > in . sd - > data ,
r - > in . sd - > len , & secdesc ) ) ;
2006-11-30 07:38:40 +00:00
if ( ! W_ERROR_IS_OK ( err ) ) {
return err ;
}
2008-01-17 11:06:32 +01:00
return reg_setkeysecurity ( key , secdesc ) ;
2005-06-24 22:34:40 +00:00
}
2006-09-21 17:51:06 +00:00
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_FlushKey ( pipes_struct * p , struct winreg_FlushKey * r )
2006-09-21 17:51:06 +00:00
{
/* I'm just replying OK because there's not a lot
here I see to do i - - jerry */
return WERR_OK ;
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_UnLoadKey ( pipes_struct * p , struct winreg_UnLoadKey * r )
2006-09-21 17:51:06 +00:00
{
/* fill in your code here if you think this call should
do anything */
2006-10-10 08:39:11 +00:00
p - > rng_fault_state = True ;
2006-09-21 17:51:06 +00:00
return WERR_NOT_SUPPORTED ;
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_ReplaceKey ( pipes_struct * p , struct winreg_ReplaceKey * r )
2006-09-21 17:51:06 +00:00
{
/* fill in your code here if you think this call should
do anything */
2006-10-10 08:39:11 +00:00
p - > rng_fault_state = True ;
2006-09-21 17:51:06 +00:00
return WERR_NOT_SUPPORTED ;
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_LoadKey ( pipes_struct * p , struct winreg_LoadKey * r )
2006-09-21 17:51:06 +00:00
{
/* fill in your code here if you think this call should
do anything */
2006-10-10 08:39:11 +00:00
p - > rng_fault_state = True ;
2006-09-21 17:51:06 +00:00
return WERR_NOT_SUPPORTED ;
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_NotifyChangeKeyValue ( pipes_struct * p , struct winreg_NotifyChangeKeyValue * r )
2006-09-21 17:51:06 +00:00
{
/* fill in your code here if you think this call should
do anything */
2006-10-10 08:39:11 +00:00
p - > rng_fault_state = True ;
2006-09-21 17:51:06 +00:00
return WERR_NOT_SUPPORTED ;
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_QueryMultipleValues ( pipes_struct * p , struct winreg_QueryMultipleValues * r )
2006-09-21 17:51:06 +00:00
{
/* fill in your code here if you think this call should
do anything */
2006-10-10 08:39:11 +00:00
p - > rng_fault_state = True ;
2006-09-21 17:51:06 +00:00
return WERR_NOT_SUPPORTED ;
}
/*******************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-01-18 10:18:59 +00:00
WERROR _winreg_QueryMultipleValues2 ( pipes_struct * p , struct winreg_QueryMultipleValues2 * r )
2006-09-21 17:51:06 +00:00
{
/* fill in your code here if you think this call should
do anything */
2006-10-10 08:39:11 +00:00
p - > rng_fault_state = True ;
2006-09-21 17:51:06 +00:00
return WERR_NOT_SUPPORTED ;
}