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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

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

Mensagem 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"));
}
carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

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

Mensagem 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
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

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

Mensagem 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.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

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

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

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

Mensagem 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

At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

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

Mensagem 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
Editado pela última vez por JoséQuintas em 26 Ago 2023 12:09, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Imagem
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

Atualizando o post.

Código: Selecionar todos

   cText += "Terminal Server Client: " + iif( win_OsIsTsClient(), "Yes", "No" ) + hb_eol()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

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

Mensagem 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
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Responder