bonjour à tous !!!
Voila une petire source de scanner réseau.
Ce scanner permet:
- ping + traitement des machines (évaluation du ttl)
- requête pour adresse mac
- requête résolution DNS
- scanne de port TCP en connect() (je sais ces long)
- récupération des partages distants
Réglages:
- sauvegarde de la configuration
- choix de désactiver la résolution DNS
- choix de fichier de log de rapport de scanne
- choix de récupération d'un certains nombres de ports ouverts
- choix de récupération des partages réseaux
- définition du nombre de threads simultanées : 100max
- définition du Time Out du Ping
Pour les utilisations:
Sémaphores, zones critiques, threads, ListView, ProgressBAR, IPAddress, redimmension de l'application, application d'icone à la fenêtre, etc...
Le code fonctionne sous DEV, borland et vcc (appriori sans grosse modifications :p
L'exe est dans le zip, il suffit de renommer "SpeedScan.ex" en "SpeedScan.exe"
Toutes les critiques sont bonne à prendre :)
toutes ces informations peuvent bien sur être contournées, mais permet d'avoir un apercu assez rapide du réseau :)
Source / Exemple :
//------------------------------------------------------------------------------
// Projet SpeedScan : Scanner réseau
// Auteur : Hanteville Nicolas
// Fichier : proc.c
// Version : 0.5
// Date de modification : 03/09/2007
// Description : procédure & fonctions de scan et de traitement
//------------------------------------------------------------------------------
#include "ressources.h"
//******************************************************************************
//fonction de tri barbar
//******************************************************************************
short EstPlusGrand(char*ip1,char*ip2)
{
unsigned short tailleIp1 = strlen(ip1);
unsigned short tailleIp2 = strlen(ip2);
unsigned short i;
//on test la longueur
if (tailleIp1 != tailleIp2)
{
if (tailleIp1>tailleIp2) return 1;
else return 0;
}else
{
//sinon test par numéro
if (tailleIp1 == 0) return -1;
for (i=0;i<tailleIp1;i++)
{
if (ip1[i] > ip2[i]) return 1;
if (ip1[i] < ip2[i]) return 0;
}
return -1;
}
}
//******************************************************************************
//déplacer 2 lignes
//******************************************************************************
void DeplacerLignes(unsigned int ligne1,unsigned int ligne2)
{
char tmp1[VAR_TMP];
char tmp2[VAR_TMP];
unsigned short i=0;
while (i <nb_COL)
{
ListView_GetItemText(hListView,ligne1,i,tmp1,VAR_TMP);
ListView_GetItemText(hListView,ligne2,i,tmp2,VAR_TMP);
ListView_SetItemText(hListView,ligne1,i,tmp2);
ListView_SetItemText(hListView,ligne2,i,tmp1);
i++;
}
}
//******************************************************************************
//boucle de tri des items (barbare)
//******************************************************************************
void Tri()
{
short nbitem = ListView_GetItemCount(hListView)-1;
char tmp1[VAR_TMP];
char tmp2[VAR_TMP];
unsigned int i,j;
if (nbitem>-1)
{
for (j=0;j<nbitem;j++)
{
for (i=0;i<nbitem;i++)
{
//récupération de l'item actuel + item après
ListView_GetItemText(hListView,i,COL_IP,tmp1,VAR_TMP);
ListView_GetItemText(hListView,i+1,COL_IP,tmp2,VAR_TMP);
if (EstPlusGrand(tmp1,tmp2) == 1)DeplacerLignes(i,i+1);
}
}
}
}
//******************************************************************************
//activer désactiver composants editables
//******************************************************************************
void ActiveEdits(BOOL etat)
{
EnableWindow(IP_DEBUT,etat);
EnableWindow(IP_FIN,etat);
EnableWindow(TOMS,etat);
EnableWindow(NB_Threads,etat);
EnableWindow(H_Log,etat);
EnableWindow(H_COL_PARTAGES,etat);
EnableWindow(H_COL_PORTS,etat);
EnableWindow(H_DNS,etat);
}
//******************************************************************************
//scanne de port non rapide
//******************************************************************************
void Liste_Port(LCONFLIGNE Lligneconf)
{
unsigned short LPorts[38]={7,13,20,21,22,23,25,33,37,38,42,43,53,69,70,79,80,88,93,107,110,118,119,123,134,137,138,139
,143,153,156,161,170,443,445,469,0};
unsigned short i=0;
SOCKET sock;
SOCKADDR_IN sin;
char tmp[256]="";
char tmp2[256]="";
char tmp_i[4]="";
sock = socket(AF_INET, SOCK_STREAM, 0);
while (LPorts[i] && activescan)
{
sin.sin_addr.s_addr = inet_addr(Lligneconf.ip);
sin.sin_family = AF_INET;
sin.sin_port = htons(LPorts[i]);
strcpy(tmp2,"port:");
EnterCriticalSection(&Sync);
strcat(tmp2,itoa(LPorts[i],tmp_i,10));
strcat(tmp2,"\0");
ListView_SetItemText(hListView,Lligneconf.ligne,COL_INFOS,tmp2);
LeaveCriticalSection(&Sync);
if((connect(sock,(struct sockaddr*)&sin,sizeof(struct sockaddr))) == 0)
{
strcat(tmp,itoa(LPorts[i],tmp_i,10));
strcat(tmp," ");
}
i++;
}
closesocket(sock);
strcat(tmp,"\0");
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,Lligneconf.ligne,COL_PORTS,tmp);
LeaveCriticalSection(&Sync);
}
//******************************************************************************
//permet de retourner les partages comptenues sur une machines dans la case d'une colonne
//******************************************************************************
BOOL Partages(char *ip,unsigned int item)
{
NET_API_STATUS res;
char tmp[VAR_TMP];
char tmp_fin[TAILLE_MAX];
wchar_t server[VAR_TMP];
PSHARE_INFO_1 BufPtr,p;
DWORD er=0,tr=0,resume=0;
unsigned short i;
//init de la chaine pour récupération des partages
sprintf(tmp,"\\\\%s",ip);//ici on implémente l'ip avec scan de toute le réseau proche et de leurs partages
mbstowcs( server,tmp, VAR_TMP );//implémentation pour transformation et utilisation
//init chaine finale
tmp_fin[0]=0;
//récupération des partages et indentation dans la chaine
do
{
res = NetShareEnum (server, 1, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);//NULL renvoie la machine locale
if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA)
{
p=BufPtr;
for(i=1;i<=er;i++)
{
sprintf(tmp,"%S | ",p->shi1_netname);
strcat(tmp_fin,tmp);
p++;
}
NetApiBufferFree(BufPtr);
}
}while(res==ERROR_MORE_DATA && activescan);
strcat(tmp_fin,"\0");
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,item,COL_PARTAGES,tmp_fin);
LeaveCriticalSection(&Sync);
return 0;
}
//******************************************************************************
// verifie si le fichier existe
//******************************************************************************
int FichierExiste(char *fichierTest)
{
WIN32_FIND_DATA data;
HANDLE hF = FindFirstFile(fichierTest, &data);
if(hF == INVALID_HANDLE_VALUE)
return 0;
FindClose(hF);
return 1;
};
//******************************************************************************
// init des threads + KILL si encore en cours
//******************************************************************************
DWORD WINAPI InitEtKillThreads(LPVOID lParam)
{
unsigned short i;
DWORD IDThread;
char tmp[MAX_TOMS];
EnableWindow(BScanner,FALSE);
//_sleep(1000);// 1 seconde
GetExitCodeThread(ThKey,&IDThread);
TerminateThread(ThKey,IDThread);
while (StartBlogTestError>0)_sleep(100);
SendMessage(ProgressBAR, PBM_SETPOS, (WPARAM)0, 0);
SendMessage(ProgressBAR2, PBM_SETPOS, (WPARAM)0,0);
CloseHandle(hSemaphore);
CloseHandle(hSemaphore2);
//init état des composants
ActiveEdits(TRUE);
EnableWindow(BScanner,TRUE);
//init bouton de scan
SetWindowText(BScanner,TXT_LFR_BT_SCAN);
//init de la fenêtre
snprintf(tmp,TAILLE_TITRE_TEXTE,"%s OK %d %s\0",NOM_APPLI,ListView_GetItemCount(hListView),TXT_LFR_MSG_ETAT_SCAN);
SetWindowText(hwnd,tmp);
//écriture dans la fichier de log
if (EtatLogs) CreateThread(0,0,EcrireCTR,0,0,0);
DeleteCriticalSection(&Sync);
activescan=0;
//on libère la mémoire
WSACleanup();
};
//******************************************************************************
// Récupération d'une adresse mac: tiré de la msdn:
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/sendarp.asp
//******************************************************************************
int __cdecl RecupMacAdress(char * ip,char *macadress)
{
//variables
IPAddr ipAddr;
ULONG pulMac[2];
ULONG ulLen;
//transformation pour traitement de l'adresse ip
ipAddr = inet_addr (ip);
//init
memset (pulMac, 0xff, sizeof (pulMac));
ulLen = 6;
//on récupère l'adresse mac ici si possible (si après un routage type internet = impossible)
if (SendARP (ipAddr, 0, pulMac, &ulLen)==NO_ERROR)
{
PBYTE pbHexMac = (PBYTE) pulMac;
snprintf (macadress,25,"%02X:%02X:%02X:%02X:%02X:%02X\0",pbHexMac[0],pbHexMac[1],pbHexMac[2],pbHexMac[3],pbHexMac[4],pbHexMac[5],pbHexMac[6] /*szMac*/);
return 1;
}
sprintf(macadress,TXT_LFR_MSG_ERROR);
return 0;
}
//******************************************************************************
// Ping d'une ip + traitement IP + MAC + nom + TTL + OS
//******************************************************************************
DWORD WINAPI Ping(LPVOID lParam)
{
LVITEM lvi;
LCONFLIGNE Lligneconf;
struct hostent* remoteHost;
struct in_addr in;
struct in_addr iaDest;
LPHOSTENT pHost;
DWORD *dwAddress;
HANDLE hndlFile;
ICMPECHO icmpEcho;
BOOL reqArp =1;
char tmp[VAR_TMP];
int itemPos;
HANDLE hndlIcmp;
HANDLE (WINAPI *pIcmpCreateFile)(VOID);
BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
DWORD (WINAPI *pIcmpSendEcho) (HANDLE,DWORD,LPVOID,WORD, PIPINFO, LPVOID,DWORD,DWORD);
strcpy((char*)Lligneconf.ip,(char*)lParam);
ReleaseSemaphore(hSemaphore,1,NULL);
EnterCriticalSection(&Sync);
StartBlogTestError++;
LeaveCriticalSection(&Sync);
WaitForSingleObject(hSemaphore2,INFINITE);
//init de la config
iaDest.s_addr = inet_addr(Lligneconf.ip);
pHost = gethostbyname(Lligneconf.ip);
// copie de l'ip a pinger
dwAddress = (DWORD *)(*pHost->h_addr_list);
EnterCriticalSection(&Sync);
if ((hndlIcmp = LoadLibrary("ICMP.DLL"))!=0)
{
//fonctions pointeurs de la DLL
//récupération d'un pointeur vers chacune de ces fonctions fonctions
pIcmpCreateFile = (HANDLE (WINAPI *)(void))GetProcAddress((HMODULE)hndlIcmp,"IcmpCreateFile");
pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))GetProcAddress((HMODULE)hndlIcmp,"IcmpCloseHandle");
pIcmpSendEcho = (DWORD (WINAPI *)(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD)) GetProcAddress((HMODULE)hndlIcmp,"IcmpSendEcho");
LeaveCriticalSection(&Sync);
if (pIcmpCreateFile!=0 && pIcmpCloseHandle!=0 && pIcmpSendEcho!=0)
{
// récupéré un handle sur le reply
if ((hndlFile = pIcmpCreateFile())!= INVALID_HANDLE_VALUE)
{
pIcmpSendEcho(
hndlFile,
0,
0,
0,
&icmpEcho,
sizeof(icmpEcho),
Toms);
//si Ok
if ((icmpEcho.Status==0)&&(icmpEcho.Options.Ttl>0))
{
reqArp =0;
//ajout d'une ligne
lvi.mask = LVIF_TEXT|LVIF_PARAM;
lvi.iSubItem = 0;
lvi.lParam = LVM_SORTITEMS;
lvi.pszText="";
EnterCriticalSection(&Sync);
lvi.iItem = NB_Machines++;
itemPos=ListView_InsertItem(hListView, &lvi);
ListView_SetItemText(hListView,itemPos,COL_INFOS,"PING");
LeaveCriticalSection(&Sync);
Lligneconf.ligne = (unsigned long)itemPos;
//ip
tmp[0]='[';
tmp[1]=0;
strcat(tmp,Lligneconf.ip);
strcat(tmp,"]\0");
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_IP,tmp);
LeaveCriticalSection(&Sync);
//ttl
sprintf(tmp,"TTL:%d",icmpEcho.Options.Ttl);
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_TTL,tmp);
//OS
if (icmpEcho.Options.Ttl<=MACH_LINUX)//linux
{
ListView_SetItemText(hListView,itemPos,COL_OS,TXT_LFR_MSG_LINUX);
}else if (icmpEcho.Options.Ttl<=MACH_WINDOWS)//windows
{
ListView_SetItemText(hListView,itemPos,COL_OS,TXT_LFR_MSG_WIN);
}else //routeur
{
ListView_SetItemText(hListView,itemPos,COL_OS,TXT_LFR_MSG_ROUTEUR);
};
LeaveCriticalSection(&Sync);
//DNS
if (EtatDns)
{
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_INFOS,"DNS");
LeaveCriticalSection(&Sync);
in.s_addr = inet_addr(Lligneconf.ip);
if ((remoteHost=gethostbyaddr((char *)&in, 4, AF_INET))!=0)
strncpy(tmp,remoteHost->h_name,VAR_TMP);
else
strcpy(tmp,TXT_LFR_MSG_ERROR);
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_NOM,tmp);
LeaveCriticalSection(&Sync);
}
//adresse mac
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_INFOS,"ARP");
LeaveCriticalSection(&Sync);
if (RecupMacAdress(Lligneconf.ip,tmp))
{
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_MAC,tmp);
LeaveCriticalSection(&Sync);
}else
{
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_MAC,TXT_LFR_MSG_ERROR);
LeaveCriticalSection(&Sync);
}
//partages
if (EtatPartages)
{
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_INFOS,"Partages");
LeaveCriticalSection(&Sync);
Partages(Lligneconf.ip,Lligneconf.ligne);
}
}
pIcmpCloseHandle(hndlFile);
}
}
FreeLibrary((HMODULE)hndlIcmp);//libère la DLL
}else LeaveCriticalSection(&Sync);
if (reqArp)//on a pas trouver en ping on fait par requète arp
{
if (RecupMacAdress(Lligneconf.ip,tmp))
{
//ok la machine existe
int itemPos;
//ajout d'une ligne
lvi.mask = LVIF_TEXT|LVIF_PARAM;
lvi.iSubItem = 0;
lvi.lParam = LVM_SORTITEMS;
lvi.pszText="";
lvi.iItem = NB_Machines++;
EnterCriticalSection(&Sync);
itemPos=ListView_InsertItem(hListView, &lvi);
ListView_SetItemText(hListView,itemPos,COL_INFOS,"ARP");
LeaveCriticalSection(&Sync);
Lligneconf.ligne = (unsigned long)itemPos;
//mac
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_MAC,tmp);
LeaveCriticalSection(&Sync);
//ip
tmp[0]='[';
tmp[1]=0;
strcat(tmp,Lligneconf.ip);
strcat(tmp,"]\0");
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_IP,tmp);
LeaveCriticalSection(&Sync);
//on récupère le nom de la machine / DNS
if (EtatDns)
{
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_INFOS,"DNS");
LeaveCriticalSection(&Sync);
in.s_addr = inet_addr(Lligneconf.ip);
if ((remoteHost=gethostbyaddr((char *)&in, 4, AF_INET))!=0)
{
strncpy(tmp,remoteHost->h_name,VAR_TMP);
}else
{
strcpy(tmp,TXT_LFR_MSG_ERROR);
};
}
EnterCriticalSection(&Sync);
//DNS
if (EtatDns)
ListView_SetItemText(hListView,itemPos,COL_NOM,tmp);
//OS
ListView_SetItemText(hListView,itemPos,COL_OS,"FIREWALL");
//TTL
ListView_SetItemText(hListView,itemPos,COL_TTL,"TTL:---");
ListView_SetItemText(hListView,itemPos,COL_INFOS,"OK");
LeaveCriticalSection(&Sync);
reqArp =0;
}
}
//liste des ports
if (reqArp ==0 && EtatPorts)
{
EnterCriticalSection(&Sync);
ListView_SetItemText(hListView,itemPos,COL_INFOS,"PORTS");
LeaveCriticalSection(&Sync);
Liste_Port(Lligneconf);
}
EnterCriticalSection(&Sync);
//info de chargement
SendMessage(ProgressBAR2, PBM_SETPOS, (WPARAM)(++nb*100)/max,0);
StartBlogTestError--;
ListView_SetItemText(hListView,itemPos,COL_INFOS,"OK");
LeaveCriticalSection(&Sync);
ReleaseSemaphore(hSemaphore2,1,NULL);
return 0;
};
//******************************************************************************
// Scan : traitement des ip a scanner
//******************************************************************************
DWORD WINAPI ScanReseau(LPVOID lParam)
{
//récupération des 2 ip d'intervales
DWORD LIp1,LIp2;
BYTE L11,L12,L13,L14,L21,L22,L23,L24;
char tmp[MAX_TOMS];
char tmp2[MAX_TOMS];
WSADATA WSAData;
int j=0,i=0;
WSAStartup(0x02, &WSAData );
StartBlogTestError=0;
//init
max=0;
nb=0;
//init des threads
NB_Machines=0; //init du nombre de machines
//instance du Time out
GetWindowText(TOMS,tmp,50);
Toms=atoi(tmp);
if (Toms>MAX_TOMS)
{
SetWindowText(TOMS,"10000");
Toms = MAX_TOMS;
}else if (Toms<1)
{
SetWindowText(TOMS,"500");
Toms = 500;
}
//instance du nombre de threads
GetWindowText(NB_Threads,tmp,50);
NB_MAX_THREAD=atoi(tmp);
if (NB_MAX_THREAD>MAX_THREADS)
{
SetWindowText(NB_Threads,"1000");
NB_MAX_THREAD = MAX_THREADS;
}else if (NB_MAX_THREAD<1)
{
SetWindowText(NB_Threads,"10");
NB_MAX_THREAD = 10;
}
//récupération du comptenu des champs
SendMessage(IP_DEBUT,IPM_GETADDRESS, 0 ,(LPARAM) &LIp1);
SendMessage(IP_FIN,IPM_GETADDRESS, 0 ,(LPARAM) &LIp2);
//on récupère chacun des bits
L11 = LIp1 >> 24;
L12 = (LIp1 >> 16) & 0xFF;
L13 = (LIp1 >> 8) & 0xFF;
L14 = LIp1 & 0xFF;
L21 = LIp2 >> 24;
L22 = (LIp2 >> 16) & 0xFF;
L23 = (LIp2 >> 8) & 0xFF;
L24 = LIp2 & 0xFF;
hSemaphore=CreateSemaphore(NULL,1,1,NULL);
hSemaphore2=CreateSemaphore(NULL,NB_MAX_THREAD,NB_MAX_THREAD,NULL);
//test de la validité des ip
if (LIp1!=0 && L14 >0 && L14 < 255 && L13 <255 && L12 <255 && L11<255 || LIp2!=0 && L24 >0 && L24 < 255 && L23 <255 && L22 <255 && L21<255)
{
if (LIp1 == 0 || LIp1 == LIp2)
{
max = 1;
//alors on ajoute seulement 1 ip: le 2
WaitForSingleObject(hSemaphore,INFINITE);
sprintf(tmp,"%d.%d.%d.%d",L21,L22,L23,L24);
CreateThread(NULL,0,Ping,tmp,0,0);
}else if (LIp2 == 0 && L14 >0 && L14 < 255 && L13 <255 && L12 <255 && L11<255)
{
max = 1;
//alors on ajoute seulement 1 ip: le 1
WaitForSingleObject(hSemaphore,INFINITE);
sprintf(tmp,"%d.%d.%d.%d",L11,L12,L13,L14);
CreateThread(NULL,0,Ping,tmp,0,0);
}else
{
if ( L21>=L11 && (L22>=L12 || L21>L11 && L12 > L22) && (L23>=L13 || (L22>L12 || L21>L11)&& L13 > L23) && (L24>=L14 || (L23>L13 || L22>L12 || L21>L11)&& L14 > L24))
{
//calcul de max
max=((L21-L11)*(255*255*255))+1;//octet 1
if (L12<=L22)//octet 2
max+=(L22-L12)*(255*255);
else
max+=((255-L12)+L22)*(255*255);
if (L13<=L23)//octet 3
max+=(L23-L13)*(255);
else
max+=((255-L13)+L23)*(255);
if (L14<=L24)//octet 4
max+=(L24-L14);
else
max+=((255-L14)+L24);
//on ajoute en boucle les ip
while (L21>=L11)
{
while (L22>=L12 || L12<255 && L21>L11)
{
while (L23>=L13 || L13<255 && (L22>L12 || L21>L11))
{
while (L24>=L14 || L14<255 && (L22>L12 || L21>L11 || L23>L13))
{
while (StartBlogTestError > NB_MAX_THREAD)_sleep(10);
WaitForSingleObject(hSemaphore,INFINITE);
sprintf(tmp,"%d.%d.%d.%d",L11,L12,L13,L14);
CreateThread(NULL,0,Ping,tmp,0,0);
j++;
L14++;
snprintf(tmp2,TAILLE_TITRE_TEXTE,"%s [%s] %d/%d",NOM_APPLI,tmp,j,max);
SetWindowText(hwnd,tmp2);
//progression
SendMessage(ProgressBAR, PBM_SETPOS, (WPARAM)j*100/max, 0);
}
L13++;
L14=1;
}
L12++;
L13=0;
}
L11++;
L12 =0;
}
}else MessageBox(hwnd,"Interval d'IP non valide!","Erreur",MB_OK);
}
}else MessageBox(hwnd,"Interval d'IP non valide!","Erreur",MB_OK);
//on attend que tous les threads soient fini pour dir que le scan est fini
while (StartBlogTestError>0)_sleep(100);
WaitForSingleObject(hSemaphore2,0);
ReleaseSemaphore(hSemaphore2,1,NULL);
CloseHandle(hSemaphore);
CloseHandle(hSemaphore2);
//fin du scan
SendMessage(ProgressBAR, PBM_SETPOS, (WPARAM)100, 0);
//init état des composants
ActiveEdits(TRUE);
_sleep(100);
//init des progresse bar
SendMessage(ProgressBAR, PBM_SETPOS, (WPARAM)0, 0);
SendMessage(ProgressBAR2, PBM_SETPOS, (WPARAM)0,0);
//init bouton de scan
SetWindowText(BScanner,TXT_LFR_BT_SCAN);
//init de la fenêtre
snprintf(tmp,TAILLE_TITRE_TEXTE,"%s OK %d %s\0",NOM_APPLI,ListView_GetItemCount(hListView),TXT_LFR_MSG_ETAT_SCAN);
SetWindowText(hwnd,tmp);
Tri();
//écriture dans la fichier de log
if (EtatLogs) EcrireCTR(0);
activescan=0;
//on libère la mémoire
WSACleanup();
return 0;
}
//******************************************************************************
// écrire dans un fichier txt le rapport
//******************************************************************************
DWORD WINAPI EcrireCTR(LPVOID lParam)
{
//variables
char tmp[EXTRA_TMP];
char var[TAILLE_MAX];
int NBLigne;
int ligne,colonne;
time_t dateEtHMs;//structure de la date
int taille;
DWORD copiee;
// on récupère le nombre de lignes
NBLigne=ListView_GetItemCount(hListView);
//ouverture du fichier et écriture à la suite
HANDLE HLog = CreateFile(NOMFICLOG,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
//on se place a la fin du fichier
SetFilePointer(HLog,GetFileSize(HLog,NULL),0,FILE_BEGIN);
if (HLog == INVALID_HANDLE_VALUE || NBLigne==0)
{
CloseHandle(HLog);
return FALSE;
}
//entête
time(&dateEtHMs);//nombre d'item + recuperation de l'heure et la date actuelle
snprintf(tmp,EXTRA_TMP,"\r\n\r\n|%s\t\t%s: %d\t\t%s: %s |\r\n",NOM_APPLI,NB_MACHINES,NBLigne,TXT_LFR_MSG_DATE_SCAN,(char *)ctime(&dateEtHMs));
tmp[strlen(tmp)-29]=' '; //gestion du retour à la ligne après la date
WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
WriteFile(HLog,"|-------------------------------------------------------------------------------------------------------------------------------|\r\n",131,&copiee,0);
snprintf(tmp,EXTRA_TMP,"|%s\t\t\t\t\t|%s\t\t|%s\t\t\t\t|%s\t\t\t|%s\t\t\t|\r\n",TXT_LFR_BTLST_IP,TXT_LFR_BTLST_MAC,TXT_LFR_BTLST_NOM,TXT_LFR_BTLST_TTL,TXT_LFR_BTLST_OS);
WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
WriteFile(HLog,"|-------------------------------------------------------------------------------------------------------------------------------|\r\n",131,&copiee,0);
snprintf(tmp,EXTRA_TMP,"|");
// on récupère les items un par un , par ligne et on les met dans une variable ligne puis écriture
for (ligne=0;ligne<NBLigne;ligne++)
{
for (colonne=0;colonne<NB_COLONNE;colonne++)
{
ListView_GetItemText(hListView,ligne,colonne,var,TAILLE_MAX);
taille = strlen(var);
//gestion affichage des colonnes
if (taille<15&&colonne==0)
snprintf(tmp,EXTRA_TMP,"%s%s\t\t|",tmp,var);
else if (taille==0&&colonne>2)
snprintf(tmp,EXTRA_TMP,"%s%s\t\t\t|",tmp,var);
else if ((taille<5)&&(colonne<3))
snprintf(tmp,EXTRA_TMP,"%s%s\t\t\t\t|",tmp,var);
else if ((taille<7)&&(colonne<3))//7
snprintf(tmp,EXTRA_TMP,"%s%s\t\t\t|",tmp,var);
else if ((colonne!=0)&&(taille<11)||(taille<16)&&(colonne<3)&&(colonne!=0)||(taille<7)&&(colonne>2))
snprintf(tmp,EXTRA_TMP,"%s%s\t\t|",tmp,var);
else if (taille<23)
snprintf(tmp,EXTRA_TMP,"%s%s\t|",tmp,var);
else
snprintf(tmp,EXTRA_TMP,"%s%s|",tmp,var);
}
snprintf(tmp,EXTRA_TMP,"%s\r\n|",tmp);
WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
//ici on ajoute la gestion des partages et des ports
if(EtatPorts)
{
ListView_GetItemText(hListView,ligne,COL_PORTS,var,TAILLE_MAX);
if (strlen(var)>1)
{
snprintf(tmp,EXTRA_TMP,"Liste des ports ouverts standards:%s\r\n|",var);
WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
}
}
if(EtatPartages)
{
ListView_GetItemText(hListView,ligne,COL_PARTAGES,var,TAILLE_MAX);
if (strlen(var)>1)
{
snprintf(tmp,EXTRA_TMP,"Liste des partages:%s\r\n|",var);
WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
}
}
tmp[0]=0;
}
WriteFile(HLog,"-------------------------------------------------------------------------------------------------------------------------------|\r\n",130,&copiee,0);
CloseHandle(HLog);
return 0;
};
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.