Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

903 lines
19 KiB

/*--------------------------------------------------------------------------
*
* Copyright (C) Cyclades Corporation, 1996-2001.
* All rights reserved.
*
* Cyclom-Y Port Driver
*
* This file: cyyportp.h
*
* Description: Prototypes and macros that are used throughout
* the driver.
*
* Notes: This code supports Windows 2000 and x86 processor.
*
* Complies with Cyclades SW Coding Standard rev 1.3.
*
*--------------------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
*
* Change History
*
*--------------------------------------------------------------------------
*
*
*--------------------------------------------------------------------------
*/
typedef
NTSTATUS
(*PSERIAL_START_ROUTINE) (
IN PCYY_DEVICE_EXTENSION
);
typedef
VOID
(*PSERIAL_GET_NEXT_ROUTINE) (
IN PIRP *CurrentOpIrp,
IN PLIST_ENTRY QueueToProcess,
OUT PIRP *NewIrp,
IN BOOLEAN CompleteCurrent,
PCYY_DEVICE_EXTENSION Extension
);
// cyyinit.c prototypes
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
VOID
CyyDisableInterfacesResources(IN PDEVICE_OBJECT PDevObj,
BOOLEAN DisableUART);
VOID
CyyKillPendingIrps(PDEVICE_OBJECT DeviceObject);
CYY_MEM_COMPARES
CyyMemCompare(
IN PHYSICAL_ADDRESS A,
IN ULONG SpanOfA,
IN PHYSICAL_ADDRESS B,
IN ULONG SpanOfB
);
VOID
CyyReleaseResources(IN PCYY_DEVICE_EXTENSION PDevExt);
NTSTATUS
CyyRemoveDevObj(IN PDEVICE_OBJECT PDevObj);
BOOLEAN
CyyDoesPortExist(
IN PCYY_DEVICE_EXTENSION Extension,
IN PUNICODE_STRING InsertString
);
BOOLEAN
CyyReset(
IN PVOID Context
);
VOID
CyyUnload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
CyyInitController(IN PDEVICE_OBJECT PDevObj, IN PCONFIG_DATA PConfigData);
VOID
CyyResetBoard( PCYY_DEVICE_EXTENSION Extension );
NTSTATUS
CyyFindInitController(IN PDEVICE_OBJECT PDevObj, IN PCONFIG_DATA PConfig);
PUCHAR
GetMyMappedCD1400Address(IN PUCHAR BoardMemory, IN ULONG PortIndex, IN ULONG IsPci);
PHYSICAL_ADDRESS
GetMyPhysicalCD1400Address(IN PHYSICAL_ADDRESS BoardMemory, IN ULONG PortIndex, IN ULONG IsPci);
VOID
CyyCommError(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
// end cyyinit.c
NTSTATUS
CyyRead(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
CyyStartRead(
IN PCYY_DEVICE_EXTENSION Extension
);
VOID
CyyCompleteRead(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
VOID
CyyReadTimeout(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
VOID
CyyIntervalReadTimeout(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
NTSTATUS
CyyFlush(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
CyyWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
CyyStartWrite(
IN PCYY_DEVICE_EXTENSION Extension
);
VOID
CyyGetNextWrite(
IN PIRP *CurrentOpIrp,
IN PLIST_ENTRY QueueToProcess,
IN PIRP *NewIrp,
IN BOOLEAN CompleteCurrent,
IN PCYY_DEVICE_EXTENSION Extension
);
VOID
CyyCompleteWrite(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
BOOLEAN
CyyTxStart(
IN PVOID Context
);
BOOLEAN
CyySendXon(
IN PVOID Context
);
BOOLEAN
CyySendXoff(
IN PVOID Context
);
BOOLEAN
CyyProcessEmptyTransmit(
IN PVOID Context
);
VOID
CyyWriteTimeout(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
NTSTATUS
CyyCleanup(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
CyyCreateOpen(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
CyyClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
CyyDisableCd1400Channel(IN PVOID Context);
BOOLEAN
CyySetDTR(
IN PVOID Context
);
BOOLEAN
CyyClrDTR(
IN PVOID Context
);
BOOLEAN
CyySetRTS(
IN PVOID Context
);
BOOLEAN
CyyClrRTS(
IN PVOID Context
);
BOOLEAN
CyyGetDTRRTS(
IN PVOID Context
);
BOOLEAN
CyySetChars(
IN PVOID Context
);
BOOLEAN
CyySetBaud(
IN PVOID Context
);
BOOLEAN
CyySetLineControl(
IN PVOID Context
);
BOOLEAN
CyySetupNewHandFlow(
IN PCYY_DEVICE_EXTENSION Extension,
IN PSERIAL_HANDFLOW NewHandFlow
);
BOOLEAN
CyySetHandFlow(
IN PVOID Context
);
BOOLEAN
CyyTurnOnBreak(
IN PVOID Context
);
BOOLEAN
CyyTurnOffBreak(
IN PVOID Context
);
BOOLEAN
CyyPretendXoff(
IN PVOID Context
);
BOOLEAN
CyyPretendXon(
IN PVOID Context
);
VOID
CyyHandleReducedIntBuffer(
IN PCYY_DEVICE_EXTENSION Extension
);
VOID
CyyProdXonXoff(
IN PCYY_DEVICE_EXTENSION Extension,
IN BOOLEAN SendXon
);
NTSTATUS
CyyIoControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
CyyStartMask(
IN PCYY_DEVICE_EXTENSION Extension
);
VOID
CyyCancelWait(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
CyyCompleteWait(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
VOID
CyyStartImmediate(
IN PCYY_DEVICE_EXTENSION Extension
);
VOID
CyyCompleteImmediate(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
VOID
CyyTimeoutImmediate(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
VOID
CyyTimeoutXoff(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
VOID
CyyCompleteXoff(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
NTSTATUS
CyyStartPurge(
IN PCYY_DEVICE_EXTENSION Extension
);
BOOLEAN
CyyPurgeInterruptBuff(
IN PVOID Context
);
NTSTATUS
CyyQueryInformationFile(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
CyySetInformationFile(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
CyyKillAllReadsOrWrites(
IN PDEVICE_OBJECT DeviceObject,
IN PLIST_ENTRY QueueToClean,
IN PIRP *CurrentOpIrp
);
VOID
CyyGetNextIrp(
IN PIRP *CurrentOpIrp,
IN PLIST_ENTRY QueueToProcess,
OUT PIRP *NextIrp,
IN BOOLEAN CompleteCurrent,
IN PCYY_DEVICE_EXTENSION Extension
);
VOID
CyyTryToCompleteCurrent(
IN PCYY_DEVICE_EXTENSION Extension,
IN PKSYNCHRONIZE_ROUTINE SynchRoutine OPTIONAL,
IN KIRQL IrqlForRelease,
IN NTSTATUS StatusToUse,
IN PIRP *CurrentOpIrp,
IN PLIST_ENTRY QueueToProcess,
IN PKTIMER IntervalTimer,
IN PKTIMER TotalTimer,
IN PSERIAL_START_ROUTINE Starter,
IN PSERIAL_GET_NEXT_ROUTINE GetNextIrp,
IN LONG RefType
);
NTSTATUS
CyyStartOrQueue(
IN PCYY_DEVICE_EXTENSION Extension,
IN PIRP Irp,
IN PLIST_ENTRY QueueToExamine,
IN PIRP *CurrentOpIrp,
IN PSERIAL_START_ROUTINE Starter
);
VOID
CyyCancelQueued(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
CyyCompleteIfError(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
ULONG
CyyHandleModemUpdate(
IN PCYY_DEVICE_EXTENSION Extension,
IN BOOLEAN DoingTX
);
ULONG
CyyHandleModemUpdateForModem(
IN PCYY_DEVICE_EXTENSION Extension,
IN BOOLEAN DoingTX,
IN UCHAR misr
);
BOOLEAN
CyyIsr(
IN PKINTERRUPT InterruptObject,
IN PVOID Context
);
BOOLEAN
CyyDispatchISR(
IN PKINTERRUPT InterruptObject,
IN PVOID Context
);
BOOLEAN
CyyPerhapsLowerRTS(
IN PVOID Context
);
VOID
CyyStartTimerLowerRTS(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
VOID
CyyInvokePerhapsLowerRTS(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemContext1,
IN PVOID SystemContext2
);
VOID
CyyCleanupDevice(
IN PCYY_DEVICE_EXTENSION Extension
);
BOOLEAN
CyyProcessLSR(
IN PCYY_DEVICE_EXTENSION Extension,
IN UCHAR Rdsr,
IN UCHAR RxChar
);
LARGE_INTEGER
CyyGetCharTime(
IN PCYY_DEVICE_EXTENSION Extension
);
BOOLEAN
CyySharerIsr(
IN PKINTERRUPT InterruptObject,
IN PVOID Context
);
BOOLEAN
CyyMarkClose(
IN PVOID Context
);
BOOLEAN
CyyIndexedMultiportIsr(
IN PKINTERRUPT InterruptObject,
IN PVOID Context
);
BOOLEAN
CyyBitMappedMultiportIsr(
IN PKINTERRUPT InterruptObject,
IN PVOID Context
);
VOID
CyyPutChar(
IN PCYY_DEVICE_EXTENSION Extension,
IN UCHAR CharToPut
);
BOOLEAN
CyyGetStats(
IN PVOID Context
);
BOOLEAN
CyyClearStats(
IN PVOID Context
);
VOID
CyyLog(
IN PDRIVER_OBJECT DriverObject,
NTSTATUS msgId
);
VOID
CyyLogData(
IN PDRIVER_OBJECT DriverObject,
NTSTATUS msgId,
ULONG dump1,
ULONG dump2
);
VOID
CyyILog(
IN PDRIVER_OBJECT DriverObject,
NTSTATUS msgId
);
VOID
CyyILogParam(
IN PDRIVER_OBJECT DriverObject,
NTSTATUS msgId,
ULONG dumpParameter,
ULONG base
);
VOID
CyyCDCmd(
PCYY_DEVICE_EXTENSION Extension,
UCHAR cmd
);
// cyreg.c
NTSTATUS
CyyGetConfigDefaults(
IN PCYY_REGISTRY_DATA DriverDefaultsPtr,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS
CyyGetRegistryKeyValue (
IN HANDLE Handle,
IN PWCHAR KeyNameString,
IN ULONG KeyNameStringLength,
IN PVOID Data,
IN ULONG DataLength
);
ULONG
CyyGetRegistryKeyValueLength (
IN HANDLE Handle,
IN PWCHAR KeyNameString,
IN ULONG KeyNameStringLength);
NTSTATUS
CyyPutRegistryKeyValue(IN HANDLE Handle, IN PWCHAR PKeyNameString,
IN ULONG KeyNameStringLength, IN ULONG Dtype,
IN PVOID PData, IN ULONG DataLength);
// cyypnp.c
NTSTATUS
CyyAddDevice(
IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PLowerDevObj);
//NTSTATUS
//CyyCreateDevObj(IN PDRIVER_OBJECT DriverObject,
// OUT PDEVICE_OBJECT *NewDeviceObject);
NTSTATUS
CyyCreateDevObj(IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PPdo,
OUT PDEVICE_OBJECT *NewDeviceObject);
NTSTATUS
CyyFinishStartDevice(IN PDEVICE_OBJECT PDevObj,
IN PCM_RESOURCE_LIST PResList,
IN PCM_RESOURCE_LIST PTrResList);
NTSTATUS
CyyGetPortInfo(IN PDEVICE_OBJECT PDevObj, IN PCM_RESOURCE_LIST PResList,
IN PCM_RESOURCE_LIST PTrResList, OUT PCONFIG_DATA PConfig);
NTSTATUS
CyyStartDevice(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp);
NTSTATUS
CyySyncCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp,
IN PKEVENT CyySyncEvent);
NTSTATUS
CyyPnpDispatch(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp);
NTSTATUS
CyyDoExternalNaming(IN PCYY_DEVICE_EXTENSION PDevExt,
IN PDRIVER_OBJECT PDrvObj);
VOID
CyyUndoExternalNaming(IN PCYY_DEVICE_EXTENSION Extension);
UINT32
CyyReportMaxBaudRate(ULONG Bauds);
// cyyioctl.c
VOID
CyyGetProperties(
IN PCYY_DEVICE_EXTENSION Extension,
IN PSERIAL_COMMPROP Properties
);
NTSTATUS
CyyInternalIoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
BOOLEAN
CyySetMCRContents(IN PVOID Context);
BOOLEAN
CyyGetMCRContents(IN PVOID Context);
BOOLEAN
CyySetFCRContents(IN PVOID Context);
// cypower.c
NTSTATUS
CyyPowerDispatch(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp);
NTSTATUS
CyyGotoPowerState(IN PDEVICE_OBJECT PDevObj,
IN PCYY_DEVICE_EXTENSION PDevExt,
IN DEVICE_POWER_STATE DevPowerState);
NTSTATUS
CyySendWaitWake(PCYY_DEVICE_EXTENSION PDevExt);
//VOID
//CyyRestoreDeviceState(IN PCYY_DEVICE_EXTENSION PDevExt);
BOOLEAN
CyyRestoreDeviceState(
IN PVOID Context
);
NTSTATUS
CyySetPowerD0(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp);
NTSTATUS
CyySetPowerD3(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp);
//VOID
//CyySaveDeviceState(IN PCYY_DEVICE_EXTENSION PDevExt);
BOOLEAN
CyySaveDeviceState(
IN PVOID Context
);
NTSTATUS
CyyWakeCompletion(IN PDEVICE_OBJECT PDevObj, IN UCHAR MinorFunction,
IN POWER_STATE PowerState, IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus);
// cywmi.c
NTSTATUS
CyyQueryWmiDataBlock(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp,
IN ULONG GuidIndex,
IN ULONG InstanceIndex,
IN ULONG InstanceCount,
IN OUT PULONG InstanceLengthArray,
IN ULONG OutBufferSize,
OUT PUCHAR PBuffer);
NTSTATUS
CyyQueryWmiRegInfo(IN PDEVICE_OBJECT PDevObj, OUT PULONG PRegFlags,
OUT PUNICODE_STRING PInstanceName,
OUT PUNICODE_STRING *PRegistryPath,
OUT PUNICODE_STRING MofResourceName,
OUT PDEVICE_OBJECT *Pdo);
NTSTATUS
CyySetWmiDataBlock(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp,
IN ULONG GuidIndex, IN ULONG InstanceIndex,
IN ULONG BufferSize,
IN PUCHAR PBuffer);
NTSTATUS
CyySetWmiDataItem(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp,
IN ULONG GuidIndex, IN ULONG InstanceIndex,
IN ULONG DataItemId,
IN ULONG BufferSize, IN PUCHAR PBuffer);
NTSTATUS
CyySystemControlDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS
CyyTossWMIRequest(IN PDEVICE_OBJECT PDevObj, IN PIRP PIrp,
IN ULONG GuidIndex);
// cyyutils.c
BOOLEAN
CyyCancelTimer(IN PKTIMER Timer, IN PCYY_DEVICE_EXTENSION PDevExt);
VOID
CyyDpcEpilogue(IN PCYY_DEVICE_EXTENSION PDevExt, PKDPC PDpc);
VOID
CyyGetNextIrpLocked(
IN PIRP *CurrentOpIrp,
IN PLIST_ENTRY QueueToProcess,
OUT PIRP *NextIrp,
IN BOOLEAN CompleteCurrent,
IN PCYY_DEVICE_EXTENSION extension,
IN KIRQL OldIrql
);
BOOLEAN
CyyInsertQueueDpc(IN PRKDPC PDpc, IN PVOID Sarg1, IN PVOID Sarg2,
IN PCYY_DEVICE_EXTENSION PDevExt);
NTSTATUS
CyyIRPPrologue(IN PIRP PIrp, IN PCYY_DEVICE_EXTENSION PDevExt);
VOID
CyyIRPEpilogue(IN PCYY_DEVICE_EXTENSION PDevExt);
NTSTATUS
CyyIoCallDriver(PCYY_DEVICE_EXTENSION PDevExt, PDEVICE_OBJECT PDevObj,
PIRP PIrp);
VOID
CyyKillAllStalled(IN PDEVICE_OBJECT PDevObj);
VOID
CyyLogError(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
IN PHYSICAL_ADDRESS P1,
IN PHYSICAL_ADDRESS P2,
IN ULONG SequenceNumber,
IN UCHAR MajorFunctionCode,
IN UCHAR RetryCount,
IN ULONG UniqueErrorValue,
IN NTSTATUS FinalStatus,
IN NTSTATUS SpecificIOStatus,
IN ULONG LengthOfInsert1,
IN PWCHAR Insert1,
IN ULONG LengthOfInsert2,
IN PWCHAR Insert2
);
VOID
CyyMarkHardwareBroken(IN PCYY_DEVICE_EXTENSION PDevExt);
NTSTATUS
CyyPoCallDriver(PCYY_DEVICE_EXTENSION PDevExt, PDEVICE_OBJECT PDevObj,
PIRP PIrp);
VOID
CyySetDeviceFlags(IN PCYY_DEVICE_EXTENSION PDevExt, OUT PULONG PFlags,
IN ULONG Value, IN BOOLEAN Set);
BOOLEAN
CyySetTimer(IN PKTIMER Timer, IN LARGE_INTEGER DueTime,
IN PKDPC Dpc OPTIONAL, IN PCYY_DEVICE_EXTENSION PDevExt);
VOID
CyyUnlockPages(IN PKDPC PDpc, IN PVOID PDeferredContext,
IN PVOID PSysContext1, IN PVOID PSysContext2);
VOID
CyyUnstallIrps(IN PCYY_DEVICE_EXTENSION PDevExt);
// End of prototypes
typedef struct _SERIAL_UPDATE_CHAR {
PCYY_DEVICE_EXTENSION Extension;
ULONG CharsCopied;
BOOLEAN Completed;
} SERIAL_UPDATE_CHAR,*PSERIAL_UPDATE_CHAR;
//
// The following simple structure is used to send a pointer
// the device extension and an ioctl specific pointer
// to data.
//
typedef struct _CYY_IOCTL_SYNC {
PCYY_DEVICE_EXTENSION Extension;
PVOID Data;
} CYY_IOCTL_SYNC,*PCYY_IOCTL_SYNC;
typedef struct _CYY_IOCTL_BAUD {
PCYY_DEVICE_EXTENSION Extension;
ULONG Baud;
} CYY_IOCTL_BAUD,*PCYY_IOCTL_BAUD;
#define CyySetFlags(PDevExt, Value) \
CyySetDeviceFlags((PDevExt), &(PDevExt)->Flags, (Value), TRUE)
#define CyyClearFlags(PDevExt, Value) \
CyySetDeviceFlags((PDevExt), &(PDevExt)->Flags, (Value), FALSE)
#define CyySetAccept(PDevExt, Value) \
CyySetDeviceFlags((PDevExt), &(PDevExt)->DevicePNPAccept, (Value), TRUE)
#define CyyClearAccept(PDevExt, Value) \
CyySetDeviceFlags((PDevExt), &(PDevExt)->DevicePNPAccept, (Value), FALSE)
//
// The following three macros are used to initialize, set
// and clear references in IRPs that are used by
// this driver. The reference is stored in the fourth
// argument of the irp, which is never used by any operation
// accepted by this driver.
//
#define SERIAL_REF_ISR (0x00000001)
#define SERIAL_REF_CANCEL (0x00000002)
#define SERIAL_REF_TOTAL_TIMER (0x00000004)
#define SERIAL_REF_INT_TIMER (0x00000008)
#define SERIAL_REF_XOFF_REF (0x00000010)
#define SERIAL_INIT_REFERENCE(Irp) { \
ASSERT(sizeof(ULONG_PTR) <= sizeof(PVOID)); \
IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4 = NULL; \
}
#define SERIAL_SET_REFERENCE(Irp,RefType) \
do { \
LONG _refType = (RefType); \
PULONG_PTR _arg4 = (PVOID)&IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4; \
ASSERT(!(*_arg4 & _refType)); \
*_arg4 |= _refType; \
} while (0)
#define SERIAL_CLEAR_REFERENCE(Irp,RefType) \
do { \
LONG _refType = (RefType); \
PULONG_PTR _arg4 = (PVOID)&IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4; \
ASSERT(*_arg4 & _refType); \
*_arg4 &= ~_refType; \
} while (0)
#define SERIAL_REFERENCE_COUNT(Irp) \
((ULONG_PTR)((IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4)))