Author: tpot Date: 2004-10-04 06:29:06 +0000 (Mon, 04 Oct 2004) New Revision: 2817
WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source&rev=2817&nolog=1 Log: Get winreg_GetKeySecurity() working but use data blob instead of security descriptor. Modified: branches/SAMBA_4_0/source/librpc/idl/winreg.idl branches/SAMBA_4_0/source/scripting/swig/torture/winreg.py Changeset: Modified: branches/SAMBA_4_0/source/librpc/idl/winreg.idl =================================================================== --- branches/SAMBA_4_0/source/librpc/idl/winreg.idl 2004-10-04 05:40:59 UTC (rev 2816) +++ branches/SAMBA_4_0/source/librpc/idl/winreg.idl 2004-10-04 06:29:06 UTC (rev 2817) @@ -168,17 +168,24 @@ [in,ref] policy_handle *handle ); + typedef struct { + uint32 max_len; + uint32 offset; + uint32 len; + } KeySecuritySize; + + typedef struct { + uint32 max_len; + DATA_BLOB data; + } KeySecurityData; + /******************/ /* Function: 0x0c */ WERROR winreg_GetKeySecurity( [in,ref] policy_handle *handle, - [in] uint32 sec_info, - [in] uint32 *len1, - [in] uint32 empty, - [in] uint32 len2, - [in] uint32 unknown1, - [in] uint32 unknown2, - [out] sec_desc_buf *data + [in] uint32 unknown, + [in,out] KeySecuritySize *size, + [in,out] KeySecurityData data ); /******************/ Modified: branches/SAMBA_4_0/source/scripting/swig/torture/winreg.py =================================================================== --- branches/SAMBA_4_0/source/scripting/swig/torture/winreg.py 2004-10-04 05:40:59 UTC (rev 2816) +++ branches/SAMBA_4_0/source/scripting/swig/torture/winreg.py 2004-10-04 06:29:06 UTC (rev 2817) @@ -30,8 +30,50 @@ dcerpc.winreg_CloseKey(pipe, r) -def test_Enum(pipe, handle, name, depth = 0): +def test_FlushKey(pipe, handle): + r = {} + r['handle'] = handle + + dcerpc.winreg_FlushKey(pipe, r) + +def test_GetVersion(pipe, handle): + + r = {} + r['handle'] = handle + + dcerpc.winreg_GetVersion(pipe, r) + +def test_GetKeySecurity(pipe, handle): + + r = {} + r['handle'] = handle + r['unknown'] = 4 + r['size'] = None + r['data'] = {} + r['data']['max_len'] = 0 + r['data']['data'] = '' + + result = dcerpc.winreg_GetKeySecurity(pipe, r) + + print result + + if result['result'] == dcerpc.WERR_INSUFFICIENT_BUFFER: + r['size'] = {} + r['size']['max_len'] = result['data']['max_len'] + r['size']['offset'] = 0 + r['size']['len'] = result['data']['max_len'] + + result = dcerpc.winreg_GetKeySecurity(pipe, r) + + print result + + sys.exit(1) + +def test_Key(pipe, handle, name, depth = 0): + + # Don't descend too far. Registries can be very deep. + if depth > 2: return @@ -41,10 +83,41 @@ if arg[0] == dcerpc.WERR_ACCESS_DENIED: return - # Enumerate keys + test_GetVersion(pipe, handle) + test_FlushKey(pipe, handle) + + test_GetKeySecurity(pipe, handle) + + # Enumerate values in this key + r = {} r['handle'] = handle + r['name_in'] = {} + r['name_in']['len'] = 0 + r['name_in']['max_len'] = (keyinfo['max_valnamelen'] + 1) * 2 + r['name_in']['buffer'] = {} + r['name_in']['buffer']['max_len'] = keyinfo['max_valnamelen'] + 1 + r['name_in']['buffer']['offset'] = 0 + r['name_in']['buffer']['len'] = 0 + r['type'] = 0 + r['value_in'] = {} + r['value_in']['max_len'] = keyinfo['max_valbufsize'] + r['value_in']['offset'] = 0 + r['value_in']['len'] = 0 + r['value_len1'] = keyinfo['max_valbufsize'] + r['value_len2'] = 0 + + for i in range(0, keyinfo['num_values']): + + r['enum_index'] = i + + dcerpc.winreg_EnumValue(pipe, r) + + # Recursively test subkeys of this key + + r = {} + r['handle'] = handle r['key_name_len'] = 0 r['unknown'] = 0x0414 r['in_name'] = {} @@ -72,41 +145,13 @@ result = dcerpc.winreg_OpenKey(pipe, s) - test_Enum(pipe, result['handle'], name + '/' + s['keyname']['name'], - depth + 1) + test_Key(pipe, result['handle'], name + '/' + s['keyname']['name'], + depth + 1) test_CloseKey(pipe, result['handle']) # Enumerate values - r = {} - r['handle'] = handle - - r['name_in'] = {} - r['name_in']['len'] = 0 - r['name_in']['max_len'] = (keyinfo['max_valnamelen'] + 1) * 2 - r['name_in']['buffer'] = {} - r['name_in']['buffer']['max_len'] = keyinfo['max_valnamelen'] + 1 - r['name_in']['buffer']['offset'] = 0 - r['name_in']['buffer']['len'] = 0 - r['type'] = 0 - r['value_in'] = {} - r['value_in']['max_len'] = keyinfo['max_valbufsize'] - r['value_in']['offset'] = 0 - r['value_in']['len'] = 0 - r['value_len1'] = keyinfo['max_valbufsize'] - r['value_len2'] = 0 - - for i in range(0, keyinfo['num_values']): - - r['enum_index'] = i - - dcerpc.winreg_EnumValue(pipe, r) - -def test_Key(pipe, handle, name): - - test_Enum(pipe, handle, name) - def runtests(binding, domain, username, password): print 'Testing WINREG pipe'