NTSTATUS NTAPI NPF_WSKInitSockets( ) { NTSTATUS status = STATUS_SUCCESS; TRACE_ENTER(); // IPv4 Socket Initialization g_IPv4Socket = WSKCreateSocket(AF_INET, SOCK_RAW, IPPROTO_NPCAP_LOOPBACK, WSK_FLAG_DATAGRAM_SOCKET); if (g_IPv4Socket == NULL) { status = STATUS_UNSUCCESSFUL; TRACE_MESSAGE1(PACKET_DEBUG_LOUD, "NPF_WSKInitSockets()::WSKCreateSocket() failed with status 0x%08X\n", status); TRACE_EXIT(); return status; } g_IPv4LocalAddress.sin_family = AF_INET; g_IPv4LocalAddress.sin_addr.s_addr = INADDR_ANY; // g_IPv4LocalAddress.sin_port = INADDR_PORT; // Bind Required status = WSKBind(g_IPv4Socket, (PSOCKADDR) &g_IPv4LocalAddress); if (!NT_SUCCESS(status)) { TRACE_MESSAGE1(PACKET_DEBUG_LOUD, "NPF_WSKInitSockets()::WSKBind() failed with status 0x%08X\n", status); WSKCloseSocket(g_IPv4Socket); g_IPv4Socket = NULL; TRACE_EXIT(); return status; } g_IPv4RemoteAddress.sin_family = AF_INET; g_IPv4RemoteAddress.sin_addr.s_addr = HTON_LONG(INADDR_LOOPBACK); // g_IPv4RemoteAddress.sin_port = HTON_SHORT(LOG_PORT); //////////////////////////////////////////////////////////////////////////////////////////////////////////// // IPv6 Socket Initialization g_IPv6Socket = WSKCreateSocket(AF_INET6, SOCK_RAW, IPPROTO_NPCAP_LOOPBACK, WSK_FLAG_DATAGRAM_SOCKET); if (g_IPv6Socket == NULL) { status = STATUS_UNSUCCESSFUL; TRACE_MESSAGE1(PACKET_DEBUG_LOUD, "NPF_WSKInitSockets()::WSKCreateSocket() failed with status 0x%08X\n", status); TRACE_EXIT(); return status; } g_IPv6LocalAddress.sin6_family = AF_INET6; struct in6_addr in6AnyAddr = IN6ADDR_ANY_INIT; g_IPv6LocalAddress.sin6_addr = in6AnyAddr; // g_IPv6LocalAddress.sin_port = INADDR_PORT; // Bind Required status = WSKBind(g_IPv6Socket, (PSOCKADDR) &g_IPv6LocalAddress); if (!NT_SUCCESS(status)) { TRACE_MESSAGE1(PACKET_DEBUG_LOUD, "NPF_WSKInitSockets()::WSKBind() failed with status 0x%08X\n", status); WSKCloseSocket(g_IPv6Socket); g_IPv6Socket = NULL; TRACE_EXIT(); return status; } g_IPv6RemoteAddress.sin6_family = AF_INET6; struct in6_addr in6LoopbackAddr = IN6ADDR_LOOPBACK_INIT; g_IPv6RemoteAddress.sin6_addr = in6LoopbackAddr; // g_IPv6RemoteAddress.sin_port = HTON_SHORT(LOG_PORT); TRACE_EXIT(); return status; }
// Driver entry routine NTSTATUS DriverEntry( __in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath ) { NTSTATUS status = STATUS_SUCCESS; SOCKADDR_IN LocalAddress = {0,}; SOCKADDR_IN RemoteAddress = {0,}; LONG BufferSize = 0; CHAR GreetMessage[] = "Hello there\r\n"; //PWSK_SOCKET Socket = NULL; UNREFERENCED_PARAMETER(RegistryPath); PAGED_CODE(); DriverObject->DriverUnload = WskudpUnload; status = WSKStartup(); g_UdpSocket = CreateSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, WSK_FLAG_DATAGRAM_SOCKET); if (g_UdpSocket == NULL) { DbgPrint("DriverEntry(): CreateSocket() returned NULL\n"); return (status = STATUS_UNSUCCESSFUL); } LocalAddress.sin_family = AF_INET; LocalAddress.sin_addr.s_addr = INADDR_ANY; //LocalAddress.sin_port = INADDR_PORT; // Bind Required status = Bind(g_UdpSocket, (PSOCKADDR)&LocalAddress); if (!NT_SUCCESS(status)) { DbgPrint("Bind() failed with status 0x%08X\n", status); CloseSocket(g_UdpSocket); return status; } RemoteAddress.sin_family = AF_INET; RemoteAddress.sin_addr.s_addr = HTON_LONG(INADDR_LOOPBACK);//HTON_LONG(0xc0a802a2);//HTON_LONG(INADDR_LOOPBACK); RemoteAddress.sin_port = HTON_SHORT(LOG_PORT); if (SendTo(g_UdpSocket, GreetMessage, sizeof(GreetMessage)-1, (PSOCKADDR)&RemoteAddress) == sizeof(GreetMessage)-1) { } else { } CloseSocket(g_UdpSocket); // Initialize software tracing WPP_INIT_TRACING(DriverObject, RegistryPath); DoTraceMessage(TRCINFO, "LOADED"); return status; }