2007-10-06 01:22:07 +04:00
/*
2003-11-21 08:28:36 +03:00
Unix SMB / CIFS implementation .
test suite for winreg rpc operations
Copyright ( C ) Tim Potter 2003
2007-08-26 19:16:40 +04:00
Copyright ( C ) Jelmer Vernooij 2004 - 2007
2007-10-06 01:22:07 +04:00
2003-11-21 08:28:36 +03: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-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2003-11-21 08:28:36 +03:00
( at your option ) any later version .
2007-10-06 01:22:07 +04:00
2003-11-21 08:28:36 +03:00
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 .
2007-10-06 01:22:07 +04:00
2003-11-21 08:28:36 +03:00
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2003-11-21 08:28:36 +03:00
*/
# include "includes.h"
2006-01-03 16:41:17 +03:00
# include "torture/torture.h"
2006-03-15 02:35:30 +03:00
# include "librpc/gen_ndr/ndr_winreg_c.h"
2006-03-16 03:23:11 +03:00
# include "librpc/gen_ndr/ndr_security.h"
2006-04-02 16:02:01 +04:00
# include "libcli/security/security.h"
2006-03-14 18:02:05 +03:00
# include "torture/rpc/rpc.h"
2003-11-21 08:28:36 +03:00
2005-08-24 15:01:10 +04:00
# define TEST_KEY_BASE "smbtorture test"
# define TEST_KEY1 TEST_KEY_BASE "\\spottyfoot"
# define TEST_KEY2 TEST_KEY_BASE "\\with a SD (#1)"
2007-07-11 01:35:20 +04:00
# define TEST_KEY3 TEST_KEY_BASE "\\with a subkey"
# define TEST_SUBKEY TEST_KEY3 "\\subkey"
2005-08-24 15:01:10 +04:00
2007-10-06 00:45:16 +04:00
static void init_initshutdown_String ( TALLOC_CTX * mem_ctx ,
2007-10-06 01:22:07 +04:00
struct initshutdown_String * name ,
const char * s )
2005-03-17 23:28:01 +03:00
{
name - > name = talloc ( mem_ctx , struct initshutdown_String_sub ) ;
name - > name - > name = s ;
}
2003-11-21 09:14:14 +03:00
static void init_winreg_String ( struct winreg_String * name , const char * s )
{
name - > name = s ;
2003-11-23 09:31:10 +03:00
if ( s ) {
name - > name_len = 2 * ( strlen_m ( s ) + 1 ) ;
name - > name_size = name - > name_len ;
} else {
name - > name_len = 0 ;
name - > name_size = 0 ;
}
2003-11-21 09:14:14 +03:00
}
2007-10-06 00:45:16 +04:00
static bool test_GetVersion ( struct dcerpc_pipe * p ,
struct torture_context * tctx ,
2003-11-21 08:28:36 +03:00
struct policy_handle * handle )
{
struct winreg_GetVersion r ;
2006-09-16 00:36:38 +04:00
uint32_t v ;
2003-11-21 08:28:36 +03:00
2006-09-16 00:36:38 +04:00
ZERO_STRUCT ( r ) ;
2003-11-21 08:28:36 +03:00
r . in . handle = handle ;
2006-09-16 00:36:38 +04:00
r . out . version = & v ;
2003-11-21 08:28:36 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , dcerpc_winreg_GetVersion ( p , tctx , & r ) ,
2007-10-06 01:22:07 +04:00
" GetVersion failed " ) ;
2003-11-21 08:28:36 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " GetVersion failed " ) ;
2004-10-29 03:06:12 +04:00
2007-04-18 18:43:05 +04:00
return true ;
2003-11-21 08:28:36 +03:00
}
2007-10-06 00:45:16 +04:00
static bool test_NotifyChangeKeyValue ( struct dcerpc_pipe * p ,
struct torture_context * tctx ,
struct policy_handle * handle )
2004-12-13 05:04:34 +03:00
{
struct winreg_NotifyChangeKeyValue r ;
r . in . handle = handle ;
2007-10-25 13:26:02 +04:00
r . in . watch_subtree = true ;
2004-12-13 05:04:34 +03:00
r . in . notify_filter = 0 ;
r . in . unknown = r . in . unknown2 = 0 ;
init_winreg_String ( & r . in . string1 , NULL ) ;
init_winreg_String ( & r . in . string2 , NULL ) ;
2007-10-06 00:45:16 +04:00
torture_assert_ntstatus_ok ( tctx ,
dcerpc_winreg_NotifyChangeKeyValue ( p , tctx , & r ) ,
" NotifyChangeKeyValue failed " ) ;
2004-12-13 05:04:34 +03:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
2007-10-06 00:45:16 +04:00
torture_comment ( tctx ,
2007-10-25 13:26:02 +04:00
" NotifyChangeKeyValue failed - %s - not considering \n " ,
win_errstr ( r . out . result ) ) ;
2007-04-18 18:43:05 +04:00
return true ;
2004-12-13 05:04:34 +03:00
}
2007-04-18 18:43:05 +04:00
return true ;
2004-12-13 05:04:34 +03:00
}
2007-08-26 19:16:40 +04:00
static bool test_CreateKey ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2007-10-06 00:45:16 +04:00
struct policy_handle * handle , const char * name ,
2004-06-14 03:50:55 +04:00
const char * class )
2004-04-05 17:50:45 +04:00
{
struct winreg_CreateKey r ;
struct policy_handle newhandle ;
2006-04-30 17:54:03 +04:00
enum winreg_CreateAction action_taken = 0 ;
2004-04-05 17:50:45 +04:00
r . in . handle = handle ;
2005-08-24 12:31:39 +04:00
r . out . new_handle = & newhandle ;
2007-10-06 00:45:16 +04:00
init_winreg_String ( & r . in . name , name ) ;
2006-09-15 22:34:03 +04:00
init_winreg_String ( & r . in . keyclass , class ) ;
2004-12-13 04:37:18 +03:00
r . in . options = 0x0 ;
2005-10-22 12:00:09 +04:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-12-13 04:37:18 +03:00
r . in . action_taken = r . out . action_taken = & action_taken ;
2005-08-24 12:31:39 +04:00
r . in . secdesc = NULL ;
2004-04-05 17:50:45 +04:00
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , dcerpc_winreg_CreateKey ( p , tctx , & r ) ,
2007-10-06 01:22:07 +04:00
" CreateKey failed " ) ;
2004-04-05 17:50:45 +04:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " CreateKey failed " ) ;
2004-04-06 00:44:33 +04:00
2007-04-18 18:43:05 +04:00
return true ;
2004-04-05 17:50:45 +04:00
}
2005-08-24 15:01:10 +04:00
/*
createkey testing with a SD
*/
2007-10-06 00:45:16 +04:00
static bool test_CreateKey_sd ( struct dcerpc_pipe * p ,
struct torture_context * tctx ,
struct policy_handle * handle , const char * name ,
2007-10-10 15:23:06 +04:00
const char * class ,
struct policy_handle * newhandle )
2005-08-24 15:01:10 +04:00
{
struct winreg_CreateKey r ;
2006-04-30 17:54:03 +04:00
enum winreg_CreateAction action_taken = 0 ;
2005-08-24 15:01:10 +04:00
struct security_descriptor * sd ;
DATA_BLOB sdblob ;
struct winreg_SecBuf secbuf ;
2007-08-26 19:16:40 +04:00
sd = security_descriptor_create ( tctx ,
2007-10-10 15:12:53 +04:00
0 ,
2005-08-24 15:01:10 +04:00
NULL , NULL ,
SID_NT_AUTHENTICATED_USERS ,
SEC_ACE_TYPE_ACCESS_ALLOWED ,
SEC_GENERIC_ALL ,
SEC_ACE_FLAG_OBJECT_INHERIT ,
NULL ) ;
2007-10-06 00:45:16 +04:00
torture_assert_ntstatus_ok ( tctx ,
ndr_push_struct_blob ( & sdblob , tctx , sd ,
( ndr_push_flags_fn_t ) ndr_push_security_descriptor ) ,
" Failed to push security_descriptor ?! \n " ) ;
2005-08-24 15:01:10 +04:00
secbuf . sd . data = sdblob . data ;
secbuf . sd . len = sdblob . length ;
secbuf . sd . size = sdblob . length ;
secbuf . length = sdblob . length - 10 ;
secbuf . inherit = 0 ;
r . in . handle = handle ;
r . out . new_handle = newhandle ;
2007-10-06 00:45:16 +04:00
init_winreg_String ( & r . in . name , name ) ;
2006-09-15 22:34:03 +04:00
init_winreg_String ( & r . in . keyclass , class ) ;
2005-08-24 15:01:10 +04:00
r . in . options = 0x0 ;
2005-10-22 12:00:09 +04:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2005-08-24 15:01:10 +04:00
r . in . action_taken = r . out . action_taken = & action_taken ;
r . in . secdesc = & secbuf ;
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , dcerpc_winreg_CreateKey ( p , tctx , & r ) ,
2007-10-06 01:22:07 +04:00
" CreateKey with sd failed " ) ;
2005-08-24 15:01:10 +04:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " CreateKey with sd failed " ) ;
2005-08-24 15:01:10 +04:00
2007-04-18 18:43:05 +04:00
return true ;
2005-08-24 15:01:10 +04:00
}
2007-10-06 00:45:16 +04:00
static bool test_GetKeySecurity ( struct dcerpc_pipe * p ,
struct torture_context * tctx ,
2007-10-10 14:55:07 +04:00
struct policy_handle * handle ,
struct security_descriptor * * sd_out )
2004-12-12 02:28:48 +03:00
{
struct winreg_GetKeySecurity r ;
2007-10-10 15:50:21 +04:00
struct security_descriptor * sd = NULL ;
2005-08-24 12:31:39 +04:00
DATA_BLOB sdblob ;
2004-12-12 02:28:48 +03:00
ZERO_STRUCT ( r ) ;
r . in . handle = handle ;
2007-08-26 19:16:40 +04:00
r . in . sd = r . out . sd = talloc_zero ( tctx , struct KeySecurityData ) ;
2005-08-24 15:01:10 +04:00
r . in . sd - > size = 0x1000 ;
r . in . sec_info = SECINFO_OWNER | SECINFO_GROUP | SECINFO_DACL ;
2004-12-12 02:28:48 +03:00
2007-10-10 14:55:07 +04:00
torture_assert_ntstatus_ok ( tctx ,
dcerpc_winreg_GetKeySecurity ( p , tctx , & r ) ,
2007-10-06 01:22:07 +04:00
" GetKeySecurity failed " ) ;
2004-12-12 02:28:48 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " GetKeySecurity failed " ) ;
2004-12-12 02:28:48 +03:00
2005-08-24 12:31:39 +04:00
sdblob . data = r . out . sd - > data ;
sdblob . length = r . out . sd - > len ;
2007-10-10 15:50:21 +04:00
sd = talloc_zero ( tctx , struct security_descriptor ) ;
2007-10-06 00:45:16 +04:00
torture_assert_ntstatus_ok ( tctx ,
2007-10-10 14:55:07 +04:00
ndr_pull_struct_blob ( & sdblob , tctx , sd ,
2007-10-06 00:45:16 +04:00
( ndr_pull_flags_fn_t ) ndr_pull_security_descriptor ) ,
" pull_security_descriptor failed " ) ;
2007-08-26 19:16:40 +04:00
2005-08-24 12:31:39 +04:00
if ( p - > conn - > flags & DCERPC_DEBUG_PRINT_OUT ) {
2007-10-10 14:55:07 +04:00
NDR_PRINT_DEBUG ( security_descriptor , sd ) ;
}
if ( sd_out ) {
* sd_out = sd ;
2007-10-10 15:50:21 +04:00
} else {
talloc_free ( sd ) ;
2005-08-24 12:31:39 +04:00
}
2007-04-18 18:43:05 +04:00
return true ;
2004-12-12 02:28:48 +03:00
}
2007-10-10 15:56:47 +04:00
static bool test_SetKeySecurity ( struct dcerpc_pipe * p ,
struct torture_context * tctx ,
struct policy_handle * handle ,
struct security_descriptor * sd )
{
struct winreg_SetKeySecurity r ;
struct KeySecurityData * sdata = NULL ;
DATA_BLOB sdblob ;
2007-10-25 13:12:02 +04:00
uint32_t sec_info ;
2007-10-10 15:56:47 +04:00
ZERO_STRUCT ( r ) ;
if ( p - > conn - > flags & DCERPC_DEBUG_PRINT_OUT ) {
NDR_PRINT_DEBUG ( security_descriptor , sd ) ;
}
torture_assert_ntstatus_ok ( tctx ,
ndr_push_struct_blob ( & sdblob , tctx , sd ,
( ndr_push_flags_fn_t ) ndr_push_security_descriptor ) ,
" push_security_descriptor failed " ) ;
sdata = talloc_zero ( tctx , struct KeySecurityData ) ;
sdata - > data = sdblob . data ;
sdata - > size = sdblob . length ;
sdata - > len = sdblob . length ;
2007-10-25 13:12:02 +04:00
sec_info = SECINFO_UNPROTECTED_SACL | SECINFO_UNPROTECTED_DACL ;
if ( sd - > owner_sid ) {
sec_info | = SECINFO_OWNER ;
}
if ( sd - > group_sid ) {
sec_info | = SECINFO_GROUP ;
}
if ( sd - > sacl ) {
sec_info | = SECINFO_SACL ;
}
if ( sd - > dacl ) {
sec_info | = SECINFO_DACL ;
}
2007-10-10 15:56:47 +04:00
r . in . handle = handle ;
2007-10-25 13:12:02 +04:00
r . in . sec_info = sec_info ;
2007-10-10 15:56:47 +04:00
r . in . sd = sdata ;
torture_assert_ntstatus_ok ( tctx ,
dcerpc_winreg_SetKeySecurity ( p , tctx , & r ) ,
" SetKeySecurity failed " ) ;
torture_assert_werr_ok ( tctx , r . out . result , " SetKeySecurity failed " ) ;
return true ;
}
2007-10-06 00:45:16 +04:00
static bool test_CloseKey ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2003-11-21 08:28:36 +03:00
struct policy_handle * handle )
{
struct winreg_CloseKey r ;
r . in . handle = r . out . handle = handle ;
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , dcerpc_winreg_CloseKey ( p , tctx , & r ) ,
2007-10-06 01:22:07 +04:00
" CloseKey failed " ) ;
2003-11-21 08:28:36 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " CloseKey failed " ) ;
2004-10-29 03:06:12 +04:00
2007-04-18 18:43:05 +04:00
return true ;
2003-11-21 08:28:36 +03:00
}
2007-10-06 00:45:16 +04:00
static bool test_FlushKey ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2003-11-21 09:14:14 +03:00
struct policy_handle * handle )
{
struct winreg_FlushKey r ;
r . in . handle = handle ;
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , dcerpc_winreg_FlushKey ( p , tctx , & r ) ,
2007-10-06 00:45:16 +04:00
" FlushKey failed " ) ;
2003-11-21 09:14:14 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " FlushKey failed " ) ;
2004-10-29 01:24:29 +04:00
2007-04-18 18:43:05 +04:00
return true ;
2003-11-21 09:14:14 +03:00
}
2007-08-26 19:16:40 +04:00
static bool test_OpenKey ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2003-11-22 08:34:25 +03:00
struct policy_handle * hive_handle ,
2004-04-06 02:34:24 +04:00
const char * keyname , struct policy_handle * key_handle )
2003-11-22 08:34:25 +03:00
{
struct winreg_OpenKey r ;
2006-09-15 22:34:03 +04:00
r . in . parent_handle = hive_handle ;
2003-11-22 08:34:25 +03:00
init_winreg_String ( & r . in . keyname , keyname ) ;
r . in . unknown = 0x00000000 ;
2005-08-17 05:25:58 +04:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2003-11-22 08:34:25 +03:00
r . out . handle = key_handle ;
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , dcerpc_winreg_OpenKey ( p , tctx , & r ) ,
2007-10-06 00:45:16 +04:00
" OpenKey failed " ) ;
2004-12-09 01:02:49 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " OpenKey failed " ) ;
2003-11-22 08:34:25 +03:00
2007-04-18 18:43:05 +04:00
return true ;
2003-11-22 08:34:25 +03:00
}
2007-08-26 19:16:40 +04:00
static bool test_Cleanup ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2005-08-24 15:01:10 +04:00
struct policy_handle * handle , const char * key )
{
struct winreg_DeleteKey r ;
r . in . handle = handle ;
2005-08-24 15:12:16 +04:00
init_winreg_String ( & r . in . key , key ) ;
2007-08-26 19:16:40 +04:00
dcerpc_winreg_DeleteKey ( p , tctx , & r ) ;
2005-08-24 15:01:10 +04:00
2007-04-18 18:43:05 +04:00
return true ;
2005-08-24 15:01:10 +04:00
}
2007-08-26 19:16:40 +04:00
static bool test_DeleteKey ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2004-04-06 02:34:24 +04:00
struct policy_handle * handle , const char * key )
2003-11-21 09:14:14 +03:00
{
NTSTATUS status ;
struct winreg_DeleteKey r ;
r . in . handle = handle ;
2007-10-06 00:45:16 +04:00
init_winreg_String ( & r . in . key , key ) ;
2003-11-21 09:14:14 +03:00
2007-08-26 19:16:40 +04:00
status = dcerpc_winreg_DeleteKey ( p , tctx , & r ) ;
2003-11-21 09:14:14 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , status , " DeleteKey failed " ) ;
torture_assert_werr_ok ( tctx , r . out . result , " DeleteKey failed " ) ;
2004-04-06 00:44:33 +04:00
2007-04-18 18:43:05 +04:00
return true ;
2003-11-21 09:14:14 +03:00
}
2007-07-11 01:35:20 +04:00
/* DeleteKey on a key with subkey(s) should
* return WERR_ACCESS_DENIED . */
2007-10-06 00:45:16 +04:00
static bool test_DeleteKeyWithSubkey ( struct dcerpc_pipe * p ,
2007-08-26 19:16:40 +04:00
struct torture_context * tctx ,
2007-10-10 15:23:06 +04:00
struct policy_handle * handle ,
const char * key )
2007-07-11 01:35:20 +04:00
{
struct winreg_DeleteKey r ;
r . in . handle = handle ;
init_winreg_String ( & r . in . key , key ) ;
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , dcerpc_winreg_DeleteKey ( p , tctx , & r ) ,
2007-10-06 01:22:07 +04:00
" DeleteKeyWithSubkey failed " ) ;
2007-07-11 01:35:20 +04:00
2007-10-06 00:45:16 +04:00
torture_assert_werr_equal ( tctx , r . out . result , WERR_ACCESS_DENIED ,
" DeleteKeyWithSubkey failed " ) ;
2007-07-11 01:35:20 +04:00
return true ;
}
2007-10-06 00:45:16 +04:00
static bool test_QueryInfoKey ( struct dcerpc_pipe * p ,
struct torture_context * tctx ,
2003-11-22 08:34:25 +03:00
struct policy_handle * handle , char * class )
{
struct winreg_QueryInfoKey r ;
2006-09-16 00:36:38 +04:00
uint32_t num_subkeys , max_subkeylen , max_subkeysize ,
num_values , max_valnamelen , max_valbufsize ,
secdescsize ;
NTTIME last_changed_time ;
2003-11-22 08:34:25 +03:00
2006-09-16 00:36:38 +04:00
ZERO_STRUCT ( r ) ;
2003-11-22 08:34:25 +03:00
r . in . handle = handle ;
2006-09-16 00:36:38 +04:00
r . out . num_subkeys = & num_subkeys ;
r . out . max_subkeylen = & max_subkeylen ;
r . out . max_subkeysize = & max_subkeysize ;
r . out . num_values = & num_values ;
r . out . max_valnamelen = & max_valnamelen ;
r . out . max_valbufsize = & max_valbufsize ;
r . out . secdescsize = & secdescsize ;
r . out . last_changed_time = & last_changed_time ;
2007-04-18 18:43:05 +04:00
2007-08-26 19:16:40 +04:00
r . out . classname = talloc ( tctx , struct winreg_String ) ;
2007-10-06 00:45:16 +04:00
2007-08-26 19:16:40 +04:00
r . in . classname = talloc ( tctx , struct winreg_String ) ;
2007-02-16 18:13:51 +03:00
init_winreg_String ( r . in . classname , class ) ;
2007-10-06 00:45:16 +04:00
torture_assert_ntstatus_ok ( tctx ,
2007-10-06 01:22:07 +04:00
dcerpc_winreg_QueryInfoKey ( p , tctx , & r ) ,
" QueryInfoKey failed " ) ;
2004-04-09 02:39:47 +04:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " QueryInfoKey failed " ) ;
2003-11-22 08:34:25 +03:00
2007-04-18 18:43:05 +04:00
return true ;
2003-11-22 08:34:25 +03:00
}
2007-08-26 19:16:40 +04:00
static bool test_key ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2003-12-12 14:49:29 +03:00
struct policy_handle * handle , int depth ) ;
2003-12-12 09:29:21 +03:00
2007-08-26 19:16:40 +04:00
static bool test_EnumKey ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2003-12-12 14:49:29 +03:00
struct policy_handle * handle , int depth )
2003-11-22 08:34:25 +03:00
{
2003-12-12 14:49:29 +03:00
struct winreg_EnumKey r ;
2005-08-17 05:25:58 +04:00
struct winreg_StringBuf class , name ;
2003-11-22 08:34:25 +03:00
NTSTATUS status ;
2005-08-17 05:25:58 +04:00
NTTIME t = 0 ;
2003-11-22 08:34:25 +03:00
2005-10-21 17:06:21 +04:00
class . name = " " ;
2005-11-02 04:01:17 +03:00
class . size = 1024 ;
2005-08-17 05:25:58 +04:00
2003-12-12 14:49:29 +03:00
r . in . handle = handle ;
r . in . enum_index = 0 ;
2005-08-17 05:25:58 +04:00
r . in . name = & name ;
2006-09-15 22:34:03 +04:00
r . in . keyclass = & class ;
2005-08-17 05:25:58 +04:00
r . out . name = & name ;
r . in . last_changed_time = & t ;
2003-11-22 08:34:25 +03:00
2003-12-12 14:49:29 +03:00
do {
2005-08-17 05:25:58 +04:00
name . name = NULL ;
2005-11-02 04:01:17 +03:00
name . size = 1024 ;
2005-08-17 05:25:58 +04:00
2007-08-26 19:16:40 +04:00
status = dcerpc_winreg_EnumKey ( p , tctx , & r ) ;
2003-11-22 08:34:25 +03:00
2003-12-12 14:49:29 +03:00
if ( NT_STATUS_IS_OK ( status ) & & W_ERROR_IS_OK ( r . out . result ) ) {
struct policy_handle key_handle ;
2003-11-22 08:34:25 +03:00
2007-10-10 15:23:06 +04:00
torture_comment ( tctx , " EnumKey: %d: %s \n " ,
r . in . enum_index ,
2007-10-06 01:22:07 +04:00
r . out . name - > name ) ;
2004-10-29 05:10:40 +04:00
2007-10-06 01:22:07 +04:00
if ( ! test_OpenKey ( p , tctx , handle , r . out . name - > name ,
& key_handle ) ) {
2004-10-29 05:10:40 +04:00
} else {
2007-08-26 19:16:40 +04:00
test_key ( p , tctx , & key_handle , depth + 1 ) ;
2003-12-12 14:49:29 +03:00
}
}
r . in . enum_index + + ;
2004-10-29 01:24:29 +04:00
} while ( NT_STATUS_IS_OK ( status ) & & W_ERROR_IS_OK ( r . out . result ) ) ;
2003-12-12 14:49:29 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_ntstatus_ok ( tctx , status , " EnumKey failed " ) ;
2004-10-29 05:10:40 +04:00
2007-10-06 00:45:16 +04:00
if ( ! W_ERROR_IS_OK ( r . out . result ) & &
2007-08-26 19:16:40 +04:00
! W_ERROR_EQUAL ( r . out . result , WERR_NO_MORE_ITEMS ) ) {
torture_fail ( tctx , " EnumKey failed " ) ;
2004-10-29 05:10:40 +04:00
}
2007-04-18 18:43:05 +04:00
return true ;
2003-12-12 14:49:29 +03:00
}
2007-10-06 00:45:16 +04:00
static bool test_QueryMultipleValues ( struct dcerpc_pipe * p ,
struct torture_context * tctx ,
struct policy_handle * handle ,
const char * valuename )
2004-12-12 03:22:30 +03:00
{
struct winreg_QueryMultipleValues r ;
NTSTATUS status ;
2005-08-24 15:42:46 +04:00
uint32_t bufsize = 0 ;
2004-12-12 03:22:30 +03:00
r . in . key_handle = handle ;
2007-08-26 19:16:40 +04:00
r . in . values = r . out . values = talloc_array ( tctx , struct QueryMultipleValue , 1 ) ;
r . in . values [ 0 ] . name = talloc ( tctx , struct winreg_String ) ;
2004-12-12 03:22:30 +03:00
r . in . values [ 0 ] . name - > name = valuename ;
r . in . values [ 0 ] . offset = 0 ;
r . in . values [ 0 ] . length = 0 ;
r . in . values [ 0 ] . type = 0 ;
r . in . num_values = 1 ;
2007-08-26 19:16:40 +04:00
r . in . buffer_size = r . out . buffer_size = talloc ( tctx , uint32_t ) ;
2005-08-24 15:42:46 +04:00
* r . in . buffer_size = bufsize ;
2007-10-06 00:45:16 +04:00
do {
2005-08-24 15:42:46 +04:00
* r . in . buffer_size = bufsize ;
2007-10-06 00:45:16 +04:00
r . in . buffer = r . out . buffer = talloc_zero_array ( tctx , uint8_t ,
2005-08-24 15:01:10 +04:00
* r . in . buffer_size ) ;
2005-05-25 01:59:01 +04:00
2007-08-26 19:16:40 +04:00
status = dcerpc_winreg_QueryMultipleValues ( p , tctx , & r ) ;
2007-10-06 00:45:16 +04:00
2007-08-26 19:16:40 +04:00
if ( NT_STATUS_IS_ERR ( status ) )
torture_fail ( tctx , " QueryMultipleValues failed " ) ;
2005-08-24 15:42:46 +04:00
talloc_free ( r . in . buffer ) ;
bufsize + = 0x20 ;
2005-05-25 01:59:01 +04:00
} while ( W_ERROR_EQUAL ( r . out . result , WERR_MORE_DATA ) ) ;
2004-12-12 03:22:30 +03:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " QueryMultipleValues failed " ) ;
2004-12-12 03:22:30 +03:00
2007-04-18 18:43:05 +04:00
return true ;
2004-12-12 03:22:30 +03:00
}
2007-10-06 00:45:16 +04:00
static bool test_QueryValue ( struct dcerpc_pipe * p ,
struct torture_context * tctx ,
struct policy_handle * handle ,
const char * valuename )
2004-12-09 01:02:49 +03:00
{
struct winreg_QueryValue r ;
NTSTATUS status ;
2006-04-30 17:54:03 +04:00
enum winreg_Type zero_type = 0 ;
2005-02-10 08:09:35 +03:00
uint32_t offered = 0xfff ;
2006-04-30 17:54:03 +04:00
uint32_t zero = 0 ;
2004-12-09 01:02:49 +03:00
r . in . handle = handle ;
2004-12-12 03:22:30 +03:00
r . in . data = NULL ;
2004-12-09 01:02:49 +03:00
r . in . value_name . name = valuename ;
2006-04-30 17:54:03 +04:00
r . in . type = & zero_type ;
2004-12-09 10:05:47 +03:00
r . in . size = & offered ;
r . in . length = & zero ;
2004-12-09 01:02:49 +03:00
2007-08-26 19:16:40 +04:00
status = dcerpc_winreg_QueryValue ( p , tctx , & r ) ;
if ( NT_STATUS_IS_ERR ( status ) ) {
torture_fail ( tctx , " QueryValue failed " ) ;
2004-12-09 01:02:49 +03:00
}
2007-08-26 19:16:40 +04:00
torture_assert_werr_ok ( tctx , r . out . result , " QueryValue failed " ) ;
2004-12-09 01:02:49 +03:00
2007-04-18 18:43:05 +04:00
return true ;
2004-12-09 01:02:49 +03:00
}
2007-08-26 19:16:40 +04:00
static bool test_EnumValue ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2007-10-06 00:45:16 +04:00
struct policy_handle * handle , int max_valnamelen ,
int max_valbufsize )
2003-12-12 14:49:29 +03:00
{
struct winreg_EnumValue r ;
2006-04-30 17:54:03 +04:00
enum winreg_Type type = 0 ;
2005-02-10 08:09:35 +03:00
uint32_t size = max_valbufsize , zero = 0 ;
2007-04-18 18:43:05 +04:00
bool ret = true ;
2004-12-09 10:52:00 +03:00
uint8_t buf8 ;
2005-08-17 05:25:58 +04:00
struct winreg_StringBuf name ;
2003-11-22 08:34:25 +03:00
2005-08-17 05:25:58 +04:00
name . name = " " ;
2005-11-02 04:01:17 +03:00
name . size = 1024 ;
2005-08-17 05:25:58 +04:00
2004-10-11 03:03:12 +04:00
r . in . handle = handle ;
r . in . enum_index = 0 ;
2005-08-17 05:25:58 +04:00
r . in . name = & name ;
r . out . name = & name ;
2004-10-11 03:03:12 +04:00
r . in . type = & type ;
2004-12-09 10:52:00 +03:00
r . in . value = & buf8 ;
r . in . length = & zero ;
r . in . size = & size ;
2007-10-06 00:45:16 +04:00
2003-11-22 08:34:25 +03:00
do {
2007-10-10 15:23:06 +04:00
torture_assert_ntstatus_ok ( tctx ,
2007-10-06 01:22:07 +04:00
dcerpc_winreg_EnumValue ( p , tctx , & r ) ,
" EnumValue failed " ) ;
2004-10-11 03:03:12 +04:00
2004-12-09 01:02:49 +03:00
if ( W_ERROR_IS_OK ( r . out . result ) ) {
2007-10-10 15:23:06 +04:00
ret & = test_QueryValue ( p , tctx , handle ,
r . out . name - > name ) ;
ret & = test_QueryMultipleValues ( p , tctx , handle ,
r . out . name - > name ) ;
2004-12-09 01:02:49 +03:00
}
2003-12-12 14:49:29 +03:00
r . in . enum_index + + ;
2003-11-22 08:34:25 +03:00
} while ( W_ERROR_IS_OK ( r . out . result ) ) ;
2004-04-13 01:59:41 +04:00
2007-08-26 19:16:40 +04:00
torture_assert_werr_equal ( tctx , r . out . result , WERR_NO_MORE_ITEMS ,
2007-10-06 01:22:07 +04:00
" EnumValue failed " ) ;
2004-10-11 03:03:12 +04:00
2004-12-09 01:02:49 +03:00
return ret ;
2003-11-22 08:34:25 +03:00
}
2007-10-06 00:45:16 +04:00
static bool test_AbortSystemShutdown ( struct dcerpc_pipe * p ,
struct torture_context * tctx )
2004-04-09 02:39:47 +04:00
{
2007-08-26 19:16:40 +04:00
struct winreg_AbortSystemShutdown r ;
uint16_t server = 0x0 ;
2004-04-09 02:39:47 +04:00
2007-08-26 19:16:40 +04:00
r . in . server = & server ;
2007-10-06 00:45:16 +04:00
torture_assert_ntstatus_ok ( tctx ,
dcerpc_winreg_AbortSystemShutdown ( p , tctx , & r ) ,
" AbortSystemShutdown failed " ) ;
2004-04-09 02:39:47 +04:00
2007-10-10 15:23:06 +04:00
torture_assert_werr_ok ( tctx , r . out . result ,
" AbortSystemShutdown failed " ) ;
2004-04-09 02:39:47 +04:00
2007-04-18 18:43:05 +04:00
return true ;
2004-04-09 02:39:47 +04:00
}
2007-10-06 00:45:16 +04:00
static bool test_InitiateSystemShutdown ( struct torture_context * tctx ,
2007-08-31 19:43:03 +04:00
struct dcerpc_pipe * p )
2004-12-13 14:00:24 +03:00
{
2007-08-26 19:16:40 +04:00
struct winreg_InitiateSystemShutdown r ;
2005-03-17 23:28:01 +03:00
uint16_t hostname = 0x0 ;
2007-08-26 19:16:40 +04:00
2005-03-17 23:28:01 +03:00
r . in . hostname = & hostname ;
2007-08-26 19:16:40 +04:00
r . in . message = talloc ( tctx , struct initshutdown_String ) ;
init_initshutdown_String ( tctx , r . in . message , " spottyfood " ) ;
2004-12-13 14:00:24 +03:00
r . in . force_apps = 1 ;
2007-08-26 19:16:40 +04:00
r . in . timeout = 30 ;
2004-12-13 14:00:24 +03:00
r . in . reboot = 1 ;
2007-10-06 00:45:16 +04:00
torture_assert_ntstatus_ok ( tctx ,
dcerpc_winreg_InitiateSystemShutdown ( p , tctx , & r ) ,
" InitiateSystemShutdown failed " ) ;
2004-12-13 14:00:24 +03:00
2007-10-10 15:23:06 +04:00
torture_assert_werr_ok ( tctx , r . out . result ,
" InitiateSystemShutdown failed " ) ;
2004-12-13 14:00:24 +03:00
2007-08-26 19:16:40 +04:00
return test_AbortSystemShutdown ( p , tctx ) ;
2004-12-13 14:00:24 +03:00
}
2007-08-26 19:16:40 +04:00
static bool test_InitiateSystemShutdownEx ( struct torture_context * tctx ,
2007-10-06 00:45:16 +04:00
struct dcerpc_pipe * p )
2004-04-09 02:39:47 +04:00
{
2007-08-26 19:16:40 +04:00
struct winreg_InitiateSystemShutdownEx r ;
uint16_t hostname = 0x0 ;
2004-04-09 02:39:47 +04:00
2007-08-26 19:16:40 +04:00
r . in . hostname = & hostname ;
r . in . message = talloc ( tctx , struct initshutdown_String ) ;
init_initshutdown_String ( tctx , r . in . message , " spottyfood " ) ;
r . in . force_apps = 1 ;
r . in . timeout = 30 ;
r . in . reboot = 1 ;
r . in . reason = 0 ;
2004-04-09 02:39:47 +04:00
2007-10-06 00:45:16 +04:00
torture_assert_ntstatus_ok ( tctx ,
2007-08-26 19:16:40 +04:00
dcerpc_winreg_InitiateSystemShutdownEx ( p , tctx , & r ) ,
" InitiateSystemShutdownEx failed " ) ;
2004-04-09 02:39:47 +04:00
2007-10-06 00:45:16 +04:00
torture_assert_werr_ok ( tctx , r . out . result ,
" InitiateSystemShutdownEx failed " ) ;
2004-04-09 02:39:47 +04:00
2007-08-26 19:16:40 +04:00
return test_AbortSystemShutdown ( p , tctx ) ;
2004-04-09 02:39:47 +04:00
}
2003-11-23 14:57:15 +03:00
# define MAX_DEPTH 2 /* Only go this far down the tree */
2003-11-23 09:31:10 +03:00
2007-10-06 00:45:16 +04:00
static bool test_key ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2003-11-23 14:57:15 +03:00
struct policy_handle * handle , int depth )
2003-11-23 09:31:10 +03:00
{
2003-11-23 14:57:15 +03:00
if ( depth = = MAX_DEPTH )
2007-04-18 18:43:05 +04:00
return true ;
2003-11-23 09:38:37 +03:00
2007-08-26 19:16:40 +04:00
if ( ! test_QueryInfoKey ( p , tctx , handle , NULL ) ) {
2003-11-23 09:31:10 +03:00
}
2007-08-26 19:16:40 +04:00
if ( ! test_NotifyChangeKeyValue ( p , tctx , handle ) ) {
2004-12-13 05:04:34 +03:00
}
2007-10-06 00:45:16 +04:00
2007-10-10 14:55:07 +04:00
if ( ! test_GetKeySecurity ( p , tctx , handle , NULL ) ) {
2004-12-12 02:28:48 +03:00
}
2007-08-26 19:16:40 +04:00
if ( ! test_EnumKey ( p , tctx , handle , depth ) ) {
2003-12-12 14:49:29 +03:00
}
2003-11-23 09:31:10 +03:00
2007-08-26 19:16:40 +04:00
if ( ! test_EnumValue ( p , tctx , handle , 0xFF , 0xFFFF ) ) {
2003-12-12 14:49:29 +03:00
}
2003-12-12 09:29:21 +03:00
2007-08-26 19:16:40 +04:00
test_CloseKey ( p , tctx , handle ) ;
2003-11-23 14:57:15 +03:00
2007-04-18 18:43:05 +04:00
return true ;
2003-11-23 14:57:15 +03:00
}
2005-08-24 15:01:10 +04:00
typedef NTSTATUS ( * winreg_open_fn ) ( struct dcerpc_pipe * , TALLOC_CTX * , void * ) ;
2003-11-23 14:57:15 +03:00
2007-10-06 00:45:16 +04:00
static bool test_Open ( struct torture_context * tctx , struct dcerpc_pipe * p ,
2007-08-26 19:16:40 +04:00
void * userdata )
2003-11-23 14:57:15 +03:00
{
2004-04-06 00:44:33 +04:00
struct policy_handle handle , newhandle ;
2007-04-18 18:43:05 +04:00
bool ret = true , created = false , created2 = false , deleted = false ;
2007-07-11 01:35:20 +04:00
bool created3 = false , created_subkey = false ;
2005-08-24 15:01:10 +04:00
struct winreg_OpenHKLM r ;
2007-10-10 15:56:47 +04:00
struct security_descriptor * sd = NULL ;
2003-11-23 14:57:15 +03:00
2007-08-26 19:16:40 +04:00
winreg_open_fn open_fn = userdata ;
2005-10-20 10:31:51 +04:00
2005-08-24 15:01:10 +04:00
r . in . system_name = 0 ;
2005-10-22 12:00:09 +04:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2005-08-24 15:01:10 +04:00
r . out . handle = & handle ;
2007-10-06 00:45:16 +04:00
torture_assert_ntstatus_ok ( tctx , open_fn ( p , tctx , & r ) ,
" open " ) ;
2003-11-23 14:57:15 +03:00
2007-08-26 19:16:40 +04:00
test_Cleanup ( p , tctx , & handle , TEST_KEY1 ) ;
test_Cleanup ( p , tctx , & handle , TEST_KEY2 ) ;
test_Cleanup ( p , tctx , & handle , TEST_SUBKEY ) ;
test_Cleanup ( p , tctx , & handle , TEST_KEY3 ) ;
test_Cleanup ( p , tctx , & handle , TEST_KEY_BASE ) ;
2005-08-24 15:01:10 +04:00
2007-08-26 19:16:40 +04:00
if ( ! test_CreateKey ( p , tctx , & handle , TEST_KEY1 , NULL ) ) {
2007-10-10 15:23:06 +04:00
torture_comment ( tctx ,
" CreateKey failed - not considering a failure \n " ) ;
2005-05-25 01:59:01 +04:00
} else {
2007-04-18 18:43:05 +04:00
created = true ;
2003-11-23 09:31:10 +03:00
}
2007-08-26 19:16:40 +04:00
if ( created & & ! test_FlushKey ( p , tctx , & handle ) ) {
torture_comment ( tctx , " FlushKey failed \n " ) ;
2007-04-18 18:43:05 +04:00
ret = false ;
2004-04-12 03:16:47 +04:00
}
2007-08-26 19:16:40 +04:00
if ( created & & ! test_OpenKey ( p , tctx , & handle , TEST_KEY1 , & newhandle ) )
2007-10-06 00:45:16 +04:00
torture_fail ( tctx ,
" CreateKey failed (OpenKey after Create didn't work) \n " ) ;
2004-04-06 00:44:33 +04:00
2007-08-26 19:16:40 +04:00
if ( created & & ! test_DeleteKey ( p , tctx , & handle , TEST_KEY1 ) ) {
torture_comment ( tctx , " DeleteKey failed \n " ) ;
2007-04-18 18:43:05 +04:00
ret = false ;
2005-05-25 01:59:01 +04:00
} else {
2007-04-18 18:43:05 +04:00
deleted = true ;
2003-11-23 14:57:15 +03:00
}
2007-08-26 19:16:40 +04:00
if ( created & & ! test_FlushKey ( p , tctx , & handle ) ) {
torture_comment ( tctx , " FlushKey failed \n " ) ;
2007-04-18 18:43:05 +04:00
ret = false ;
2004-04-12 03:16:47 +04:00
}
2007-10-06 00:45:16 +04:00
if ( created & & deleted & &
2007-08-26 19:16:40 +04:00
test_OpenKey ( p , tctx , & handle , TEST_KEY1 , & newhandle ) ) {
2007-10-06 00:45:16 +04:00
torture_comment ( tctx ,
" DeleteKey failed (OpenKey after Delete worked) \n " ) ;
2007-04-18 18:43:05 +04:00
ret = false ;
2004-04-06 00:44:33 +04:00
}
2007-08-26 19:16:40 +04:00
if ( ! test_GetVersion ( p , tctx , & handle ) ) {
torture_comment ( tctx , " GetVersion failed \n " ) ;
2007-04-18 18:43:05 +04:00
ret = false ;
2004-04-09 02:39:47 +04:00
}
2007-10-06 00:45:16 +04:00
if ( created & & test_CreateKey_sd ( p , tctx , & handle , TEST_KEY2 ,
NULL , & newhandle ) ) {
2007-04-18 18:43:05 +04:00
created2 = true ;
2005-08-24 15:01:10 +04:00
}
2007-10-10 15:56:47 +04:00
if ( created2 & & ! test_GetKeySecurity ( p , tctx , & newhandle , & sd ) ) {
2005-08-24 15:01:10 +04:00
printf ( " GetKeySecurity failed \n " ) ;
2007-04-18 18:43:05 +04:00
ret = false ;
2005-08-24 15:01:10 +04:00
}
2007-10-10 15:56:47 +04:00
if ( created2 & & sd & & ! test_SetKeySecurity ( p , tctx , & newhandle , sd ) ) {
printf ( " SetKeySecurity failed \n " ) ;
ret = false ;
}
2007-08-26 19:16:40 +04:00
if ( created2 & & ! test_CloseKey ( p , tctx , & newhandle ) ) {
2005-08-24 15:01:10 +04:00
printf ( " CloseKey failed \n " ) ;
2007-04-18 18:43:05 +04:00
ret = false ;
2005-08-24 15:01:10 +04:00
}
2007-08-26 19:16:40 +04:00
if ( created & & ! test_DeleteKey ( p , tctx , & handle , TEST_KEY2 ) ) {
2005-08-24 15:01:10 +04:00
printf ( " DeleteKey failed \n " ) ;
2007-04-18 18:43:05 +04:00
ret = false ;
2005-08-24 15:01:10 +04:00
}
2007-08-26 19:16:40 +04:00
if ( created & & test_CreateKey ( p , tctx , & handle , TEST_KEY3 , NULL ) ) {
2007-07-11 01:35:20 +04:00
created3 = true ;
}
2007-10-06 00:45:16 +04:00
if ( created3 & &
2007-10-10 15:23:06 +04:00
test_CreateKey ( p , tctx , & handle , TEST_SUBKEY , NULL ) ) {
2007-07-11 01:35:20 +04:00
created_subkey = true ;
}
2007-10-06 00:45:16 +04:00
if ( created_subkey & &
2007-10-10 15:23:06 +04:00
! test_DeleteKeyWithSubkey ( p , tctx , & handle , TEST_KEY3 ) ) {
2007-07-11 01:35:20 +04:00
printf ( " DeleteKeyWithSubkey failed "
" (DeleteKey didn't return ACCESS_DENIED) \n " ) ;
ret = false ;
}
2007-10-06 00:45:16 +04:00
if ( created_subkey & &
2007-10-10 15:23:06 +04:00
! test_DeleteKey ( p , tctx , & handle , TEST_SUBKEY ) ) {
2007-07-11 01:35:20 +04:00
printf ( " DeleteKey failed \n " ) ;
ret = false ;
}
if ( created3 & &
2007-10-10 15:23:06 +04:00
! test_DeleteKey ( p , tctx , & handle , TEST_KEY3 ) ) {
2007-07-11 01:35:20 +04:00
printf ( " DeleteKey failed \n " ) ;
ret = false ;
}
2003-11-23 14:57:15 +03:00
/* The HKCR hive has a very large fanout */
2005-08-24 15:01:10 +04:00
if ( open_fn = = ( void * ) dcerpc_winreg_OpenHKCR ) {
2007-08-26 19:16:40 +04:00
if ( ! test_key ( p , tctx , & handle , MAX_DEPTH - 1 ) ) {
2007-04-18 18:43:05 +04:00
ret = false ;
2004-04-05 17:50:45 +04:00
}
}
2003-11-23 14:57:15 +03:00
2007-10-10 15:23:06 +04:00
if ( ! test_key ( p , tctx , & handle , 0 ) ) {
2007-04-18 18:43:05 +04:00
ret = false ;
2004-04-05 17:50:45 +04:00
}
2007-08-26 19:16:40 +04:00
test_Cleanup ( p , tctx , & handle , TEST_KEY_BASE ) ;
2005-08-24 15:12:16 +04:00
2004-04-05 17:50:45 +04:00
return ret ;
2003-11-23 09:31:10 +03:00
}
2003-11-22 08:34:25 +03:00
2007-08-26 19:16:40 +04:00
struct torture_suite * torture_rpc_winreg ( TALLOC_CTX * mem_ctx )
2003-11-21 08:28:36 +03:00
{
2005-10-20 10:31:51 +04:00
struct {
const char * name ;
winreg_open_fn fn ;
} open_fns [ ] = { { " OpenHKLM " , ( winreg_open_fn ) dcerpc_winreg_OpenHKLM } ,
{ " OpenHKU " , ( winreg_open_fn ) dcerpc_winreg_OpenHKU } ,
{ " OpenHKCR " , ( winreg_open_fn ) dcerpc_winreg_OpenHKCR } ,
{ " OpenHKCU " , ( winreg_open_fn ) dcerpc_winreg_OpenHKCU } } ;
2003-11-22 08:34:25 +03:00
int i ;
2007-08-28 20:24:18 +04:00
struct torture_rpc_tcase * tcase ;
2007-08-26 19:16:40 +04:00
struct torture_suite * suite = torture_suite_create ( mem_ctx , " WINREG " ) ;
2007-08-31 19:43:03 +04:00
struct torture_test * test ;
2003-11-21 08:28:36 +03:00
2007-10-06 00:45:16 +04:00
tcase = torture_suite_add_rpc_iface_tcase ( suite , " winreg " ,
2007-08-31 19:43:03 +04:00
& ndr_table_winreg ) ;
2003-11-23 09:31:10 +03:00
2007-10-06 00:45:16 +04:00
test = torture_rpc_tcase_add_test ( tcase , " InitiateSystemShutdown " ,
2007-08-31 19:43:03 +04:00
test_InitiateSystemShutdown ) ;
test - > dangerous = true ;
2003-11-21 08:28:36 +03:00
2007-10-06 00:45:16 +04:00
test = torture_rpc_tcase_add_test ( tcase , " InitiateSystemShutdownEx " ,
2007-08-31 19:43:03 +04:00
test_InitiateSystemShutdownEx ) ;
test - > dangerous = true ;
2004-04-11 20:04:06 +04:00
2003-11-22 08:34:25 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( open_fns ) ; i + + ) {
2007-10-06 00:45:16 +04:00
torture_rpc_tcase_add_test_ex ( tcase , open_fns [ i ] . name ,
test_Open , open_fns [ i ] . fn ) ;
2003-11-21 08:28:36 +03:00
}
2007-08-26 19:16:40 +04:00
return suite ;
2003-11-21 08:28:36 +03:00
}