Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#ifdef UNICODE #define _UNICODE #endif /* UNICODE */ #include <windows.h> #include #include <tchar.h> /** * Alloue une zone mémoire en utilisant VirtualAlloc * * @param nSize Taille de la zone à allouer * @return Pointeur sur la zone allouée */ void* __stdcall Mem_Alloc(const DWORD nSize) { return VirtualAlloc(NULL, nSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); } /** * Libère une zone mémoire allouée avec Mem_Alloc * * @param Pointeur sur la zone allouée */ void __stdcall Mem_Free(void *lpAddress) { VirtualFree(lpAddress, 0, MEM_RELEASE); } /** * Affiche le texte indiqué dans la console * * @param lpText Texte à écrire dans la console * @return FALSE en cas de problème */ BOOL __stdcall Con_WriteLn(const TCHAR *lpText) { DWORD nWritten; /* Réception du nombre de caractère écris */ char *lpOemText; /* Texte traduit en OEM */ DWORD nSize; /* Taille du texte à écrire */ BOOL bResult; /* Traduction des caractère àùéè... */ nSize = lstrlen(lpText); /* On aura un \n en plus */ nSize++; lpOemText = (char*)Mem_Alloc(nSize); CharToOem(lpText, lpOemText); lstrcatA(lpOemText, "\n"); bResult = WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), lpOemText, nSize, &nWritten, NULL); Mem_Free(lpOemText); return bResult; } /** * Affiche un message d'erreur correspondant à la dernière erreur Win32 */ DWORD __stdcall Sys_ShowLastError() { DWORD nLastError; /* Numéro de l'erreur */ LPTSTR lpMessageBuffer; /* Récupération du message */ nLastError = GetLastError(); /* Formatage du message */ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (void*)&lpMessageBuffer, 0, NULL); /* Affichage du message */ MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR); LocalFree(lpMessageBuffer); return nLastError; } /** * Convertit un char en TCHAR */ void __stdcall Str_AnsiToTChar(TCHAR* lpBuffer, int nBufferCharCount, char* lpStringToConvert) { #ifdef UNICODE MultiByteToWideChar(CP_ACP, 0, lpStringToConvert, -1, (WCHAR*)lpBuffer, nBufferCharCount); #else lstrcpy(lpBuffer, lpStringToConvert); #endif } /** * Renvoie les infos sur les adapters * * Après utilisation, il faut libérer les infos retournées avec Mem_Free. * Renvoie NULL en cas d'erreur. */ IP_ADAPTER_INFO* __stdcall RetrieveAdaptersInfo() { DWORD nOutBufLen; /* Taille de la zone à allouer pour les infos */ PIP_ADAPTER_INFO lpResult; /* Récupération de la taille à allouer et allocation */ nOutBufLen = 0; GetAdaptersInfo(NULL, &nOutBufLen); lpResult = (PIP_ADAPTER_INFO)Mem_Alloc(nOutBufLen); /* Récupération des infos */ if (GetAdaptersInfo(lpResult, &nOutBufLen) != NO_ERROR) { Mem_Free(lpResult); lpResult = NULL; } return lpResult; } /** * Renvoie les infos sur l'interface * * Après utilisation, il faut libérer les infos retournées avec Mem_Free. * Renvoie NULL en cas d'erreur. */ IP_INTERFACE_INFO* __stdcall RetrieveInterfaceInfo() { DWORD nOutBufLen; /* Taille de la zone à allouer pour les infos */ PIP_INTERFACE_INFO lpResult; /* Récupération de la taille à allouer et allocation */ nOutBufLen = 0; GetAdaptersInfo(NULL, &nOutBufLen); lpResult = (PIP_INTERFACE_INFO)Mem_Alloc(nOutBufLen); /* Récupération des infos */ if (GetInterfaceInfo(lpResult, &nOutBufLen) != NO_ERROR) { Mem_Free(lpResult); lpResult = NULL; } return lpResult; } /** * Affiche la première adresse IP de l'adapter * * Attention, un adapter peut avoir plusieurs adresses. */ void __stdcall DisplayAdapterIp(IP_ADAPTER_INFO* lpAdaptersInfo) { TCHAR lpBuffer[64]; Str_AnsiToTChar(lpBuffer, 64, lpAdaptersInfo->IpAddressList.IpAddress.String); /* lstrcat(lpBuffer, _T("\n")); */ Con_WriteLn(lpBuffer); } /** * Main */ int __cdecl mainCRTStartup() { PIP_ADAPTER_INFO lpAdaptersInfo1; /* Infos les adapters avant changement */ PIP_ADAPTER_INFO lpAdaptersInfo2; /* Infos les adapters après changement */ PIP_INTERFACE_INFO lpInterfaceInfo; /* Infos sur l'interface */ DWORD nReturnValue; /* Vérification des appels */ int nResult; nResult = 1; /* Récupération des infos sur les adapters */ lpAdaptersInfo1 = RetrieveAdaptersInfo(); if (! lpAdaptersInfo1) { Con_WriteLn(_T("Echec de la récupération des infos sur les adapters")); goto the_end; } /* Affichage de la première IP du premier adapter */ DisplayAdapterIp(lpAdaptersInfo1); /* Récupération des infos sur l'interface */ lpInterfaceInfo = RetrieveInterfaceInfo(); if (! lpInterfaceInfo) { Con_WriteLn(_T("Echec de la récupération des infos sur l'interface")); goto free_adapter_info1; } /* Renouvellement de l'IP */ nReturnValue = IpRenewAddress(&lpInterfaceInfo->Adapter[0]); if (nReturnValue != NO_ERROR) { Con_WriteLn(_T("Erreur du renew")); SetLastError(nReturnValue); Sys_ShowLastError(); goto free_adapter_info2; } /* Récupération des infos sur les adapters */ lpAdaptersInfo2 = RetrieveAdaptersInfo(); if (! lpAdaptersInfo2) { Con_WriteLn(_T("Echec de la récupération des infos sur les adapters")); goto free_interface_info; } /* Nouvel affichage de l'IP */ DisplayAdapterIp(lpAdaptersInfo2); nResult = 0; free_adapter_info2: Mem_Free(lpAdaptersInfo2); free_interface_info: Mem_Free(lpInterfaceInfo); free_adapter_info1: Mem_Free(lpAdaptersInfo1); the_end: /* ExitProcess nécessaire car sinon c'est un ExitThread */ ExitProcess(nResult); /* Pour esquiver le warning */ return 0; }