#include #include #include #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_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); }