diff options
-rw-r--r-- | source4/librpc/idl/samr.idl | 27 | ||||
-rw-r--r-- | source4/torture/rpc/samr.c | 20 |
2 files changed, 26 insertions, 21 deletions
diff --git a/source4/librpc/idl/samr.idl b/source4/librpc/idl/samr.idl index 92b7a3fa91..0e1bdd3b9f 100644 --- a/source4/librpc/idl/samr.idl +++ b/source4/librpc/idl/samr.idl @@ -1077,6 +1077,7 @@ /* Function 0x3d */ NTSTATUS samr_Connect3( [in] unistr *system_name, + /* this unknown value seems to be completely ignored by w2k3 */ [in] uint32 unknown, [in] uint32 access_mask, [out,ref] policy_handle *handle @@ -1108,18 +1109,22 @@ /************************/ /* Function 0x40 */ + + typedef struct { + uint32 unknown1; /* w2k3 gives 3 */ + uint32 unknown2; /* w2k3 gives 0 */ + } samr_ConnectInfo1; + + typedef union { + [case(1)] samr_ConnectInfo1 info1; + } samr_ConnectInfo; + NTSTATUS samr_Connect5( - [in] unistr *system_name, - [in] uint32 access_mask, - [in] uint32 unknown0, - [in] uint32 unknown1, - [in] uint32 unknown2, - [in] uint32 unknown3, - [out] uint32 unknown4, - [out] uint32 unknown5, - [out] uint32 unknown6, - [out] uint32 unknown7, - [out,ref] policy_handle *handle + [in] unistr *system_name, + [in] uint32 access_mask, + [in,out] uint32 level, + [in,out,switch_is(level),ref] samr_ConnectInfo *info, + [out,ref] policy_handle *handle ); /************************/ diff --git a/source4/torture/rpc/samr.c b/source4/torture/rpc/samr.c index 12639de688..a41ac16a99 100644 --- a/source4/torture/rpc/samr.c +++ b/source4/torture/rpc/samr.c @@ -2594,6 +2594,7 @@ static BOOL test_Connect(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct samr_Connect3 r3; struct samr_Connect4 r4; struct samr_Connect5 r5; + union samr_ConnectInfo info; BOOL ret = True; printf("testing samr_Connect\n"); @@ -2610,7 +2611,7 @@ static BOOL test_Connect(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("testing samr_Connect2\n"); - r2.in.system_name = ""; + r2.in.system_name = NULL; r2.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; r2.out.handle = handle; @@ -2622,7 +2623,7 @@ static BOOL test_Connect(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("testing samr_Connect3\n"); - r3.in.system_name = ""; + r3.in.system_name = NULL; r3.in.unknown = 0; r3.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; r3.out.handle = handle; @@ -2648,21 +2649,20 @@ static BOOL test_Connect(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("testing samr_Connect5\n"); + info.info1.unknown1 = 0; + info.info1.unknown2 = 0; + r5.in.system_name = ""; r5.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; - r5.in.unknown0 = 1; /*Magic values I took from a WinXP pro workstation */ - r5.in.unknown1 = 1; /*tests failed with NT_STATUS_NET_WRITE_FAULT if */ - r5.in.unknown2 = 3; /*unknown0 and unknown1 where something other than 1 */ - r5.in.unknown3 = 0; /*unkown2 and unknown3 could be varied and had no effect */ + r5.in.level = 1; + r5.in.info = &info; + r5.out.info = &info; r5.out.handle = handle; status = dcerpc_samr_Connect5(p, mem_ctx, &r5); if (!NT_STATUS_IS_OK(status)) { - /*This fails for a Win2000pro machine, but succeeds for - WinXPpro -- Kai - */ printf("Connect5 failed - %s\n", nt_errstr(status)); - /*ret = False; Should this test fail? */ + ret = False; } return ret; |