// 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 control device void NeoFreeControlDevice() { if (ctx == NULL) { return; } if (ctx->Opened != FALSE) { // Delete the event NeoSet(ctx->Event); NeoFreeEvent(ctx->Event); ctx->Event = NULL; ctx->Opened = FALSE; } // Delet the device NdisMDeregisterDevice(ctx->NdisControl); }