Ты копируешь адрес. В этой строчке будет ошибка доступа к памяти ибо контроль над I/O-пакетом утерян.
x64 Да, вы правы. В таком случае, можно отпустить пакет в этом месте: Address = TDI_data->in_addr; Port = TDI_data->sin_port; IoSkipCurrentIrpStackLocation(Irp); ntstatus = IoCallDriver(DeviceExtension->TopOfDeviceStack, Irp); data.address[0] = (( char *)& Address )[0]; data.address[1] = (( char *)& Address )[1];
Вообще переписал весь код,а результат тот же... Код (Text): .... Сonnect_Request = (PTDI_REQUEST_KERNEL_CONNECT)(&StackIrpPointer->Parameters); Transport_Addrres = (PTRANSPORT_ADDRESS)(TDI_connectRequest->RequestConnectionInformation->RemoteAddress); Ta_Address = &(Transport_Addrres->Address[0]); if(Ta_Address->AddressType == TDI_ADDRESS_TYPE_IP) { Ip_data = (PTDI_ADDRESS_IP)(&Ta_Address->Address[0]); Port = Ip_data->sin_port; Address = Ip_data->in_addr; port = (( char *)& port )[0] + (( char *)& port )[1]; ip.address[0] = (( char *)& address )[0]; ip.address[1] = (( char *)& address )[1]; ip.address[2] = (( char *)& address )[2]; ip.address[3] = (( char *)& address )[3]; ....... Вывод всё тот же : port : 80(HTTP),ip : 123.321.0.0 Может ли такое быть из-за того,что провайдер прокси ставит на соединение?
Вариант по рекомендации х64 : Код (Text): if(StackIrpPointer->MinorFunction == TDI_CONNECT) { TDI_connectRequest = (PTDI_REQUEST_KERNEL_CONNECT)(&StackIrpPointer->Parameters); TDI_ipaddress = (PTA_IP_ADDRESS)(TDI_connectRequest->RequestConnectionInformation->RemoteAddress); TDI_data = (PTDI_ADDRESS_IP)(&TDI_ipaddress->Address[0].Address[0]); port = TDI_data->sin_port; address = TDI_data->in_addr; port = (( char *)& port )[0] + (( char *)& port )[1]; data.address[0] = (( char *)& address )[0]; data.address[1] = (( char *)& address )[1]; data.address[2] = (( char *)& address )[2]; data.address[3] = (( char *)& address )[3]; DbgPrint("type: %d\n",TDI_ipaddress->Address[0].AddressType); DbgPrint("port: %d\n",port); DbgPrint (" ADDRESS %d.%d.%d.%d:%d \r\n",data.address[0],data.address[1],data.address[2],data.address[3]); } Вывод - type :2,port :80,ADDRESS:125.321.0.0 Курю....................
кстати, тестишь на виртуалке ? у меня есть "горький" опыт http://wasm.ru/forum/viewtopic.php?id=36780 тогда попробуй поставить бряк, Код (Text): __asm int 3 ; TDI_data = (PTDI_ADDRESS_IP)(&TDI_ipaddress->Address[0].Address[0]);
А твой фильтр вообще другие адреса-то какие-нибудь показывает? Проверь. Код, я ещё раз повторяю, вроде как правильный. Меня смущает только то, что лично я таких адресов у себя никогда не видел. Расскажи, что ли, про топологию сети и кто конкретно эти адреса использует, какой процесс, какая служба и т.п.