diff --git a/Driver.cpp b/Driver.cpp index 143c2c6..fe2e9b8 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -89,7 +89,6 @@ DriverEntry(_In_ PDRIVER_OBJECT driverObject, _In_ PUNICODE_STRING registryPath) wskClientNpi.Dispatch = &WskAppDispatch; POVPN_DRIVER driverCtx = OvpnGetDriverContext(WdfGetDriver()); - GOTO_IF_NOT_NT_SUCCESS(done, status, WskRegister(&wskClientNpi, &driverCtx->WskRegistration)); done: @@ -286,7 +285,9 @@ VOID OvpnEvtFileCleanup(WDFFILEOBJECT fileObject) { InterlockedExchange(&device->UserspacePid, 0); - OvpnAdapterSetLinkState(OvpnGetAdapterContext(device->Adapter), MediaConnectStateDisconnected); + if (device->Adapter != NULL) { + OvpnAdapterSetLinkState(OvpnGetAdapterContext(device->Adapter), MediaConnectStateDisconnected); + } LOG_EXIT(); } @@ -312,70 +313,13 @@ VOID OvpnEvtDeviceCleanup(WDFOBJECT obj) { LOG_EXIT(); } -EVT_WDF_DEVICE_PREPARE_HARDWARE OvpnEvtDevicePrepareHardware; -EVT_WDF_DEVICE_RELEASE_HARDWARE OvpnEvtDeviceReleaseHardware; -_No_competing_thread_ EVT_WDF_DEVICE_D0_ENTRY OvpnEvtDeviceD0Entry; -_No_competing_thread_ EVT_WDF_DEVICE_D0_EXIT OvpnEvtDeviceD0Exit; - -_Use_decl_annotations_ -NTSTATUS -OvpnEvtDevicePrepareHardware(_In_ WDFDEVICE wdfDevice, _In_ WDFCMRESLIST resourcesRaw, _In_ WDFCMRESLIST resourcesTranslated) -{ - UNREFERENCED_PARAMETER(wdfDevice); - UNREFERENCED_PARAMETER(resourcesRaw); - UNREFERENCED_PARAMETER(resourcesTranslated); - - LOG_ENTER(); - LOG_EXIT(); - return STATUS_SUCCESS; -} - -_Use_decl_annotations_ -NTSTATUS -OvpnEvtDeviceReleaseHardware(_In_ WDFDEVICE wdfDevice, _In_ WDFCMRESLIST resourcesTranslated) -{ - UNREFERENCED_PARAMETER(wdfDevice); - UNREFERENCED_PARAMETER(resourcesTranslated); - - LOG_ENTER(); - LOG_EXIT(); - return STATUS_SUCCESS; -} - -_Use_decl_annotations_ -NTSTATUS -OvpnEvtDeviceD0Entry(_In_ WDFDEVICE wdfDevice, WDF_POWER_DEVICE_STATE previousState) -{ - UNREFERENCED_PARAMETER(wdfDevice); - - LOG_ENTER(); - - LOG_INFO("PreviousState", TraceLoggingUInt32(previousState, "PreviousState")); - - LOG_EXIT(); - - return STATUS_SUCCESS; -} - -_Use_decl_annotations_ -NTSTATUS -OvpnEvtDeviceD0Exit(_In_ WDFDEVICE Device, _In_ WDF_POWER_DEVICE_STATE TargetState) -{ - UNREFERENCED_PARAMETER(Device); - - LOG_ENTER(); - - LOG_INFO("TargetState", TraceLoggingUInt32(TargetState, "TargetState")); - - LOG_EXIT(); - return STATUS_SUCCESS; -} - EVT_WDF_DRIVER_DEVICE_ADD OvpnEvtDeviceAdd; _Use_decl_annotations_ NTSTATUS OvpnEvtDeviceAdd(WDFDRIVER wdfDriver, PWDFDEVICE_INIT deviceInit) { + UNREFERENCED_PARAMETER(wdfDriver); + LOG_ENTER(); // make sure only one app can access driver at time @@ -391,15 +335,6 @@ OvpnEvtDeviceAdd(WDFDRIVER wdfDriver, PWDFDEVICE_INIT deviceInit) { NTSTATUS status; GOTO_IF_NOT_NT_SUCCESS(done, status, NetDeviceInitConfig(deviceInit)); - WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks; - WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks); - pnpPowerCallbacks.EvtDevicePrepareHardware = OvpnEvtDevicePrepareHardware; - pnpPowerCallbacks.EvtDeviceReleaseHardware = OvpnEvtDeviceReleaseHardware; - pnpPowerCallbacks.EvtDeviceD0Entry = OvpnEvtDeviceD0Entry; - pnpPowerCallbacks.EvtDeviceD0Exit = OvpnEvtDeviceD0Exit; - - WdfDeviceInitSetPnpPowerEventCallbacks(deviceInit, &pnpPowerCallbacks); - WDF_OBJECT_ATTRIBUTES objAttributes; WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&objAttributes, OVPN_DEVICE); // BCryptOpenAlgorithmProvider with BCRYPT_PROV_DISPATCH returns STATUS_NOT_SUPPORTED if sync scope is WdfSynchronizationScopeDevice @@ -440,13 +375,6 @@ OvpnEvtDeviceAdd(WDFDRIVER wdfDriver, PWDFDEVICE_INIT deviceInit) { WDF_IO_QUEUE_CONFIG_INIT(&queueConfig, WdfIoQueueDispatchManual); GOTO_IF_NOT_NT_SUCCESS(done, status, WdfIoQueueCreate(wdfDevice, &queueConfig, WDF_NO_OBJECT_ATTRIBUTES, &device->PendingNewPeerQueue)); - POVPN_DRIVER driver = OvpnGetDriverContext(wdfDriver); - - LOG_INFO("Before calling WskCaptureProviderNPI()"); - // Capture the WSK Provider NPI. If WSK subsystem is not ready yet, wait until it becomes ready. - GOTO_IF_NOT_NT_SUCCESS(done, status, WskCaptureProviderNPI(&driver->WskRegistration, WSK_INFINITE_WAIT, &driver->WskProviderNpi)); - LOG_INFO("After calling WskCaptureProviderNPI()"); - GOTO_IF_NOT_NT_SUCCESS(done, status, OvpnTxBufferPoolCreate(&device->TxBufferPool, device)); GOTO_IF_NOT_NT_SUCCESS(done, status, OvpnRxBufferPoolCreate(&device->RxBufferPool)); diff --git a/PropertySheet.props b/PropertySheet.props index 0fb9732..99ebfb5 100644 --- a/PropertySheet.props +++ b/PropertySheet.props @@ -3,8 +3,8 @@ 0 - 8 - 4 + 9 + 0 diff --git a/bufferpool.cpp b/bufferpool.cpp index a4cf115..5b85661 100644 --- a/bufferpool.cpp +++ b/bufferpool.cpp @@ -223,6 +223,9 @@ static VOID OvpnBufferPoolDelete(OVPN_BUFFER_POOL handle) { + if (handle == NULL) + return; + OVPN_BUFFER_POOL_IMPL* pool = (OVPN_BUFFER_POOL_IMPL*)handle; LIST_ENTRY* list_entry = NULL; @@ -277,6 +280,9 @@ OvpnRxBufferPoolCreate(OVPN_RX_BUFFER_POOL* handle) VOID OvpnBufferQueueDelete(OVPN_BUFFER_QUEUE handle) { + if (handle == NULL) + return; + OVPN_BUFFER_QUEUE_IMPL* queue = (OVPN_BUFFER_QUEUE_IMPL*)handle; ExFreePoolWithTag(queue, 'ovpn'); diff --git a/peer.cpp b/peer.cpp index 3164b87..dbe337f 100644 --- a/peer.cpp +++ b/peer.cpp @@ -71,7 +71,7 @@ OvpnPeerNew(POVPN_DEVICE device, WDFREQUEST request) BOOLEAN proto_tcp = peer->Proto == OVPN_PROTO_TCP; SIZE_T remoteAddrSize = peer->Remote.Addr4.sin_family == AF_INET ? sizeof(peer->Remote.Addr4) : sizeof(peer->Remote.Addr6); - GOTO_IF_NOT_NT_SUCCESS(done, status, OvpnSocketInit(&driver->WskProviderNpi, peer->Local.Addr4.sin_family, proto_tcp, (PSOCKADDR)&peer->Local, + GOTO_IF_NOT_NT_SUCCESS(done, status, OvpnSocketInit(&driver->WskProviderNpi, &driver->WskRegistration, peer->Local.Addr4.sin_family, proto_tcp, (PSOCKADDR)&peer->Local, (PSOCKADDR)&peer->Remote, remoteAddrSize, device, &socket)); BCRYPT_ALG_HANDLE aesAlgHandle = NULL, chachaAlgHandle = NULL; diff --git a/socket.cpp b/socket.cpp index 6b53071..3a58533 100644 --- a/socket.cpp +++ b/socket.cpp @@ -460,11 +460,18 @@ const WSK_CLIENT_CONNECTION_DISPATCH OvpnSocketTcpDispatch = { OvpnSocketTcpRece _Use_decl_annotations_ NTSTATUS -OvpnSocketInit(WSK_PROVIDER_NPI* wskProviderNpi, ADDRESS_FAMILY addressFamily, BOOLEAN tcp, PSOCKADDR localAddr, +OvpnSocketInit(WSK_PROVIDER_NPI* wskProviderNpi, WSK_REGISTRATION* wskRegistration, ADDRESS_FAMILY addressFamily, BOOLEAN tcp, PSOCKADDR localAddr, PSOCKADDR remoteAddr, SIZE_T remoteAddrSize, PVOID deviceContext, PWSK_SOCKET* socket) { + NTSTATUS status; WSK_EVENT_CALLBACK_CONTROL eventCallbackControl = {}; + // init WSK + if (wskProviderNpi->Client == NULL) { + LOG_INFO("Init WSK"); + GOTO_IF_NOT_NT_SUCCESS(done, status, WskCaptureProviderNPI(wskRegistration, WSK_INFINITE_WAIT, wskProviderNpi)); + } + // create socket USHORT socketType = tcp ? SOCK_STREAM : SOCK_DGRAM; @@ -472,7 +479,6 @@ OvpnSocketInit(WSK_PROVIDER_NPI* wskProviderNpi, ADDRESS_FAMILY addressFamily, B ULONG flags = tcp ? WSK_FLAG_CONNECTION_SOCKET : WSK_FLAG_DATAGRAM_SOCKET; PVOID dispatch = tcp ? (PVOID)&OvpnSocketTcpDispatch : (PVOID)&OvpnSocketUdpDispatch; - NTSTATUS status; GOTO_IF_NOT_NT_SUCCESS(done, status, OvpnSocketSyncOp("CreateSocket", [&status, wskProviderNpi, addressFamily, socketType, proto, flags, deviceContext, dispatch](PIRP irp) { return wskProviderNpi->Dispatch->WskSocket(wskProviderNpi->Client, addressFamily, socketType, proto, flags, deviceContext, dispatch, NULL, NULL, NULL, irp); diff --git a/socket.h b/socket.h index 5f553d0..38e04a6 100644 --- a/socket.h +++ b/socket.h @@ -59,7 +59,7 @@ struct OvpnSocket _Must_inspect_result_ _IRQL_requires_(PASSIVE_LEVEL) NTSTATUS -OvpnSocketInit(_In_ WSK_PROVIDER_NPI* wskProviderNpi, ADDRESS_FAMILY addrFamily, +OvpnSocketInit(_In_ WSK_PROVIDER_NPI* wskProviderNpi, _In_ WSK_REGISTRATION* wskRegistration, ADDRESS_FAMILY addrFamily, BOOLEAN tcp, _In_ PSOCKADDR localAddr, _In_ PSOCKADDR remoteAddr, SIZE_T remoteAddrSize, _In_ PVOID deviceContext, _Out_ PWSK_SOCKET* socket);