REMOTE.C
/************************************************************************* 
                    Copyright Microsoft Corp. 1992-1996 
                        Remote Machine strout sample 
 
  FILE      :   remote.c 
 
  PURPOSE   :   The remote procedures that will be called from the client. 
 
  COMMENTS  :   These procedures will be linked into the server side of  
                the application. 
 
*************************************************************************/ 
#include "strout.h"                 //Generated by the MIDL compiler    
#include "common.h"                 //Common definitions for all files  
 
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
/*  Procedure   :   void GetRemoteEnv(unsigned long, str **)            */ 
/*  Desc.       :   This procedure get the environment variables from   */ 
/*                  the server and reuturns a pointer to an array of    */ 
/*                  pointer to the environment strings                  */ 
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
void GetRemoteEnv(unsigned long *nNumLines, str **psEnvironmentBlock) 
{ 
    int nIdx = 0;       // Loop counter                                  
    TCHAR  
        *pcTemp,        // Temporary pointer to the environment block    
        *pcEnv;         // Pointer to the environment block              
 
 
    // Get pointer to environment block 
    pcEnv = (TCHAR *) GetEnvironmentStrings(); 
 
    // First count how many lines, must know how much memory to allocate 
    *nNumLines  = 0;            // Initialize number of lines to 0       
    pcTemp = pcEnv;             // Set tempptr equal to envptr           
    while (*pcTemp != NULL_CHAR) 
    { 
        // Don't count the lines that starts with IGNORE_CHAR         
        if(*pcTemp != IGNORE_CHAR) 
        { 
            (*nNumLines)++;     // Increase the number of lines      
        } 
 
        // Increment the string pointer. Each line ends in \0, and   
        // \0\0 means end of block                                   
        pcTemp += (_tcslen(pcTemp) + 1); 
    } 
 
    // Allocate the memory needed for the line pointer  
    if(NULL == (*psEnvironmentBlock = (str *)  
        midl_user_allocate((*nNumLines) * sizeof(str)))) 
    { 
        _tprintf(TEXT("REMOTE.C : Memory allocation error\n")); 
        return; 
    } 
 
    // Iterate through all the environment strings, allocate memory,     
    // and copy them                                                     
    while (*pcEnv != NULL_CHAR) 
    { 
        // Don't count the lines that starts with IGNORE_CHAR 
        if(*pcEnv != IGNORE_CHAR) 
        { 
            // Allocate the space needed for the strings  
            (*psEnvironmentBlock)[nIdx] = (str) midl_user_allocate( 
                sizeof(TCHAR) * (_tcslen(pcEnv) + 1)); 
 
            // Copy the environment string to the allocated memory 
            _tcscpy((*psEnvironmentBlock)[nIdx++], pcEnv); 
        } 
         
        // Increment the string pointer. Each line ends in \0, and 
        // \0\0 means end of block 
        pcEnv += (_tcslen(pcEnv) + 1); 
    } 
} 
 
 
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
/* Procedure    :   void ShutDown(void);                                */ 
/* Desc.        :   This procedure send a message to the server that it */ 
/*                  canstop listening for remote procedure calls       */ 
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 
void ShutDown(void) 
{ 
    RPC_STATUS nStatus; 
 
    // Tell the server to stop listening for remote procedure calls 
    _tprintf(TEXT("Shutting down the server\n")); 
    nStatus = RpcMgmtStopServerListening(NULL); 
    EXIT_IF_FAIL(nStatus, "RpcMgmtStopServerListening"); 
}