Есть драйвер NDIS, как мне взять свой IP адрес кроме копания реестра ? Вопрос непростой, т.к. потокол IP и драйвер лежат на разных уровнях OSI (это к теме EvilsInterrupt)
К сожалению не подходит Если машину с драйвером использовать как шлюз, то... Это для firewall, что бы обрабатывать правила типа add 100 allow ip from me to any Когда у машины динамический IP
Имхо можно узнать MAC (по тем же пакетам) а зная его, определить IP. Возьми какой-нибудь сниффер и посмотри в каком пакете приходит IP. Может получится. Хотя имхо зачем заморачиваться на NDIS если можно выцепить из юзер-моде или настроек винды
Вот кусок кода вытаскивающий адрес из реестра: Код (Text): PUNICODE_STRING uAdapName = Adapter->MyOpenBlock->RootDeviceName; PWCHAR p = RVATOVA(uAdapName->Buffer, uAdapName->Length << 1); UNICODE_STRING uName; OBJECT_ATTRIBUTES obj; HANDLE KeyHandle; if (Adapter->Type != NdisMedium802_3) return; while (*(p-1) != '\\') p--; DbgPrint("Adap %ws %ws", p, Adapter->MyOpenBlock->BindDeviceName->Buffer); swprintf(Name, L"\\registry\\machine\\system\\CurrentControlSet\\Services\\Tcpip\\Par ameters\\Interfaces\\%ws", p); RtlInitUnicodeString(&uName, Name); InitializeObjectAttributes( &obj, &uName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL ); status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &obj); if (NT_SUCCESS(status)) { Adapter->IpAddress = ReadIpAddress(KeyHandle, L"IPAddress"); if (!Adapter->IpAddress) { Adapter->IpAddress = ReadIpAddress(KeyHandle, L"DhcpIPAddress"); DbgPrint("Get dhcp ip"); } Adapter->SubnetMask = ReadIpAddress(KeyHandle, L"SubnetMask"); if (!Adapter->SubnetMask) { Adapter->SubnetMask = ReadIpAddress(KeyHandle, L"DhcpSubnetMask"); } Adapter->Gateway = ReadIpAddress(KeyHandle, L"DefaultGateway"); ZwClose(KeyHandle); } ULONG ReadIpAddress( IN HANDLE KeyHandle, IN PWCHAR ValName ) { UNICODE_STRING uName; WCHAR Name[MAX_PATH]; PKEY_VALUE_PARTIAL_INFORMATION Info = (void*)&Name; CHAR aName[MAX_PATH]; ULONG ResLen; RtlInitUnicodeString(&uName, ValName); ZwQueryValueKey( KeyHandle, &uName, KeyValuePartialInformation, Info, sizeof(Name), &ResLen ); wcstombs(aName, (PWCHAR)&Info->Data, -1); return inet_addr(aName); } u32_t inet_addr(const char *cp) { u32_t address; u32_t shift; u32_t sym; address = 0; shift = 0; while (*cp) { sym = 0; while ((*cp != '.') && (*cp != '\0')) { if ((*cp < '0') || (*cp > '9')) return 0; sym = sym*10 + (u32_t)(*cp - '0'); ++cp; } address += sym << shift; shift += 8; if (*cp++ == '\0') break; } return address; } Извини за беспорядочные куски кода, просто я их вытаскивал из своей программы.
Ms Rem Спасибо Не люблю копаться в реестре... Придётся всё таки вместо одного правила делать 2 или 3, в зависимости от кол-ва адаптеров или в реестр лезть... Во фре предупреждали - использование "me" влечёт большие вычислительные расходы