Hello, I've been interested in kernel development lately, I'm working on a driver that uses WSK. So what I want is to connect to here -> (http://192.168.0.106:8080)
Under the code is a screenshot of what happens
#include <ntifs.h>
#include <ntddk.h>
#include <stdio.h>
#include <wsk.h>
#include <windef.h>
#define ADDR "192.168.0.104"
#define PORT 8080
#define WSK_WAIT_TIMEOUT 15
const WSK_CLIENT_DISPATCH WskAppDispatch = {
MAKE_WSK_VERSION(1,0),
0,
NULL
};
typedef struct _WSK_APP_SOCKET_CONTEXT {
PWSK_SOCKET Socket;
SOCKADDR_IN localAddr;
} WSK_APP_SOCKET_CONTEXT, * PWSK_APP_SOCKET_CONTEXT;
WSK_APP_SOCKET_CONTEXT sockContext;
WSK_REGISTRATION wskRegistration;
WSK_PROVIDER_NPI wskProviderNpi;
NTSTATUS SyncIrpCompRtn(PDEVICE_OBJECT Reserved, PIRP Irp, PVOID Context) {
PKEVENT compEvent = (PKEVENT)Context;
if (Irp->PendingReturned) {
KeSetEvent(compEvent, 2, FALSE);
}
return STATUS_MORE_PROCESSING_REQUIRED;
}
NTSTATUS CreateSocketComplete(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context);
NTSTATUS CreateSocket(PWSK_PROVIDER_NPI WskProviderNpi, PWSK_APP_SOCKET_CONTEXT socketContext) {
PIRP Irp;
NTSTATUS status;
//KEVENT compEvent;
//KeInitializeEvent(&compEvent, SynchronizationEvent, FALSE);
Irp = IoAllocateIrp(1, FALSE);
if (!Irp) {
return STATUS_INSUFFICIENT_RESOURCES;
}
//IoSetCompletionRoutine(Irp, SyncIrpCompRtn, &compEvent, TRUE, TRUE, TRUE);
IoSetCompletionRoutine(Irp, CreateSocketComplete, socketContext, TRUE, TRUE, TRUE);
status = WskProviderNpi->Dispatch->WskSocket(WskProviderNpi->Client, AF_INET, SOCK_STREAM, IPPROTO_TCP, WSK_FLAG_CONNECTION_SOCKET, NULL, NULL, NULL, NULL, NULL, Irp);
/*if (status == STATUS_PENDING) {
KeWaitForSingleObject(&compEvent, Executive, KernelMode, FALSE, NULL);
}
status = Irp->IoStatus.Status;
IoFreeIrp(Irp);
*/
return status;
}
NTSTATUS CreateSocketComplete(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context) {
UNREFERENCED_PARAMETER(DeviceObject);
UNREFERENCED_PARAMETER(Context);
if (Irp->IoStatus.Status == STATUS_SUCCESS) {
sockContext.Socket = (PWSK_SOCKET)(Irp->IoStatus.Information);
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[CreateSocketComplete] Socket creation success\n"));
}
else {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[CreateSocketComplete] Socket creation failed\n"));
}
IoFreeIrp(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
NTSTATUS BindSocketComplete(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context);
NTSTATUS BindSocket(PWSK_SOCKET Socket, SOCKADDR_IN localAddr) {
PWSK_PROVIDER_CONNECTION_DISPATCH Dispatch;
PIRP Irp;
NTSTATUS status;
//KEVENT compEvent;
//KeInitializeEvent(&compEvent, SynchronizationEvent, FALSE);
Dispatch = (PWSK_PROVIDER_CONNECTION_DISPATCH)(Socket->Dispatch);
Irp = IoAllocateIrp(1, FALSE);
if (!Irp) {
return STATUS_INSUFFICIENT_RESOURCES;
}
//IoSetCompletionRoutine(Irp, SyncIrpCompRtn, &compEvent, TRUE, TRUE, TRUE);
IoSetCompletionRoutine(Irp, BindSocketComplete, Socket, TRUE, TRUE, TRUE);
status = Dispatch->WskBind(Socket, (PSOCKADDR)&localAddr, 0, Irp);
/*if (status == STATUS_PENDING) {
KeWaitForSingleObject(&compEvent, Executive, KernelMode, FALSE, NULL);
}
status = Irp->IoStatus.Status;
IoFreeIrp(Irp);
*/
return status;
}
NTSTATUS BindSocketComplete(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context) {
UNREFERENCED_PARAMETER(DeviceObject);
UNREFERENCED_PARAMETER(Context);
if (Irp->IoStatus.Status == STATUS_SUCCESS) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[BindSocketComplete] Socket bind success\n"));
}
else {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[BindSocketComplete] Socket bind failed\n"));
}
IoFreeIrp(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
NTSTATUS ConnectSocketComplete(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context);
NTSTATUS ConnectSocket(PWSK_SOCKET Socket, SOCKADDR_IN remoteAddr) {
PWSK_PROVIDER_CONNECTION_DISPATCH Dispatch;
PIRP Irp;
NTSTATUS status;
//KEVENT compEvent;
//KeInitializeEvent(&compEvent, SynchronizationEvent, FALSE);
Dispatch = (PWSK_PROVIDER_CONNECTION_DISPATCH)(Socket->Dispatch);
Irp = IoAllocateIrp(1, FALSE);
if (!Irp) {
return STATUS_INSUFFICIENT_RESOURCES;
}
//IoSetCompletionRoutine(Irp, SyncIrpCompRtn, &compEvent, TRUE, TRUE, TRUE);
IoSetCompletionRoutine(Irp, ConnectSocketComplete, Socket, TRUE, TRUE, TRUE);
status = Dispatch->WskConnect(Socket, (PSOCKADDR)&remoteAddr, 0, Irp);
/*if (status == STATUS_PENDING) {
KeWaitForSingleObject(&compEvent, Executive, KernelMode, FALSE, NULL);
}
status = Irp->IoStatus.Status;
IoFreeIrp(Irp);
*/
return status;
}
NTSTATUS ConnectSocketComplete(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context) {
UNREFERENCED_PARAMETER(DeviceObject);
UNREFERENCED_PARAMETER(Context);
if (Irp->IoStatus.Status == STATUS_SUCCESS) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[ConnectSocketComplete] Socket connection success\n"));
}
else {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[ConnectSocketComplete] Socket connection failed\n"));
}
IoFreeIrp(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}
NTSTATUS DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
) {
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
NTSTATUS status;
WSK_CLIENT_NPI wskClientNpi;
wskClientNpi.ClientContext = NULL;
wskClientNpi.Dispatch = &WskAppDispatch;
SOCKADDR_IN serverAddr = { 0, };
IN_ADDR Ipv4ServAddr;
PCSTR tmpServAddr;
SOCKADDR_IN localAddr;
if (!NT_SUCCESS(RtlIpv4StringToAddressA(ADDR, TRUE, &tmpServAddr, &Ipv4ServAddr)))
{
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] RtlIpv4StringToAddressA failed\n"));
return STATUS_UNSUCCESSFUL;
}
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = INADDR_ANY;
localAddr.sin_port = 0;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr = Ipv4ServAddr;
serverAddr.sin_port = (USHORT)RtlUlongByteSwap(PORT);
//no bsod
status = WskRegister(&wskClientNpi, &wskRegistration);
if (!NT_SUCCESS(status)) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] WSK registration failed\n"));
return status;
}
//no bsod
status = WskCaptureProviderNPI(&wskRegistration, WSK_WAIT_TIMEOUT, &wskProviderNpi);
if (!NT_SUCCESS(status)) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] NPI Capture failed\n"));
return status;
}
//no bsod
status = CreateSocket(&wskProviderNpi, &sockContext);
if (!NT_SUCCESS(status)) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket creation failed\n"));
return status;
}
else if (status == STATUS_PENDING) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket creation pending\n"));
}
else {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket creation success\n"));
}
//no bsod
status = BindSocket(sockContext.Socket, localAddr);
if (!NT_SUCCESS(status)) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket bind failed\n"));
return status;
}
else if (status == STATUS_PENDING) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket bind pending\n"));
}
else {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket bind success\n"));
}
status = ConnectSocket(sockContext.Socket, serverAddr);
if (!NT_SUCCESS(status)) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket connect failed\n"));
return status;
}
else if (status == STATUS_PENDING) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket connect pending\n"));
}
else {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] Socket connect success\n"));
}
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[DriverEntry] DriverEntry() completed without errors\n"));
return STATUS_SUCCESS;
}
I have no idea why it doesn't work thought