Hi,
Posto a seguir, um simples programa que bloqueia Hosts especificados pelo usuário, através do arquivo de mapeamento de DNS e IP's.
Source:
MAIN.C
#include <windows.h> // Constantes e Funções da API
#include <commctrl.h> // Controles comuns -> XP Visual Style
#include <stdio.h> // Standard IO
#include "recurso.h" // Constantes -> ID dos objetos
// Caminho do arquivo de hosts
#define HOSTS_FILE "C:\\WINDOWS\\SYSTEM32\\drivers\\etc\\hosts"
LRESULT CALLBACK MainProc (HWND, UINT, WPARAM, LPARAM); // Função de eventos -> Form Principal
LRESULT CALLBACK AddHostProc (HWND, UINT, WPARAM, LPARAM); // Função de eventos -> Form Adicionar Hosts
void listar_hosts(void);// Obtém lista de hosts
void deleta_hosts(void);
void showaddr(void); // Chama pelo form -> Adicionar Host
void salvar(void); // Salvar alterações
int conf(void); // Confirmar alterações
HWND main_dlg = 0; // HWND principal
int pos = -1; // Posição selecionada no ListBox -> nenhuma
FILE *fp = NULL; // Ponteiro para o arquivo
BOOL alt = FALSE; // Controla se houve alterações ou não
HICON icone = NULL;
// Entrada do programa
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
icone = LoadIcon(hInstance,icon1); // Carrega ícone
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DLG1),0,(DLGPROC)MainProc); // Chama Form principal
return 0;
}
// Função do Form Principal
LRESULT CALLBACK MainProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) // Verifica mensagem (evento)
{
case WM_INITDIALOG: // Ao inicializar
InitCommonControls(); // Habilita controles comuns -> XP Manifest
main_dlg = hwnd; // Define o HWND principal -> utilizar em funções externas
listar_hosts(); // Lista hosts
// Mostra os ícones: Topo do programa e ALT+TAB
SendMessage(hwnd,WM_SETICON,ICON_BIG,(LPARAM)icone);
SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)icone);
return 0;
break;
case WM_CLOSE: // Fechar
if(alt == TRUE) // Verifica se houve alteração
{
if(conf()) // Pede confirmação para salvar alterações
salvar(); // Salva se confirmado
}
PostQuitMessage(0); // Encerra
break;
case WM_COMMAND: // Clique em objetos
{
switch(wParam) // Verfica ID do objeto
{
case block: // Botão bloquear host
showaddr(); // Chama pelo Form Adicionar Host
break;
case desblock: // Botão desbloquear
deleta_hosts();
break;
case desblock_all: // Botão desbloquear todos
SendDlgItemMessage(hwnd,hosts,LB_RESETCONTENT,0,0); // Deleta todos os itens
alt = TRUE; // Marca que houve alteração
break;
}
}
}
return 0;
}
// Função do form Adicionar Host
LRESULT CALLBACK AddHostProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg){ // Verifica evento (mensagem)
case WM_CLOSE: // Fechar
EndDialog(hwnd,0); // Encerra apenas o form
break;
case WM_COMMAND: // Clique em objetos
if(wParam == go){ // Se o objeto for o botão OK
char buffer[0x100]; // Buffer para obter o host digitado
GetDlgItemText(hwnd,host_txt,buffer,0x100); // Obtém o host digitado
if(strcmp(buffer,"")==0) // Se estiver vazio
MessageBox(hwnd,"Digite um hostname ou IP Válido!","Erro",0x10); // Erro
else{ // Se não
// Adiciona ao form principal o host digitado
SendDlgItemMessage(main_dlg,hosts,LB_ADDSTRING,0,(LPARAM)buffer);
SetDlgItemText(hwnd,host_txt,""); // Limpa o TextBox para adicionar outros hosts
SetFocus(GetDlgItem(hwnd,host_txt)); // Muda o focus para o TextBox
alt = TRUE; // Define alteração
}
break;
}
}
return 0;
}
int conf()
{
// Mostra aviso de alteração e pede confirmação para salvá-las.
int i = MessageBox(main_dlg,"Os hosts forão modificados.\nSe você continuar TODOS os HOSTS não editados pelo programa"
"serão apagados.Salvar as alterações?","o.O?", 0x34);
if(i == IDYES) // Se houve confirmação
return 1; // Retorna código 1 -> salvar
else // Se não
return 0; // Retorna código 0 -> não salvar
}
void salvar()
{
fp = fopen(HOSTS_FILE,"w"); // Tenta abrir o arquivo de hosts para escrita -> Apaga dados prévios
if(fp == NULL){ // Em caso de erro, mostra alerta e encerra
MessageBox(main_dlg,"Erro ao salvar as configuracoes!","Erro",0x10);
PostQuitMessage(1);
}
// Verifica número de itens no ListBox
int num = SendDlgItemMessage(main_dlg,hosts,LB_GETCOUNT,0,0);
if(num == 0){ // Se o ListBox não tiver itens
fclose(fp); // Apenas fecha o arquivo
}
else // Se existirem itens
{
int i; // Auxiliar loop
char buf[0x100]; // Buffer para obter os hosts na lista
for(i=0;i<num;i++){ // Percorre todos os índices na lista de 0 até NUM-1
SendDlgItemMessage(main_dlg,hosts,LB_GETTEXT,(WPARAM)i,(LPARAM)buf); // Obtém texto do respectivo item
fprintf(fp,"0.0.0.0 %s\n",buf); // Imprime no arquivo de host: "0.0.0.0 HOST_DA_LISTA"
}
}
// Mostra confirmação de êxito
MessageBox(main_dlg,"As configurações foram salvas com sucesso!","^^",0x40);
PostQuitMessage(0); // Encerra
}
void showaddr()
{
// Chama pelo form Adicionar Host
DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_ADDHOST),0,(DLGPROC)AddHostProc);
}
void listar_hosts(){
fp = fopen(HOSTS_FILE,"r"); // Tenta abrir o arquivo de hosts para leitura
if(fp == NULL) // Em caso de erro
{
// Mostra alerta e encerra
MessageBox(main_dlg,"Ocorreu um erro ao abrir o arquivo de hosts","Erro",0x10);
PostQuitMessage(1);
}
char buffer[0x100]; // Buffer para armazenar hosts no arquivo
while(!feof(fp)) // Enquanto existirem hosts no arquivo
{
memset(buffer,0x0,0x100); // Limpa o buffer
fgets(buffer,0x100,fp); // Obtém host do arquivo
buffer[strlen(buffer)-1]='\0'; // Finaliza a string
char * nome_host = strstr(buffer,"0.0.0.0 "); // Separa apenas hosts que tenham "0.0.0.0 " precedindo-os
if(nome_host !=NULL) // Apenas se o host tiver passado pelo filtro
SendDlgItemMessage(main_dlg,hosts,LB_ADDSTRING,0,(LPARAM)nome_host+8); // Adiciona-o na lista
}
}
void deleta_hosts()
{
int num_sel = SendDlgItemMessage(main_dlg,hosts,LB_GETSELCOUNT,pos,0); // Obtém número de itens selecionados
int num_total = SendDlgItemMessage(main_dlg,hosts,LB_GETCOUNT,0,0); // Obtém número total de itens
if(num_sel == 0)// Se não houver item selecionado
MessageBox(main_dlg,"Escolha um host para desbloquear!","Erro",0x10); // Erro
else{ // Do contrário
int i,j = num_total; // Loops: i = índice do elemento em questão; j = número de loops
for(;j>0;j--) // Loop -> número de elementos
for(i=0;i<num_total;i++){ // Pecorre cada índice da lista
pos = SendDlgItemMessage(main_dlg,hosts,LB_GETSEL,i,0); // Verifica se está selecionado
if(pos == 1){ // Se afirmativo
SendDlgItemMessage(main_dlg,hosts,LB_DELETESTRING,i,0);} // Deleta o item
}
alt = TRUE; // Define que houve alteração
}
}
RECURSO.H
// Constantes -> Nome dos objetos, inclusive forms
#define icon1 0
#define IDD_DLG1 1000
#define IDC_GRP1 1001
#define hosts 1002
#define block 1003
#define desblock 1004
#define desblock_all 1005
#define IDD_ADDHOST 1006
#define IDC_STC1 1007
#define host_txt 1008
#define go 1009
RECURSO.RC
#include "recurso.h"
IDD_DLG1 DIALOGEX 6,6,232,233
CAPTION "Hosts Blocker"
FONT 8,"MS Sans Serif",0,0
STYLE 0x10C80800
EXSTYLE 0x00000008
BEGIN
CONTROL "Hosts bloqueados...",IDC_GRP1,"Button",0x50000007,6,7,220,200
CONTROL "",hosts,"ListBox",0x50010949,10,18,210,182,0x00000200
CONTROL "&Bloquear host...",block,"Button",0x50010001,6,210,67,16
CONTROL "&Desbloquear host",desblock,"Button",0x50010000,78,210,66,16
CONTROL "Desbloquear &todos",desblock_all,"Button",0x50010000,148,210,78,16
END
IDD_ADDHOST DIALOGEX 6,6,217,52
CAPTION "Adicionar host..."
FONT 8,"MS Sans Serif",0,0
STYLE 0x92C80800
EXSTYLE 0x00000008
BEGIN
CONTROL "Digite o Host Name ou IP do host:",IDC_STC1,"Static",0x50000000,52,3,112,11
CONTROL "",host_txt,"Edit",0x50010080,6,20,204,12,0x00000200
CONTROL "&OK",go,"Button",0x50010001,84,36,48,13
END
icon1 ICON DISCARDABLE "icone.ico"
1 24 "manifest.xml"
Download do source + executável: http://three.fsphost.com/darkside/hosts.rar (http://three.fsphost.com/darkside/hosts.rar)
Bye
Muito bom dark..
mais poderia explicar o RECURSO.RC ?
//insanity
Hi,
O arquivo recurso.rc contém informações sobre os objetos gráficos do programa que formam a GUI - Graphical User Interface ou simplesmente "interface gráfica", como é vulgarmente conhecida.
O script .RC é escrito em RSL - Resource Script Language.
Um exemplo:
IDD_DLG1 DIALOGEX 6,6,232,233
CAPTION "Hosts Blocker"
FONT 8,"MS Sans Serif",0,0
STYLE 0x10C80800
EXSTYLE 0x00000008
BEGIN
CONTROL "Hosts bloqueados...",IDC_GRP1,"Button",0x50000007,6,7,220,200
CONTROL "",hosts,"ListBox",0x50010949,10,18,210,182,0x00000200
CONTROL "&Bloquear host...",block,"Button",0x50010001,6,210,67,16
CONTROL "&Desbloquear host",desblock,"Button",0x50010000,78,210,66,16
CONTROL "Desbloquear &todos",desblock_all,"Button",0x50010000,148,210,78,16
END
Temos a estrutura gráfica do form principal:
IDD_DLG1 DIALOGEX 6,6,232,233 // Identificação, altura, largura e posição do form
CAPTION "Hosts Blocker" // Título
FONT 8,"MS Sans Serif",0,0 // Fonte
STYLE 0x10C80800 // Estilos
EXSTYLE 0x00000008 // Estilos extendidos
BEGIN // Início dos objetos do form
CONTROL "Hosts bloqueados...",IDC_GRP1,"Button",0x50000007,6,7,220,200 // Frame
CONTROL "",hosts,"ListBox",0x50010949,10,18,210,182,0x00000200 // Lista
CONTROL "&Bloquear host...",block,"Button",0x50010001,6,210,67,16 // Botão bloquear
CONTROL "&Desbloquear host",desblock,"Button",0x50010000,78,210,66,16 // Botão desbloquear
CONTROL "Desbloquear &todos",desblock_all,"Button",0x50010000,148,210,78,16 // Desbloquear todos
END // Fim dos objetos
Pode-se criar estes objetos manualmente (lolz, tem que ter paciência) ou utilizar editores visuais. No Microsoft Visual C++, já existe um editor embutido. Para o DEV C++, pode-se utilizar o ResEd (ótima opção gratuita, que inclusive usei para criar a GUI do programa).
Link: http://www.radasm.com/projects/ResEd.zip (http://www.radasm.com/projects/ResEd.zip)
Bem, acho que é isso...
Bye.