Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
3243ee7e
Commit
3243ee7e
authored
Apr 05, 2010
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rpcrt4: Add support for complex arrays in the generic array marshalling functions.
parent
c1a9dc8a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
72 additions
and
49 deletions
+72
-49
ndr_marshall.c
dlls/rpcrt4/ndr_marshall.c
+72
-49
No files found.
dlls/rpcrt4/ndr_marshall.c
View file @
3243ee7e
...
...
@@ -139,6 +139,27 @@ static void WINAPI NdrRangeFree(PMIDL_STUB_MESSAGE, unsigned char *, PFORMAT_STR
static
ULONG
WINAPI
NdrByteCountPointerMemorySize
(
PMIDL_STUB_MESSAGE
,
PFORMAT_STRING
);
static
unsigned
char
*
ComplexBufferSize
(
PMIDL_STUB_MESSAGE
pStubMsg
,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
,
PFORMAT_STRING
pPointer
);
static
unsigned
char
*
ComplexMarshall
(
PMIDL_STUB_MESSAGE
pStubMsg
,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
,
PFORMAT_STRING
pPointer
);
static
unsigned
char
*
ComplexUnmarshall
(
PMIDL_STUB_MESSAGE
pStubMsg
,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
,
PFORMAT_STRING
pPointer
,
unsigned
char
fMustAlloc
);
static
ULONG
ComplexStructMemorySize
(
PMIDL_STUB_MESSAGE
pStubMsg
,
PFORMAT_STRING
pFormat
,
PFORMAT_STRING
pPointer
);
static
unsigned
char
*
ComplexFree
(
PMIDL_STUB_MESSAGE
pStubMsg
,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
,
PFORMAT_STRING
pPointer
);
const
NDR_MARSHALL
NdrMarshaller
[
NDR_TABLE_SIZE
]
=
{
0
,
NdrBaseTypeMarshall
,
NdrBaseTypeMarshall
,
NdrBaseTypeMarshall
,
...
...
@@ -1777,6 +1798,8 @@ static inline void array_compute_and_size_conformance(
unsigned
char
fc
,
PMIDL_STUB_MESSAGE
pStubMsg
,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
)
{
DWORD
count
;
switch
(
fc
)
{
case
RPC_FC_CARRAY
:
...
...
@@ -1808,6 +1831,13 @@ static inline void array_compute_and_size_conformance(
SizeConformance
(
pStubMsg
);
break
;
case
RPC_FC_BOGUS_ARRAY
:
count
=
*
(
const
WORD
*
)(
pFormat
+
2
);
pFormat
+=
4
;
if
(
IsConformanceOrVariancePresent
(
pFormat
))
SizeConformance
(
pStubMsg
);
pFormat
=
ComputeConformance
(
pStubMsg
,
pMemory
,
pFormat
,
count
);
pFormat
=
ComputeVariance
(
pStubMsg
,
pMemory
,
pFormat
,
pStubMsg
->
MaxCount
);
break
;
default:
ERR
(
"unknown array format 0x%x
\n
"
,
fc
);
RpcRaiseException
(
RPC_X_BAD_STUB_DATA
);
...
...
@@ -1818,7 +1848,7 @@ static inline void array_buffer_size(
unsigned
char
fc
,
PMIDL_STUB_MESSAGE
pStubMsg
,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
,
unsigned
char
fHasPointers
)
{
DWORD
size
;
DWORD
i
,
size
;
DWORD
esize
;
unsigned
char
alignment
;
...
...
@@ -1868,6 +1898,18 @@ static inline void array_buffer_size(
size
=
safe_multiply
(
esize
,
pStubMsg
->
ActualCount
);
safe_buffer_length_increment
(
pStubMsg
,
size
);
break
;
case
RPC_FC_BOGUS_ARRAY
:
alignment
=
pFormat
[
1
]
+
1
;
pFormat
=
SkipConformance
(
pStubMsg
,
pFormat
+
4
);
if
(
IsConformanceOrVariancePresent
(
pFormat
))
SizeVariance
(
pStubMsg
);
pFormat
=
SkipVariance
(
pStubMsg
,
pFormat
);
align_length
(
&
pStubMsg
->
BufferLength
,
alignment
);
size
=
pStubMsg
->
ActualCount
;
for
(
i
=
0
;
i
<
size
;
i
++
)
pMemory
=
ComplexBufferSize
(
pStubMsg
,
pMemory
,
pFormat
,
NULL
);
break
;
default:
ERR
(
"unknown array format 0x%x
\n
"
,
fc
);
RpcRaiseException
(
RPC_X_BAD_STUB_DATA
);
...
...
@@ -1878,6 +1920,9 @@ static inline void array_compute_and_write_conformance(
unsigned
char
fc
,
PMIDL_STUB_MESSAGE
pStubMsg
,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
)
{
ULONG
def
;
BOOL
conformance_present
;
switch
(
fc
)
{
case
RPC_FC_CARRAY
:
...
...
@@ -1908,6 +1953,14 @@ static inline void array_compute_and_write_conformance(
pStubMsg
->
Offset
=
0
;
WriteConformance
(
pStubMsg
);
break
;
case
RPC_FC_BOGUS_ARRAY
:
def
=
*
(
const
WORD
*
)(
pFormat
+
2
);
pFormat
+=
4
;
conformance_present
=
IsConformanceOrVariancePresent
(
pFormat
);
pFormat
=
ComputeConformance
(
pStubMsg
,
pMemory
,
pFormat
,
def
);
pFormat
=
ComputeVariance
(
pStubMsg
,
pMemory
,
pFormat
,
pStubMsg
->
MaxCount
);
if
(
conformance_present
)
WriteConformance
(
pStubMsg
);
break
;
default:
ERR
(
"unknown array format 0x%x
\n
"
,
fc
);
RpcRaiseException
(
RPC_X_BAD_STUB_DATA
);
...
...
@@ -1918,7 +1971,7 @@ static inline void array_write_variance_and_marshall(
unsigned
char
fc
,
PMIDL_STUB_MESSAGE
pStubMsg
,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
,
unsigned
char
fHasPointers
)
{
DWORD
size
;
DWORD
i
,
size
;
DWORD
esize
;
unsigned
char
alignment
;
...
...
@@ -1972,6 +2025,18 @@ static inline void array_write_variance_and_marshall(
size
=
safe_multiply
(
esize
,
pStubMsg
->
ActualCount
);
safe_copy_to_buffer
(
pStubMsg
,
pMemory
,
size
);
/* the string itself */
break
;
case
RPC_FC_BOGUS_ARRAY
:
alignment
=
pFormat
[
1
]
+
1
;
pFormat
=
SkipConformance
(
pStubMsg
,
pFormat
+
4
);
if
(
IsConformanceOrVariancePresent
(
pFormat
))
WriteVariance
(
pStubMsg
);
pFormat
=
SkipVariance
(
pStubMsg
,
pFormat
);
align_pointer_clear
(
&
pStubMsg
->
Buffer
,
alignment
);
size
=
pStubMsg
->
ActualCount
;
for
(
i
=
0
;
i
<
size
;
i
++
)
pMemory
=
ComplexMarshall
(
pStubMsg
,
pMemory
,
pFormat
,
NULL
);
break
;
default:
ERR
(
"unknown array format 0x%x
\n
"
,
fc
);
RpcRaiseException
(
RPC_X_BAD_STUB_DATA
);
...
...
@@ -3920,9 +3985,6 @@ unsigned char * WINAPI NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
)
{
ULONG
i
,
count
,
def
;
BOOL
variance_present
;
unsigned
char
alignment
;
int
pointer_buffer_mark_set
=
0
;
TRACE
(
"(%p,%p,%p)
\n
"
,
pStubMsg
,
pMemory
,
pFormat
);
...
...
@@ -3934,8 +3996,6 @@ unsigned char * WINAPI NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
return
NULL
;
}
alignment
=
pFormat
[
1
]
+
1
;
if
(
!
pStubMsg
->
PointerBufferMark
)
{
/* save buffer fields that may be changed by buffer sizer functions
...
...
@@ -3965,25 +4025,9 @@ unsigned char * WINAPI NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
pStubMsg
->
BufferLength
=
saved_buffer_length
;
}
def
=
*
(
const
WORD
*
)
&
pFormat
[
2
];
pFormat
+=
4
;
pFormat
=
ComputeConformance
(
pStubMsg
,
pMemory
,
pFormat
,
def
);
TRACE
(
"conformance = %ld
\n
"
,
pStubMsg
->
MaxCount
);
variance_present
=
IsConformanceOrVariancePresent
(
pFormat
);
pFormat
=
ComputeVariance
(
pStubMsg
,
pMemory
,
pFormat
,
pStubMsg
->
MaxCount
);
TRACE
(
"variance = %d
\n
"
,
pStubMsg
->
ActualCount
);
WriteConformance
(
pStubMsg
);
if
(
variance_present
)
WriteVariance
(
pStubMsg
);
align_pointer_clear
(
&
pStubMsg
->
Buffer
,
alignment
);
count
=
pStubMsg
->
ActualCount
;
for
(
i
=
0
;
i
<
count
;
i
++
)
pMemory
=
ComplexMarshall
(
pStubMsg
,
pMemory
,
pFormat
,
NULL
);
array_compute_and_write_conformance
(
RPC_FC_BOGUS_ARRAY
,
pStubMsg
,
pMemory
,
pFormat
);
array_write_variance_and_marshall
(
RPC_FC_BOGUS_ARRAY
,
pStubMsg
,
pMemory
,
pFormat
,
TRUE
/* fHasPointers */
);
STD_OVERFLOW_CHECK
(
pStubMsg
);
...
...
@@ -4076,9 +4120,6 @@ void WINAPI NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
unsigned
char
*
pMemory
,
PFORMAT_STRING
pFormat
)
{
ULONG
i
,
count
,
def
;
unsigned
char
alignment
;
BOOL
variance_present
;
int
pointer_length_set
=
0
;
TRACE
(
"(%p,%p,%p)
\n
"
,
pStubMsg
,
pMemory
,
pFormat
);
...
...
@@ -4090,8 +4131,6 @@ void WINAPI NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
return
;
}
alignment
=
pFormat
[
1
]
+
1
;
if
(
!
pStubMsg
->
IgnoreEmbeddedPointers
&&
!
pStubMsg
->
PointerLength
)
{
/* save buffer fields that may be changed by buffer sizer functions
...
...
@@ -4118,25 +4157,9 @@ void WINAPI NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
pStubMsg
->
MaxCount
=
saved_max_count
;
pStubMsg
->
BufferLength
=
saved_buffer_length
;
}
def
=
*
(
const
WORD
*
)
&
pFormat
[
2
];
pFormat
+=
4
;
pFormat
=
ComputeConformance
(
pStubMsg
,
pMemory
,
pFormat
,
def
);
TRACE
(
"conformance = %ld
\n
"
,
pStubMsg
->
MaxCount
);
SizeConformance
(
pStubMsg
);
variance_present
=
IsConformanceOrVariancePresent
(
pFormat
);
pFormat
=
ComputeVariance
(
pStubMsg
,
pMemory
,
pFormat
,
pStubMsg
->
MaxCount
);
TRACE
(
"variance = %d
\n
"
,
pStubMsg
->
ActualCount
);
if
(
variance_present
)
SizeVariance
(
pStubMsg
);
align_length
(
&
pStubMsg
->
BufferLength
,
alignment
);
count
=
pStubMsg
->
ActualCount
;
for
(
i
=
0
;
i
<
count
;
i
++
)
pMemory
=
ComplexBufferSize
(
pStubMsg
,
pMemory
,
pFormat
,
NULL
);
array_compute_and_size_conformance
(
RPC_FC_BOGUS_ARRAY
,
pStubMsg
,
pMemory
,
pFormat
);
array_buffer_size
(
RPC_FC_BOGUS_ARRAY
,
pStubMsg
,
pMemory
,
pFormat
,
TRUE
/* fHasPointers */
);
if
(
pointer_length_set
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment