+ /* Find task by fd */
+ if (!silc_hash_table_find(schedule->fd_queue, SILC_32_TO_PTR(fd),
+ NULL, (void *)&task)) {
+ SILC_SCHEDULE_UNLOCK(schedule);
+ break;
+ }
+
+ /* Ignore the event if the task is not valid anymore */
+ if (!task->header.valid || !task->events) {
+ SILC_SCHEDULE_UNLOCK(schedule);
+ break;
+ }
+ task->revents = 0;
+
+ /* Handle event */
+ switch (WSAGETSELECTEVENT(lParam)) {
+ case FD_READ:
+ case FD_OOB:
+ SILC_LOG_DEBUG(("FD_READ"));
+ task->revents |= SILC_TASK_READ;
+ silc_list_add(schedule->fd_dispatch, task);
+ break;
+
+ case FD_WRITE:
+ SILC_LOG_DEBUG(("FD_WRITE"));
+ task->revents |= SILC_TASK_WRITE;
+ silc_list_add(schedule->fd_dispatch, task);
+ break;
+
+ case FD_ACCEPT:
+ SILC_LOG_DEBUG(("FD_ACCEPT"));
+ task->revents |= SILC_TASK_READ;
+ silc_list_add(schedule->fd_dispatch, task);
+ break;
+
+ default:
+ break;
+ }
+
+ /* Wakeup scheduler */
+ ReleaseSemaphore(internal->wakeup_sema, 1, NULL);
+
+ SILC_SCHEDULE_UNLOCK(schedule);
+ return TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ return DefWindowProc(hwnd, wMsg, wParam, lParam);
+}
+
+/* Init Winsock2. */
+
+static SilcBool silc_net_win32_init(void)