FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Protecting certain functions to be used
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Protecting certain functions to be used
Posted: Tue May 02, 2023 09:22 AM
If you allow your users to define and execute a macro or use the runtime Harbour compiler (hbcplr.lib), sometimes you may want to avoid the use of certain Harbour functions. This code allows you to protect the symbols that you don't want to be used:

Fill the array { "QOut" } to include all the symbols that you want to protect. Next version will allow to restore them when you want.

protect.prg
Code (fw): Select all Collapse
extern Dummy

function Main()

   Protect( { "QOut" } )
   ? Test()

return nil

function Test()

return 2 + 2    

#pragma BEGINDUMP

#define _HB_API_INTERNAL_
#include <hbvmpub.h>

extern HB_EXPORT HB_SIZE hb_parinfa( int iParamNum, HB_SIZE nArrayIndex );
extern HB_EXPORT const char * hb_parvc( int iParam, ... );
extern HB_EXPORT PHB_DYNS hb_dynsymFindName( const char * szName );
extern HB_EXPORT PHB_SYMB hb_dynsymSymbol( PHB_DYNS pDynSym );

HB_FUNC( DUMMY )
{
   hb_ret();  
}

HB_FUNC( PROTECT )
{
   int iLen = ( int ) hb_parinfa( 1, 0 );  
   int i;

   for( i = 0; i < iLen; i++ )
   {
      const char * szSymbolName = hb_parvc( 1, i + 1 );

      hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->value.pFunPtr = 
         hb_dynsymSymbol( hb_dynsymFindName( "DUMMY" ) )->value.pFunPtr;
   }
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Protecting certain functions to be used
Posted: Tue May 02, 2023 04:51 PM
Enhanced version: functions Protect() and UnProtect()
Code (fw): Select all Collapse
extern Dummy

function Main()

   Protect( { "Test" } )
   ? Test()
   UnProtect( { "Test" } )
   ? Test()

return nil

function Test()

return 2 + 2    

#pragma BEGINDUMP

#define _HB_API_INTERNAL_
#include <hbvmpub.h>

extern HB_EXPORT HB_SIZE hb_parinfa( int iParamNum, HB_SIZE nArrayIndex );
extern HB_EXPORT const char * hb_parvc( int iParam, ... );
extern HB_EXPORT PHB_DYNS hb_dynsymFindName( const char * szName );
extern HB_EXPORT PHB_SYMB hb_dynsymSymbol( PHB_DYNS pDynSym );
extern HB_EXPORT void hb_ret( void );

HB_FUNC( DUMMY )
{
   hb_ret();  
}

HB_FUNC( PROTECT )
{
   int iLen = ( int ) hb_parinfa( 1, 0 );  
   int i;

   for( i = 0; i < iLen; i++ )
   {
      const char * szSymbolName = hb_parvc( 1, i + 1 );

      hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->scope.pointer = 
         hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->value.pFunPtr;

      hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->value.pFunPtr = 
         hb_dynsymSymbol( hb_dynsymFindName( "DUMMY" ) )->value.pFunPtr;
   }
}

HB_FUNC( UNPROTECT )
{
   int iLen = ( int ) hb_parinfa( 1, 0 );  
   int i;

   for( i = 0; i < iLen; i++ )
   {
      const char * szSymbolName = hb_parvc( 1, i + 1 );

      hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->value.pFunPtr = 
         hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->scope.pointer;
   }
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Protecting certain functions to be used
Posted: Tue May 02, 2023 06:19 PM
Simpler and Harbour generates an error as the functions becomes undefined, even if the functions are linked. Once Unprotect()ed they become available again :-)
Code (fw): Select all Collapse
function Main()

   Protect( { "FErase" } )
   FErase()

return nil

#pragma BEGINDUMP

#define _HB_API_INTERNAL_
#include <hbvmpub.h>

extern HB_EXPORT HB_SIZE hb_parinfa( int iParamNum, HB_SIZE nArrayIndex );
extern HB_EXPORT const char * hb_parvc( int iParam, ... );
extern HB_EXPORT PHB_DYNS hb_dynsymFindName( const char * szName );
extern HB_EXPORT PHB_SYMB hb_dynsymSymbol( PHB_DYNS pDynSym );

HB_FUNC( PROTECT )
{
   int iLen = ( int ) hb_parinfa( 1, 0 );  
   int i;

   for( i = 0; i < iLen; i++ )
   {
      const char * szSymbolName = hb_parvc( 1, i + 1 );

      hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->scope.pointer = 
         hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->value.pFunPtr;

      hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->value.pFunPtr = NULL;
   }
}

HB_FUNC( UNPROTECT )
{
   int iLen = ( int ) hb_parinfa( 1, 0 );  
   int i;

   for( i = 0; i < iLen; i++ )
   {
      const char * szSymbolName = hb_parvc( 1, i + 1 );

      hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->value.pFunPtr = 
         hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) )->scope.pointer;
   }
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 318
Joined: Fri Jan 14, 2022 08:37 AM
Re: Protecting certain functions to be used
Posted: Tue May 02, 2023 06:39 PM

Muchísimas gracias. Grandisimo aporte Antonio

Recuerdo, creo que en el foro de harbour users, una vez alguien pidió exactamente esto mismo

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Protecting certain functions to be used
Posted: Tue May 02, 2023 07:05 PM
Gracias Paco,

versión simplificada:
Code (fw): Select all Collapse
function Main()

   HB_Protect( { "memoWrit" } )
   memoWrit()

return nil

#pragma BEGINDUMP

#define _HB_API_INTERNAL_
#include <hbvmpub.h>

extern HB_EXPORT HB_SIZE hb_parinfa( int iParamNum, HB_SIZE nArrayIndex );
extern HB_EXPORT const char * hb_parvc( int iParam, ... );
extern HB_EXPORT PHB_DYNS hb_dynsymFindName( const char * szName );
extern HB_EXPORT PHB_SYMB hb_dynsymSymbol( PHB_DYNS pDynSym );

HB_FUNC( HB_PROTECT )
{
   int iLen = ( int ) hb_parinfa( 1, 0 );  
   int i;

   for( i = 0; i < iLen; i++ )
   {
      const char * szSymbolName = hb_parvc( 1, i + 1 );
      PHB_SYMB pSym = hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) );

      if( pSym )
      {
         pSym->scope.pointer = pSym->value.pFunPtr;
         pSym->value.pFunPtr = NULL;
      }
   }   
}

HB_FUNC( HB_UNPROTECT )
{
   int iLen = ( int ) hb_parinfa( 1, 0 );  
   int i;

   for( i = 0; i < iLen; i++ )
   {
      const char * szSymbolName = hb_parvc( 1, i + 1 );
      PHB_SYMB pSym = hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) );

      if( pSym )
         pSym->value.pFunPtr = pSym->scope.pointer;
   }
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Protecting certain functions to be used
Posted: Wed May 03, 2023 06:44 AM
I just realized that scope.pointer is member of an union and not a member of a struct, so modifying scope.pointer will be affecting the scope of the symbol.

This would be the right way to do it:
Code (fw): Select all Collapse
function Main()

   local pFunPtr := HB_Protect( "memoWrit" )

   memoWrit()

   // later on
   // HB_Unprotect( "memoWrit", pFunPtr )

return nil

#pragma BEGINDUMP

#define _HB_API_INTERNAL_
#include <hbvmpub.h>

extern HB_EXPORT const char * hb_parvc( int iParam, ... );
extern HB_EXPORT PHB_DYNS hb_dynsymFindName( const char * szName );
extern HB_EXPORT PHB_SYMB hb_dynsymSymbol( PHB_DYNS pDynSym );
extern HB_EXPORT void * hb_parptr( int iParam );
extern HB_EXPORT void hb_retptr( void * ptr );

HB_FUNC( HB_PROTECT )
{
   const char * szSymbolName = hb_parvc( 1 );
   PHB_SYMB pSym = hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) );

   if( pSym )
   {
      hb_retptr( pSym->value.pFunPtr );
      pSym->value.pFunPtr = NULL;
   }
}

HB_FUNC( HB_UNPROTECT )
{
   const char * szSymbolName = hb_parvc( 1 );
   PHB_SYMB pSym = hb_dynsymSymbol( hb_dynsymFindName( szSymbolName ) );

   if( pSym )
      pSym->value.pFunPtr = hb_parptr( 2 );
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Protecting certain functions to be used
Posted: Wed May 03, 2023 06:49 AM
simpler:
Code (fw): Select all Collapse
function Main()

   local pFunPtr := HB_Protect( "memoWrit" )

   memoWrit()

   // later on
   // HB_Unprotect( "memoWrit", pFunPtr )

return nil

#pragma BEGINDUMP

#define _HB_API_INTERNAL_
#include <hbvmpub.h>

extern HB_EXPORT const char * hb_parvc( int iParam, ... );
extern HB_EXPORT PHB_DYNS hb_dynsymFindName( const char * szName );
extern HB_EXPORT PHB_SYMB hb_dynsymSymbol( PHB_DYNS pDynSym );
extern HB_EXPORT void * hb_parptr( int iParam );
extern HB_EXPORT void hb_retptr( void * ptr );

HB_FUNC( HB_PROTECT )
{
   PHB_SYMB pSym = hb_dynsymSymbol( hb_dynsymFindName( hb_parvc( 1 ) ) );

   if( pSym )
   {
      hb_retptr( pSym->value.pFunPtr );
      pSym->value.pFunPtr = NULL;
   }
}

HB_FUNC( HB_UNPROTECT )
{
   PHB_SYMB pSym = hb_dynsymSymbol( hb_dynsymFindName( hb_parvc( 1 ) ) );

   if( pSym )
      pSym->value.pFunPtr = hb_parptr( 2 );
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion