?? purge.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 + -