NTSTATUS initwsk(PWSK_REGISTRATION clireg, PWSK_PROVIDER_NPI pronpi) { NTSTATUS status; WSK_CLIENT_NPI clinpi; WSK_CLIENT_DISPATCH dispatch = { MAKE_WSK_VERSION(1, 0), 0, NULL }; clinpi.ClientContext = NULL; clinpi.Dispatch = &dispatch; status = WskRegister(&clinpi, clireg); if(!NT_SUCCESS(status)){ DbgPrint("WskRegister() error : 0x%X\n", status); return status; } status = WskCaptureProviderNPI(clireg, WSK_INFINITE_WAIT, pronpi); if(!NT_SUCCESS(status)){ DbgPrint("WskCaptureProviderNPI() error : 0x%X\n", status); WskDeregister(clireg); return status; } return STATUS_SUCCESS; }
NTSTATUS CloseWskEventSocket() { if (!netlink_server_socket) { return STATUS_SUCCESS; } KEVENT CompletionEvent = {0}; PIRP irp = NULL; NTSTATUS status = InitWskData(&irp, &CompletionEvent); if (!NT_SUCCESS(status)) { return status; } status = ((PWSK_PROVIDER_BASIC_DISPATCH)netlink_server_socket->Dispatch)->WskCloseSocket(netlink_server_socket, irp); if (STATUS_PENDING == status) { KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); status = irp->IoStatus.Status; } IoFreeIrp(irp); WskDeregister(&gWskEventRegistration); return status; }
NTSTATUS InitWskEvent() { NTSTATUS status; WSK_CLIENT_NPI wskClientNpi; wskClientNpi.ClientContext = NULL; wskClientNpi.Dispatch = &g_WskDispatch; status = WskRegister(&wskClientNpi, &gWskEventRegistration); if (!NT_SUCCESS(status)) { WDRBD_ERROR("Failed to WskRegister(). status(0x%x)\n", status); return status; } status = WskCaptureProviderNPI(&gWskEventRegistration, WSK_INFINITE_WAIT, &gWskEventProviderNPI); if (!NT_SUCCESS(status)) { WDRBD_ERROR("Failed to WskCaptureProviderNPI(). status(0x%x)\n", status); WskDeregister(&gWskEventRegistration); return status; } return status; }
NTSTATUS NTAPI SocketsInit() { WSK_CLIENT_NPI WskClient = { 0 }; NTSTATUS Status = STATUS_UNSUCCESSFUL; if (InterlockedCompareExchange(&g_SocketsState, INITIALIZING, DEINITIALIZED) != DEINITIALIZED) return STATUS_ALREADY_REGISTERED; WskClient.ClientContext = NULL; WskClient.Dispatch = &g_WskDispatch; Status = WskRegister(&WskClient, &g_WskRegistration); if (!NT_SUCCESS(Status)) { InterlockedExchange(&g_SocketsState, DEINITIALIZED); return Status; } WDRBD_INFO("WskCaptureProviderNPI start.\n"); Status = WskCaptureProviderNPI(&g_WskRegistration, WSK_INFINITE_WAIT, &g_WskProvider); WDRBD_INFO("WskCaptureProviderNPI done.\n"); // takes long time! msg out after MVL loaded. if (!NT_SUCCESS(Status)) { WDRBD_ERROR("WskCaptureProviderNPI() failed with status 0x%08X\n", Status); WskDeregister(&g_WskRegistration); InterlockedExchange(&g_SocketsState, DEINITIALIZED); return Status; } InterlockedExchange(&g_SocketsState, INITIALIZED); return STATUS_SUCCESS; }
VOID cleanupwsk(PWSK_REGISTRATION clireg) { WskReleaseProviderNPI(clireg); WskDeregister(clireg); return; }
VOID NTAPI SocketsDeinit() { if (InterlockedCompareExchange(&g_SocketsState, INITIALIZED, DEINITIALIZING) != INITIALIZED) return; WskReleaseProviderNPI(&g_WskRegistration); WskDeregister(&g_WskRegistration); InterlockedExchange(&g_SocketsState, DEINITIALIZED); }
VOID NTAPI NPF_WSKCleanup( ) { TRACE_ENTER(); if (InterlockedCompareExchange(&g_SocketsState, INITIALIZED, DEINITIALIZING) != INITIALIZED) { TRACE_EXIT(); return; } WskReleaseProviderNPI(&g_WskRegistration); WskDeregister(&g_WskRegistration); InterlockedExchange(&g_SocketsState, DEINITIALIZED); TRACE_EXIT(); }
NTSTATUS NTAPI NPF_WSKStartup( ) { WSK_CLIENT_NPI WskClient = {0}; NTSTATUS Status = STATUS_UNSUCCESSFUL; TRACE_ENTER(); if (InterlockedCompareExchange(&g_SocketsState, INITIALIZING, DEINITIALIZED) != DEINITIALIZED) return STATUS_ALREADY_REGISTERED; WskClient.ClientContext = NULL; WskClient.Dispatch = &g_WskDispatch; Status = WskRegister(&WskClient, &g_WskRegistration); if (!NT_SUCCESS(Status)) { TRACE_MESSAGE1(PACKET_DEBUG_LOUD, "NPF_WSKStartup()::WskRegister() failed with status 0x%08X\n", Status); InterlockedExchange(&g_SocketsState, DEINITIALIZED); TRACE_EXIT(); return Status; } Status = WskCaptureProviderNPI(&g_WskRegistration, WSK_NO_WAIT, &g_WskProvider); if (!NT_SUCCESS(Status)) { TRACE_MESSAGE1(PACKET_DEBUG_LOUD, "NPF_WSKStartup()::WskCaptureProviderNPI() failed with status 0x%08X\n", Status); WskDeregister(&g_WskRegistration); InterlockedExchange(&g_SocketsState, DEINITIALIZED); TRACE_EXIT(); return Status; } InterlockedExchange(&g_SocketsState, INITIALIZED); TRACE_EXIT(); return STATUS_SUCCESS; }