// Close the device BOOL NeoNdisOnClose(IRP *irp, IO_STACK_LOCATION *stack) { NEO_EVENT *free_event = NULL; if (ctx == NULL) { return FALSE; } if (ctx->Opened == FALSE) { // Client is not connected return FALSE; } ctx->Opened = FALSE; NeoLockPacketQueue(); { // Release the event free_event = ctx->Event; ctx->Event = NULL; // Release all packets NeoClearPacketQueue(true); } NeoUnlockPacketQueue(); if (free_event != NULL) { NeoFreeEvent(free_event); } NeoSetConnectState(FALSE); return TRUE; }
// Close the device BOOL NeoNdisOnClose(IRP *irp, IO_STACK_LOCATION *stack) { if (ctx == NULL) { return FALSE; } if (ctx->Opened == FALSE) { // Client is not connected return FALSE; } ctx->Opened = FALSE; // Release the event NeoFreeEvent(ctx->Event); ctx->Event = NULL; // Release all packets NeoClearPacketQueue(); NeoSetConnectState(FALSE); return TRUE; }
// Release the packet queue void NeoFreePacketQueue() { // Delete all packets NeoClearPacketQueue(false); // Delete the lock NeoFreeLock(ctx->PacketQueueLock); ctx->PacketQueueLock = NULL; }