mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 12:26:32 +00:00
458 lines
12 KiB
C
458 lines
12 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include "ctx.h"
|
|
|
|
#define TYPE_FORMAT_STRING_SIZE 23
|
|
#define PROC_FORMAT_STRING_SIZE 21
|
|
#define TRANSMIT_AS_TABLE_SIZE 0
|
|
#define WIRE_MARSHAL_TABLE_SIZE 0
|
|
|
|
typedef struct _MIDL_TYPE_FORMAT_STRING
|
|
{
|
|
short Pad;
|
|
unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
|
|
} MIDL_TYPE_FORMAT_STRING;
|
|
|
|
typedef struct _MIDL_PROC_FORMAT_STRING
|
|
{
|
|
short Pad;
|
|
unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
|
|
} MIDL_PROC_FORMAT_STRING;
|
|
|
|
extern const MIDL_STUB_DESC hello_StubDesc;
|
|
extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString;
|
|
//extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString;*/
|
|
|
|
/*****************************************************************
|
|
* Modified from midl-generated stubs *
|
|
*****************************************************************/
|
|
|
|
|
|
void m_CtxOpen(
|
|
/* [out] */ PCTXTYPE __RPC_FAR *pphContext,
|
|
/* [in] */ long Value)
|
|
{
|
|
RPC_BINDING_HANDLE _Handle = 0;
|
|
|
|
RPC_MESSAGE _RpcMessage;
|
|
|
|
MIDL_STUB_MESSAGE _StubMsg;
|
|
|
|
char *ctx, *buf;
|
|
int i;
|
|
|
|
printf("\n*******************************************************************\n");
|
|
printf("**** CtxOpen() ***\n");
|
|
printf("*******************************************************************\n\n");
|
|
|
|
if(!pphContext)
|
|
{
|
|
RpcRaiseException(RPC_X_NULL_REF_POINTER);
|
|
}
|
|
RpcTryFinally
|
|
{
|
|
NdrClientInitializeNew(
|
|
( PRPC_MESSAGE )&_RpcMessage,
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
( PMIDL_STUB_DESC )&hello_StubDesc,
|
|
0);
|
|
|
|
|
|
_Handle = hBinding;
|
|
|
|
|
|
_StubMsg.BufferLength = 4U;
|
|
NdrGetBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg, _StubMsg.BufferLength, _Handle );
|
|
|
|
*(( long __RPC_FAR * )_StubMsg.Buffer)++ = Value;
|
|
|
|
NdrSendReceive( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *) _StubMsg.Buffer );
|
|
|
|
if ( (_RpcMessage.DataRepresentation & 0X0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION )
|
|
NdrConvert( (PMIDL_STUB_MESSAGE) &_StubMsg, (PFORMAT_STRING) &__MIDL_ProcFormatString.Format[0] );
|
|
|
|
|
|
printf("Before NdrClientContextUnmarshall: Buflen=%d\nBuffer: ", _StubMsg.RpcMsg->BufferLength);
|
|
for(buf = _StubMsg.Buffer, i = 0; i < _StubMsg.RpcMsg->BufferLength; i++)
|
|
printf("0x%x, ", buf[i] & 0x0FF);
|
|
printf("\n\n");
|
|
|
|
*pphContext = (void *)0;
|
|
NdrClientContextUnmarshall(
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
( NDR_CCONTEXT __RPC_FAR * )pphContext,
|
|
_Handle);
|
|
|
|
ctx = (char*)*pphContext;
|
|
printf("\nNdrClientContextUnmarshall returned: handle=0x%p\n", ctx);
|
|
printf("00: 0x%x <- obviously pointer to binding handle copyed from _Handle\n", *((int*)ctx));
|
|
ctx+=4;
|
|
printf("04: 0x%x <- unknown field\n", *((int*)ctx));
|
|
printf("08: ");
|
|
|
|
for(ctx+=4, i = 0; i < 20; i++)
|
|
printf("0x%x,", *(ctx+i) & 0x0FF); printf(" <- ndr 20 bytes\n\n");
|
|
|
|
printf("Buflen=%d, Buffer: ", _StubMsg.BufferLength);
|
|
for(buf = _StubMsg.BufferStart; buf < _StubMsg.BufferEnd; buf++)
|
|
printf("0x%x,", *buf & 0x0FF);
|
|
printf("\n");
|
|
|
|
|
|
}
|
|
RpcFinally
|
|
{
|
|
NdrFreeBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg );
|
|
|
|
}
|
|
RpcEndFinally
|
|
|
|
}
|
|
|
|
void m_CtxOpen2(
|
|
/* [out] */ PCTXTYPE __RPC_FAR *pphContext,
|
|
/* [in] */ long Value)
|
|
{
|
|
|
|
RPC_BINDING_HANDLE _Handle = 0;
|
|
|
|
RPC_MESSAGE _RpcMessage;
|
|
|
|
MIDL_STUB_MESSAGE _StubMsg;
|
|
|
|
char buf[255];
|
|
|
|
NdrClientInitializeNew(
|
|
( PRPC_MESSAGE )&_RpcMessage,
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
( PMIDL_STUB_DESC )&hello_StubDesc,
|
|
0);
|
|
|
|
|
|
_Handle = hBinding;
|
|
|
|
|
|
_StubMsg.BufferLength = 4U;
|
|
NdrGetBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg, _StubMsg.BufferLength, _Handle );
|
|
|
|
*(( long __RPC_FAR * )_StubMsg.Buffer)++ = Value;
|
|
|
|
NdrSendReceive( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *) _StubMsg.Buffer );
|
|
|
|
if ( (_RpcMessage.DataRepresentation & 0X0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION )
|
|
NdrConvert( (PMIDL_STUB_MESSAGE) &_StubMsg, (PFORMAT_STRING) &__MIDL_ProcFormatString.Format[0] );
|
|
|
|
*pphContext = (void *)0;
|
|
|
|
RpcTryExcept
|
|
{
|
|
NdrClientContextUnmarshall(
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
NULL,
|
|
_Handle);
|
|
}
|
|
RpcExcept(1)
|
|
{
|
|
printf("NdrClientContextUnmarshall reported exception = %d\n", RpcExceptionCode());
|
|
}
|
|
RpcEndExcept
|
|
|
|
|
|
|
|
RpcTryExcept
|
|
{
|
|
NdrClientContextUnmarshall(
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
(NDR_CCONTEXT __RPC_FAR * )pphContext,
|
|
NULL);
|
|
}
|
|
RpcExcept(1)
|
|
{
|
|
printf("NdrClientContextUnmarshall reported exception = %d\n", RpcExceptionCode());
|
|
}
|
|
RpcEndExcept
|
|
|
|
|
|
RpcTryExcept
|
|
{
|
|
NdrClientContextMarshall(
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
NULL,
|
|
1);
|
|
}
|
|
RpcExcept(1)
|
|
{
|
|
printf("NdrClientContextMarshall reported exception = %d\n", RpcExceptionCode());
|
|
}
|
|
RpcEndExcept
|
|
|
|
RpcTryExcept
|
|
{
|
|
NDRCContextUnmarshall( NULL, _Handle, buf, _RpcMessage.DataRepresentation );
|
|
}
|
|
RpcExcept(1)
|
|
{
|
|
printf("NDRCContextUnmarshall reported exception = %d\n", RpcExceptionCode());
|
|
}
|
|
RpcEndExcept
|
|
|
|
|
|
NdrFreeBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg );
|
|
|
|
|
|
}
|
|
|
|
void m_CtxHello(
|
|
/* [in] */ PCTXTYPE phContext)
|
|
{
|
|
|
|
RPC_BINDING_HANDLE _Handle = 0;
|
|
|
|
RPC_MESSAGE _RpcMessage;
|
|
|
|
MIDL_STUB_MESSAGE _StubMsg;
|
|
|
|
char *buf;
|
|
int i;
|
|
|
|
printf("\n*******************************************************************\n");
|
|
printf("**** CtxHello() ***\n");
|
|
printf("*******************************************************************\n\n");
|
|
|
|
RpcTryFinally
|
|
{
|
|
NdrClientInitializeNew(
|
|
( PRPC_MESSAGE )&_RpcMessage,
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
( PMIDL_STUB_DESC )&hello_StubDesc,
|
|
1);
|
|
|
|
|
|
if(phContext != 0)
|
|
{
|
|
_Handle = NDRCContextBinding(( NDR_CCONTEXT )phContext);;
|
|
|
|
}
|
|
else
|
|
{
|
|
RpcRaiseException(RPC_X_SS_IN_NULL_CONTEXT);
|
|
}
|
|
|
|
_StubMsg.BufferLength = 20U;
|
|
NdrGetBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg, _StubMsg.BufferLength, _Handle );
|
|
|
|
NdrClientContextMarshall(
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
( NDR_CCONTEXT )phContext,
|
|
1);
|
|
printf("After NdrClientContextMarshall: Buflen=%d\nBuffer: ", _StubMsg.BufferLength );
|
|
for(buf = _StubMsg.Buffer, i = 0; i < _StubMsg.BufferLength; i++)
|
|
printf("0x%x, ", buf[i] & 0x0FF);
|
|
printf("\n\n");
|
|
|
|
NdrSendReceive( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *) _StubMsg.Buffer );
|
|
|
|
}
|
|
RpcFinally
|
|
{
|
|
NdrFreeBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg );
|
|
|
|
}
|
|
RpcEndFinally
|
|
|
|
}
|
|
|
|
|
|
void m_CtxClose(
|
|
/* [out][in] */ PCTXTYPE __RPC_FAR *pphContext)
|
|
{
|
|
|
|
RPC_BINDING_HANDLE _Handle = 0;
|
|
|
|
RPC_MESSAGE _RpcMessage;
|
|
|
|
MIDL_STUB_MESSAGE _StubMsg;
|
|
char *buf;
|
|
int i;
|
|
|
|
printf("\n*******************************************************************\n");
|
|
printf("**** CtxClose() ***\n");
|
|
printf("*******************************************************************\n\n");
|
|
|
|
if(!pphContext)
|
|
{
|
|
RpcRaiseException(RPC_X_NULL_REF_POINTER);
|
|
}
|
|
RpcTryFinally
|
|
{
|
|
NdrClientInitializeNew(
|
|
( PRPC_MESSAGE )&_RpcMessage,
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
( PMIDL_STUB_DESC )&hello_StubDesc,
|
|
2);
|
|
|
|
|
|
if(*pphContext != 0)
|
|
{
|
|
_Handle = NDRCContextBinding(( NDR_CCONTEXT )*pphContext);;
|
|
|
|
}
|
|
|
|
_StubMsg.BufferLength = 20U;
|
|
NdrGetBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg, _StubMsg.BufferLength, _Handle );
|
|
|
|
NdrClientContextMarshall(
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
( NDR_CCONTEXT )*pphContext,
|
|
0);
|
|
|
|
NdrSendReceive( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *) _StubMsg.Buffer );
|
|
|
|
if ( (_RpcMessage.DataRepresentation & 0X0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION )
|
|
NdrConvert( (PMIDL_STUB_MESSAGE) &_StubMsg, (PFORMAT_STRING) &__MIDL_ProcFormatString.Format[14] );
|
|
|
|
|
|
printf("Before NdrClientContextUnmarshall: Buflen=%d\nBuffer: ", _StubMsg.BufferLength );
|
|
for(buf = _StubMsg.Buffer, i = 0; i < _StubMsg.BufferLength; i++)
|
|
printf("0x%x, ", buf[i] & 0x0FF);
|
|
printf("\n\n");
|
|
|
|
NdrClientContextUnmarshall(
|
|
( PMIDL_STUB_MESSAGE )&_StubMsg,
|
|
( NDR_CCONTEXT __RPC_FAR * )pphContext,
|
|
_Handle);
|
|
|
|
|
|
printf("\nNdrClientContextUnmarshall returned: handle=0x%p\n", *pphContext);
|
|
|
|
|
|
}
|
|
RpcFinally
|
|
{
|
|
NdrFreeBuffer( (PMIDL_STUB_MESSAGE) &_StubMsg );
|
|
|
|
}
|
|
RpcEndFinally
|
|
|
|
}
|
|
|
|
int interactive = 0;
|
|
void interact()
|
|
{
|
|
if(interactive)
|
|
{
|
|
printf("\nPress any key to continue...");
|
|
getch();
|
|
printf("\n\n");
|
|
}
|
|
}
|
|
|
|
void main(int argc, char **argv)
|
|
{
|
|
RPC_STATUS status;
|
|
unsigned long ulCode;
|
|
PCTXTYPE hContext;
|
|
char *pszStringBinding = NULL;
|
|
RPC_BINDING_HANDLE Handle = 0;
|
|
char buffer[255];
|
|
|
|
int test_num = 0;
|
|
int test_value = 31337;
|
|
|
|
if(argc<2)
|
|
{
|
|
printf("USAGE: client.exe <test_number> [test_value] [interactive]\n"
|
|
"Available tests:\n"
|
|
"0. General test\n"
|
|
"1. NULL pointer test\n"
|
|
"2. Context rundown routine");
|
|
return;
|
|
}
|
|
|
|
test_num = atoi(argv[1]);
|
|
if(argc>2) test_value = atoi(argv[2]);
|
|
if(argc>3) interactive = 1;
|
|
|
|
status = RpcStringBindingCompose(NULL,
|
|
"ncacn_np",
|
|
NULL,
|
|
"\\pipe\\hello",
|
|
NULL,
|
|
&pszStringBinding);
|
|
|
|
if (status)
|
|
{
|
|
printf("RpcStringBindingCompose %x\n", status);
|
|
exit(status);
|
|
}
|
|
|
|
status = RpcBindingFromStringBinding(pszStringBinding, &hBinding);
|
|
|
|
if (status)
|
|
{
|
|
printf("RpcBindingFromStringBinding %x\n", status);
|
|
exit(status);
|
|
}
|
|
|
|
RpcStringFree(&pszStringBinding);
|
|
|
|
switch(test_num)
|
|
{
|
|
case 0:
|
|
m_CtxOpen(&hContext, test_value);
|
|
RpcBindingFree(&hBinding);
|
|
m_CtxHello(hContext);
|
|
interact();
|
|
m_CtxClose(&hContext);
|
|
break;
|
|
case 1:
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
RpcTryExcept
|
|
{
|
|
Handle = NDRCContextBinding(NULL);
|
|
printf("NDRCContextBinding(NULL) returned %p\n", Handle);
|
|
}
|
|
RpcExcept(1)
|
|
{
|
|
printf("NDRCContextBinding(NULL) reported exception = %d\n", RpcExceptionCode());
|
|
}
|
|
RpcEndExcept
|
|
|
|
m_CtxOpen2(&hContext, test_value);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
RpcTryExcept
|
|
{
|
|
NDRCContextMarshall(NULL, &buffer);
|
|
printf("NDRCContextMarshall(NULL) returned %p\n", Handle);
|
|
}
|
|
RpcExcept(1)
|
|
{
|
|
printf("NDRCContextMarshall(NULL) reported exception = %d\n", RpcExceptionCode());
|
|
}
|
|
RpcEndExcept
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
break;
|
|
case 2:
|
|
CtxOpen(&hContext, test_value);
|
|
interact();
|
|
ExitProcess(0);
|
|
break;
|
|
default:
|
|
printf("Unknown test %d\n", test_num);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
|
|
{
|
|
return(malloc(len));
|
|
}
|
|
|
|
void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
|
|
{
|
|
free(ptr);
|
|
}
|