client.c

来自「一个类似windows」· C语言 代码 · 共 458 行

C
458
字号
#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);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?