⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 purge.c

📁 usb to rs232 虚拟RS232串口驱动程序
💻 C
字号:
/*++

Copyright (c) 2005-2006  E0 Technology,Inc.

Module Name:

	purge.c

Abstract:

	Virtual Com Port Driver for USB to RS232 Converter of E0 Technology,Inc.

Environment:

	Kernel mode

Notes:

Revision History:

    2006/3/1 : 	Adapted from the serial DDK sample.
--*/
#include "usb2com.h"

VOID
SerialKillAllReadsOrWrites(
	IN PDEVICE_OBJECT DeviceObject,
	IN PLIST_ENTRY QueueToClean,
	IN PIRP *CurrentOpIrp,
	IN PKSPIN_LOCK QueueSpinLock
	)
{

	KIRQL oldIrql;
	KeAcquireSpinLock(QueueSpinLock, &oldIrql);

	while (!IsListEmpty(QueueToClean)) {
		PIRP currentLastIrp = CONTAINING_RECORD(
                                  QueueToClean->Blink,
                                  IRP,
                                  Tail.Overlay.ListEntry
                                  );
		DbgPrint("Killall Irp %p\n",currentLastIrp);
		RemoveEntryList(QueueToClean->Blink);

		currentLastIrp->IoStatus.Status = STATUS_CANCELLED;
		IoCompleteRequest(currentLastIrp, IO_NO_INCREMENT);
	}
	//
	// The queue is clean.  Now go after the current if
	// it's there.
	//

	if (*CurrentOpIrp) {
		DbgPrint("Kill CurrentOpIrp %p\n",*CurrentOpIrp);
		(*CurrentOpIrp)->IoStatus.Status = STATUS_CANCELLED;
		IoCompleteRequest(*CurrentOpIrp, IO_NO_INCREMENT);
		*CurrentOpIrp = NULL;
    	}
	KeReleaseSpinLock(QueueSpinLock, oldIrql);
}

NTSTATUS
SerialStartPurge(
	PDEVICE_EXTENSION deviceExtension,
	IN PIRP Irp
	)
{
	ULONG Mask;
    	KIRQL Irql;

        Mask = *((ULONG *)(Irp->AssociatedIrp.SystemBuffer));
        DbgPrint("SerialStartPurge Mask = %x\n",Mask);

        if (Mask & SERIAL_PURGE_TXABORT) {

            SerialKillAllReadsOrWrites(
                deviceExtension->DeviceObject,
                &deviceExtension->WriteQueue,
                &deviceExtension->CurrentWriteIrp,
                &deviceExtension->WriteQueueSpinLock
                );
        }

        if (Mask & SERIAL_PURGE_RXABORT) {

            SerialKillAllReadsOrWrites(
                deviceExtension->DeviceObject,
                &deviceExtension->ReadQueue,
                &deviceExtension->CurrentReadIrp,
                &deviceExtension->ReadQueueSpinLock
                );

        }

        if (Mask & SERIAL_PURGE_RXCLEAR) {
		KeAcquireSpinLock(&deviceExtension->InputBufferLock, &Irql);
    		ResetCircularBuffer(&deviceExtension->InputBuffer);
		KeReleaseSpinLock(&deviceExtension->InputBufferLock, Irql);
        }

        Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = sizeof(ULONG);
        
	return STATUS_SUCCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -