Página 1 de 1

Pessoal que entende de "C", uma luz, por favor!

Enviado: 18 Ago 2009 15:28
por carlos_dornelas
Caros, não entendo nada de C, por isso venho pedir aos colegas que me ajudem a portar essa função C que o nobre amigo Maligno postou no espaço clipper, para o xHarbour. Essa rotina serve para indicar se o programa está rodando em uma máquina virtual ou não. Eu até consegui compilá-la em uma rotina do xharbour, mas precisava obter e manipular o resultado de RedPill() . Sei que precisa implementar o tal hb_parni() para o retorno, mas, como disse, não sei nada de C e não sei por onde começar.

Desde já obrigado

Antonio Carlos

Código: Selecionar todos

#include <stdio.h>


//*********************************************************************
int RedPill () {
    unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
    *((unsigned*)&rpill[3]) = (unsigned)m;
    ((void(*)())&rpill)();
    return (m[5]>0xd0? 1: 0);
}


//*********************************************************************
int main() {
    printf("IsVirtualMachine? %s\n",(RedPill()? "YES": "NO"));
}

Re: Pessoal que entende de "C", uma luz, por favor!

Enviado: 19 Ago 2009 17:12
por carlos_dornelas
Pessoal,
como faço para utilizar a rotina em C do ISVM no [x]harbour?
Gracas ao nobre Vailton Renato a questao jah foi resolvida!!

Antonio Carlos

Re: Pessoal que entende de "C", uma luz, por favor!

Enviado: 22 Ago 2009 11:05
por sygecom
Olá Carlos,
Nesse seu caso não resolve apenas conhecer lingugem de programação C, o programador tem que conhecer também as API do xHarbour para fazer retorno que você esta querendo, pórem nem todo mundo tem esse conhecimento. Esse tipo de postagem você obtem mais rapido quando você posta para o grupo de desenvolvedore do xHarbour ou do Harbour.

Pessoal que entende de "C", uma luz, por favor!

Enviado: 14 Jul 2023 11:31
por Mario Mesquita
Bom dia, pessoal.

Achei esse tópico e queria perguntar a vocês se daria pra incorporar alguma rotina feita em C em um programa Harbour. Lembro que havia alguma possiblidade mas não lembro onde vi ou como seria.

Se alguém connhecer alguma documentação em algum lugar tb agradeço. É pra estudo mesmo...

Saudações,
Mario.

Pessoal que entende de "C", uma luz, por favor!

Enviado: 14 Jul 2023 13:24
por JoséQuintas
Mario Mesquita escreveu:Achei esse tópico e queria perguntar a vocês se daria pra incorporar alguma rotina feita em C em um programa Harbour. Lembro que havia alguma possiblidade mas não lembro onde vi ou como seria.
O comando é pragma begin dump
Dê uma pesquisada no fórum, vai encontrar exemplos, pesquise pragma.

Pessoal que entende de "C", uma luz, por favor!

Enviado: 04 Ago 2023 10:08
por clodoaldomonteiro
Segue minha rotinas em C, pra vc ter como exemplo:

Código: Selecionar todos

////////////////////////////////////////////////////////////////////////////////
//Arquivo com as funções em C++
////////////////////////////////////////////////////////////////////////////////

#include "common.ch"    // para poder redefinir a função type() para ischaracter() e outras
#include "winuser.ch"

   /////////////////////////////////////////////////////////////////////////////
#pragma BEGINDUMP

   #pragma comment( lib, "shell32.lib" )
   #include <winsock.h>
   #include <windows.h>
   #include "winbase.h"
   #include "winuser.h"
   #include <stdio.h>
   #include <stdlib.h>
   #include <Iphlpapi.h>
   #include <Assert.h>
   #include "hbapi.h"
   #include "hbapiitm.h"
   #include "item.api"

   #define HB_OS_WIN_32_USED


   /////////////////////////////////////////////////////////////////////////////
HB_FUNC( _OPENHELPFILE )
   {
   HINSTANCE hInst;
    LPCTSTR lpPath = (LPTSTR) hb_parc( 1 );
    LPCTSTR lpHelpFile = (LPTSTR) hb_parc( 2 );
    hInst = ShellExecute( 0, "Open", lpHelpFile, 0, lpPath, 1 );
    hb_retnl( (LONG) hInst );
    return;
    }


   //------------------------------------------------------------------
   // standard 32 byte's M$ guid
   // Link: http://forums.fivetechsupport.com/viewtopic.php?f=3&t=28026&p=156570&hilit=guid#p156570
   // Link: http://forums.fivetechsupport.com/viewtopic.php?f=3&t=21719&start=30
   //------------------------------------------------------------------
HB_FUNC( _NEWGUID32 )
   {
   GUID guid;
    char obuff[38];
    memset( obuff, 0x0, 38 );
    if ( CoCreateGuid(&guid) == NULL )
      {
      OLECHAR tmpbuff[76];
       StringFromGUID2(&guid, tmpbuff, 76);
       WideCharToMultiByte(CP_OEMCP, 0, tmpbuff, -1, obuff, 38, NULL, NULL);
       }
   hb_retclen(obuff, 38);
    }


   /////////////////////////////////////////////////////////////////////////////
   //Pressionar a tecla alt
   //https://docs.microsoft.com/pt-br/windows/win32/inputdev/virtual-key-codes
HB_FUNC( _VKALT )
   {
   keybd_event (VK_MENU, 0, 0, 0 );
   keybd_event (VK_MENU, 0, KEYEVENTF_KEYUP, 0);
   }

   /////////////////////////////////////////////////////////////////
   //Pressionar qualquer tecla
HB_FUNC( _VKLETRA )
   {
   keybd_event (hb_parnl(1), 0, 0, 0 );
   keybd_event (hb_parnl(1), 0, KEYEVENTF_KEYUP, 0);
   }

   /////////////////////////////////////////////////////////////////
   //Pressionar seta direita
HB_FUNC( _VKSETADIR )
   {
   keybd_event (VK_RIGHT, 0, 0, 0 );
   keybd_event (VK_RIGHT, 0, KEYEVENTF_KEYUP, 0);
   }

   /////////////////////////////////////////////////////////////////
   //Pressionar seta baixo
HB_FUNC( _VKSETABAI )
   {
   int n; //= 1;
   for(n = 1; n <= hb_parni(1); n++) {
      keybd_event (VK_DOWN, 0, 0, 0 );
      keybd_event (VK_DOWN, 0, KEYEVENTF_KEYUP, 0);
      }
   }


   //////////////////////////////////////////////////////////////////////////////////////
   //
HB_FUNC( _CLI )      //Retorna o nome do usuário do windows
   {

   //ponteiro char[] para o IP retornado no formato string
   char *IP;
    struct in_addr ipGeral;

    //ponteiro para a estrutura que armazena o IP obtido pelo nome do pc
   struct hostent * ipPeloNome;

    char nomeDoPCLocal[255]; 	//armazena o nome do computador local

    WSADATA infoSocket; 			//estrutura para obter as informações básica do socket no windows.

    //inicializa o socket 2.0 no windows - sem essa inicialização, vc não tem
   //permissão para utilizar as funções de rede no windows.
   WSAStartup(MAKEWORD(2,0), &infoSocket);

    gethostname(nomeDoPCLocal, 255); //função obtém o nome da sua máquina local

    //função retorna o endereço para uma estrutura do tipo hostent, que dentre outras opções
   //armazena o endereço de ip referente ao nome do PC passado como argumento para essa função.
   ipPeloNome = gethostbyname(nomeDoPCLocal);

    //copia o IP obtido para uma estrutura do tipo "in_addr"
   memcpy(&ipGeral, ipPeloNome->h_addr_list[0], sizeof(struct in_addr));

    //inet_ntoa() decodifica a estrutura do tipo "in_addr" e retorna o IP em uma string de
   //caracteres legíveis.
   IP = inet_ntoa(ipGeral);

    hb_retc( IP);

    WSACleanup();

    }

   ///////////////////////////////////////////////////////////////////////////////////////////
   // Pega o MAC da placa de Rede
HB_FUNC(_CLM)
   {

   IP_ADAPTER_INFO AdapterInfo[16];       // Allocate information for up to 16 NICs
    DWORD dwBufLen = sizeof(AdapterInfo);       // Save the memory size of buffer
    unsigned char ret[ 20 ] ={0};

   DWORD dwStatus = GetAdaptersInfo(           // Call GetAdapterInfo
    AdapterInfo,       									// [out] buffer to receive data
    &dwBufLen);        									// [in] size of receive data buffer

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;// Contains pointer to current adapter info
    //assert(dwStatus == ERROR_SUCCESS);   			// Verify return value is valid, no buffer overflow

    sprintf(ret,"%02X-%02X-%02X-%02X-%02X-%02X",
   pAdapterInfo->Address[0], pAdapterInfo->Address[1],
   pAdapterInfo->Address[2], pAdapterInfo->Address[3],
   pAdapterInfo->Address[4], pAdapterInfo->Address[5]);

    hb_retc(ret);

    }


   /////////////////////////////////////////////////////////////////////////////
   //
HB_FUNC( _CLSHIFT )
   {
   HINSTANCE mRetorno;
    LPCTSTR mString1 = (LPTSTR) hb_parc( 1 );
    LPCTSTR mString2 = (LPTSTR) hb_parc( 2 );

    // temos que converter a string em um valor inteiro válido
   int res1 = atoi(mString1);
    int res2 = atoi(mString2);

    hb_retnl( (LONG) (res1 ^ ( res2 >> 8 )) );

    return;
    }

#pragma ENDDUMP


Pessoal que entende de "C", uma luz, por favor!

Enviado: 25 Ago 2023 22:17
por bencz

Código: Selecionar todos

FUNCTION Main()
   LOCAL nResult
   nResult := RedPill()
   IF nResult == 1
      ? "Running in a virtualized environment"
   ELSE
      ? "Running on a physical machine"
   ENDIF
RETURN

#begindump

#include <stdint.h>

HB_FUNC( REDPILL )
{
    unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
    *((uint32_t*)&rpill[3]) = (uint32_t)m;
    ((void(*)())&rpill)();
    hb_retni( m[5] > 0xd0 ? 1 : 0 ); // Retorna um valor inteiro para Harbour
}

#enddump

Pessoal que entende de "C", uma luz, por favor!

Enviado: 26 Ago 2023 11:40
por JoséQuintas
Atualizando o post.

Código: Selecionar todos

   cText += "Terminal Server Client: " + iif( win_OsIsTsClient(), "Yes", "No" ) + hb_eol()

Pessoal que entende de "C", uma luz, por favor!

Enviado: 26 Ago 2023 19:34
por Nascimento
bencz escreveu:

Código: Selecionar todos

FUNCTION Main()
   LOCAL nResult
   nResult := RedPill()
   IF nResult == 1
      ? "Running in a virtualized environment"
   ELSE
      ? "Running on a physical machine"
   ENDIF
RETURN

#begindump

#include <stdint.h>

HB_FUNC( REDPILL )
{
    unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
    *((uint32_t*)&rpill[3]) = (uint32_t)m;
    ((void(*)())&rpill)();
    hb_retni( m[5] > 0xd0 ? 1 : 0 ); // Retorna um valor inteiro para Harbour
}

#enddump
lembro-me que ja portei essa função , não achei tão eficaz, pois o lilo dibla ela em 2 palitos

mesmo assim parabéns amigo