rpcrt4: Fix ndr_marshall tests to cope with using pointer ids instead of using pointer values.
This fixes a number of test failures on XP SP3 and Win2003 upwards.
This commit is contained in:
parent
36def4af0c
commit
c9ef063e12
|
@ -97,6 +97,41 @@ static const RPC_SERVER_INTERFACE IFoo___RpcServerInterface =
|
|||
};
|
||||
|
||||
static RPC_IF_HANDLE IFoo_v0_0_s_ifspec = (RPC_IF_HANDLE)& IFoo___RpcServerInterface;
|
||||
static BOOL use_pointer_ids = FALSE;
|
||||
|
||||
static void determine_pointer_marshalling_style(void)
|
||||
{
|
||||
RPC_MESSAGE RpcMessage;
|
||||
MIDL_STUB_MESSAGE StubMsg;
|
||||
MIDL_STUB_DESC StubDesc;
|
||||
char ch = 0xde;
|
||||
|
||||
static const unsigned char fmtstr_up_char[] =
|
||||
{
|
||||
0x12, 0x8, /* FC_UP [simple_pointer] */
|
||||
0x2, /* FC_CHAR */
|
||||
0x5c, /* FC_PAD */
|
||||
};
|
||||
|
||||
StubDesc = Object_StubDesc;
|
||||
StubDesc.pFormatTypes = NULL;
|
||||
|
||||
NdrClientInitializeNew(
|
||||
&RpcMessage,
|
||||
&StubMsg,
|
||||
&StubDesc,
|
||||
0);
|
||||
|
||||
StubMsg.BufferLength = 8;
|
||||
StubMsg.RpcMsg->Buffer = StubMsg.BufferStart = StubMsg.Buffer = HeapAlloc(GetProcessHeap(), 0, StubMsg.BufferLength);
|
||||
NdrPointerMarshall(&StubMsg, (unsigned char*)&ch, fmtstr_up_char);
|
||||
ok(StubMsg.Buffer == StubMsg.BufferStart + 5, "%p %p\n", StubMsg.Buffer, StubMsg.BufferStart);
|
||||
|
||||
use_pointer_ids = (*(unsigned int *)StubMsg.BufferStart != (unsigned int)&ch);
|
||||
trace("Pointer marshalling using %s\n", use_pointer_ids ? "pointer ids" : "pointer value");
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, StubMsg.BufferStart);
|
||||
}
|
||||
|
||||
static void test_ndr_simple_type(void)
|
||||
{
|
||||
|
@ -423,8 +458,11 @@ static void test_simple_types(void)
|
|||
|
||||
ch = 0xa5;
|
||||
ch_ptr = &ch;
|
||||
*(void**)wiredata = ch_ptr;
|
||||
wiredata[sizeof(void*)] = ch;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)ch_ptr;
|
||||
wiredata[4] = ch;
|
||||
|
||||
test_pointer_marshal(fmtstr_up_char, ch_ptr, 1, wiredata, 5, NULL, 0, "up_char");
|
||||
test_pointer_marshal(fmtstr_up_byte, ch_ptr, 1, wiredata, 5, NULL, 0, "up_byte");
|
||||
|
@ -437,21 +475,30 @@ static void test_simple_types(void)
|
|||
test_pointer_marshal(fmtstr_rpup_char2, ch_ptr, 1, wiredata, 5, NULL, 0, "rpup_char2");
|
||||
|
||||
s = 0xa597;
|
||||
*(void**)wiredata = &s;
|
||||
*(unsigned short*)(wiredata + sizeof(void*)) = s;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)&s;
|
||||
*(unsigned short*)(wiredata + 4) = s;
|
||||
|
||||
test_pointer_marshal(fmtstr_up_wchar, &s, 2, wiredata, 6, NULL, 0, "up_wchar");
|
||||
test_pointer_marshal(fmtstr_up_short, &s, 2, wiredata, 6, NULL, 0, "up_short");
|
||||
test_pointer_marshal(fmtstr_up_ushort, &s, 2, wiredata, 6, NULL, 0, "up_ushort");
|
||||
|
||||
i = 0x7fff;
|
||||
*(void**)wiredata = &i;
|
||||
*(unsigned short*)(wiredata + sizeof(void*)) = i;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)&i;
|
||||
*(unsigned short*)(wiredata + 4) = i;
|
||||
test_pointer_marshal(fmtstr_up_enum16, &i, 2, wiredata, 6, NULL, 0, "up_enum16");
|
||||
|
||||
l = 0xcafebabe;
|
||||
*(void**)wiredata = &l;
|
||||
*(unsigned long*)(wiredata + sizeof(void*)) = l;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)&l;
|
||||
*(unsigned long*)(wiredata + 4) = l;
|
||||
|
||||
test_pointer_marshal(fmtstr_up_long, &l, 4, wiredata, 8, NULL, 0, "up_long");
|
||||
test_pointer_marshal(fmtstr_up_ulong, &l, 4, wiredata, 8, NULL, 0, "up_ulong");
|
||||
|
@ -459,20 +506,29 @@ static void test_simple_types(void)
|
|||
test_pointer_marshal(fmtstr_up_errorstatus, &l, 4, wiredata, 8, NULL, 0, "up_errorstatus");
|
||||
|
||||
ll = ((ULONGLONG)0xcafebabe) << 32 | 0xdeadbeef;
|
||||
*(void**)wiredata = ≪
|
||||
*(void**)(wiredata + sizeof(void*)) = NULL;
|
||||
*(ULONGLONG*)(wiredata + 2 * sizeof(void*)) = ll;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)≪
|
||||
*(unsigned int **)(wiredata + 4) = 0;
|
||||
*(ULONGLONG*)(wiredata + 8) = ll;
|
||||
test_pointer_marshal(fmtstr_up_longlong, &ll, 8, wiredata, 16, NULL, 0, "up_longlong");
|
||||
|
||||
f = 3.1415f;
|
||||
*(void**)wiredata = &f;
|
||||
*(float*)(wiredata + sizeof(void*)) = f;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)&f;
|
||||
*(float*)(wiredata + 4) = f;
|
||||
test_pointer_marshal(fmtstr_up_float, &f, 4, wiredata, 8, NULL, 0, "up_float");
|
||||
|
||||
d = 3.1415;
|
||||
*(void**)wiredata = &d;
|
||||
*(void**)(wiredata + sizeof(void*)) = NULL;
|
||||
*(double*)(wiredata + 2 * sizeof(void*)) = d;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)&d;
|
||||
*(unsigned int *)(wiredata + 4) = 0;
|
||||
*(double*)(wiredata + 8) = d;
|
||||
test_pointer_marshal(fmtstr_up_double, &d, 8, wiredata, 16, NULL, 0, "up_double");
|
||||
|
||||
}
|
||||
|
@ -888,7 +944,10 @@ static void test_simple_struct(void)
|
|||
memcpy(wiredata, &s1, wiredatalen);
|
||||
test_simple_struct_marshal(fmtstr_simple_struct + 4, &s1, 24, wiredata, 24, NULL, 0, "struct");
|
||||
|
||||
*(void**)wiredata = &s1;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)&s1;
|
||||
memcpy(wiredata + 4, &s1, wiredatalen);
|
||||
if (0)
|
||||
{
|
||||
|
@ -905,12 +964,25 @@ static void test_simple_struct(void)
|
|||
ps1.pl1 = &l;
|
||||
c = 'a';
|
||||
ps1.pc1 = &c;
|
||||
memcpy(wiredata + 4, &ps1, 12);
|
||||
*(unsigned int *)(wiredata + 4) = 0xdeadbeef;
|
||||
if (use_pointer_ids)
|
||||
{
|
||||
*(unsigned int *)(wiredata + 8) = 0x20000;
|
||||
*(unsigned int *)(wiredata + 12) = 0x20004;
|
||||
}
|
||||
else
|
||||
{
|
||||
*(unsigned int *)(wiredata + 8) = (unsigned int)&l;
|
||||
*(unsigned int *)(wiredata + 12) = (unsigned int)&c;
|
||||
}
|
||||
memcpy(wiredata + 16, &l, 4);
|
||||
memcpy(wiredata + 20, &c, 1);
|
||||
|
||||
test_simple_struct_marshal(fmtstr_pointer_struct + 4, &ps1, 17, wiredata + 4, 17, ps1_cmp, 2, "pointer_struct");
|
||||
*(void**)wiredata = &ps1;
|
||||
if (use_pointer_ids)
|
||||
*(unsigned int *)wiredata = 0x20000;
|
||||
else
|
||||
*(unsigned int *)wiredata = (unsigned int)&ps1;
|
||||
if (0)
|
||||
{
|
||||
/* one of the unmarshallings crashes Wine */
|
||||
|
@ -1823,6 +1895,8 @@ static void test_NdrMapCommAndFaultStatus(void)
|
|||
|
||||
START_TEST( ndr_marshall )
|
||||
{
|
||||
determine_pointer_marshalling_style();
|
||||
|
||||
test_ndr_simple_type();
|
||||
test_simple_types();
|
||||
test_nontrivial_pointer_types();
|
||||
|
|
Loading…
Reference in New Issue