Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

865 lines
16 KiB

/*++
Copyright (c) 1991 Microsoft Corporation
Copyright (c) 1991 Nokia Data Systems AB
Module Name:
dlcext.h
Abstract:
This module includes all internal prototypes and
externals of dlc (api driver) module.
Author:
Antti Saarenheimo 22-Jul-1991
Environment:
Kernel mode
Revision History:
--*/
extern USHORT aSpecialOutputBuffers[];
extern BOOLEAN MemoryLockFailed;
extern KSPIN_LOCK DlcSpinLock;
NTSTATUS
BufferPoolCreate(
#if DBG
IN PDLC_FILE_CONTEXT pFileContext,
#endif
IN PVOID pUserBuffer,
IN LONG MaxBufferSize,
IN LONG MinFreeSizeThreshold,
OUT HANDLE *pBufferPoolHandle,
OUT PVOID* AlignedAddress,
OUT PULONG AlignedSize
);
NTSTATUS
BufferPoolExpand(
#if DBG
IN PDLC_FILE_CONTEXT pFileContext,
#endif
IN PDLC_BUFFER_POOL pBufferPool
);
VOID
BufferPoolFreeExtraPages(
#if DBG
IN PDLC_FILE_CONTEXT pFileContext,
#endif
IN PDLC_BUFFER_POOL pBufferPool
);
VOID
DeallocateBuffer(
#if DBG
IN PDLC_FILE_CONTEXT pFileContext,
#endif
IN PDLC_BUFFER_POOL pBufferPool,
IN PDLC_BUFFER_HEADER pBuffer
);
NTSTATUS
AllocateBufferHeader(
#if DBG
IN PDLC_FILE_CONTEXT pFileContext,
#endif
IN PDLC_BUFFER_POOL pBufferPool,
IN PDLC_BUFFER_HEADER pParent,
IN UCHAR Size,
IN UCHAR Index,
IN UINT FreeListTableIndex
);
NTSTATUS
BufferPoolAllocate(
#if DBG
IN PDLC_FILE_CONTEXT pFileContext,
#endif
IN PDLC_BUFFER_POOL pBufferPool,
IN UINT BufferSize,
IN UINT FrameHeaderSize,
IN UINT UserDataSize,
IN UINT FrameLength,
IN UINT SegmentSizeIndex,
IN OUT PDLC_BUFFER_HEADER *ppBufferHeader,
OUT PUINT puiBufferSizeLeft
);
NTSTATUS
BufferPoolDeallocate(
IN PDLC_BUFFER_POOL pBufferPool,
IN UINT BufferCount,
IN PLLC_TRANSMIT_DESCRIPTOR pBuffers
);
NTSTATUS
BufferPoolBuildXmitBuffers(
IN PDLC_BUFFER_POOL pBufferPool,
IN UINT BufferCount,
IN PLLC_TRANSMIT_DESCRIPTOR pBuffers,
IN OUT PDLC_PACKET pPacket
);
VOID
BufferPoolFreeXmitBuffers(
IN PDLC_BUFFER_POOL pBufferPool,
IN OUT PDLC_PACKET pPacket
);
PDLC_BUFFER_HEADER
GetBufferHeader(
IN PDLC_BUFFER_POOL pBufferPool,
IN PVOID pUserBuffer
);
VOID
BufferPoolDereference(
#if DBG
IN PDLC_FILE_CONTEXT pFileContext,
#endif
IN PDLC_BUFFER_POOL *pBufferPool
);
NTSTATUS
BufferPoolReference(
IN HANDLE hExternalHandle,
OUT PVOID *phOpaqueHandle
);
VOID
BufferPoolDeallocateList(
IN PDLC_BUFFER_POOL pBufferPool,
IN PDLC_BUFFER_HEADER pBufferList
);
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS
CreateAdapterFileContext(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
);
NTSTATUS
CloseAdapterFileContext(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
);
VOID
DlcKillFileContext(
IN PDLC_FILE_CONTEXT pFileContext
);
VOID
DlcDriverUnload(
IN PDRIVER_OBJECT pDeviceObject
);
NTSTATUS
CleanupAdapterFileContext(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
);
NTSTATUS
DlcDeviceIoControl(
IN PDEVICE_OBJECT pDeviceContext,
IN PIRP pIrp
);
VOID
DlcCompleteIoRequest(
IN PIRP pIrp,
IN BOOLEAN InCancel
);
VOID
DlcCancelIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
SetIrpCancelRoutine(
IN PIRP Irp,
IN BOOLEAN Set
);
#ifdef DLC_PRIVATE_PROTOTYPES
DLC_STATUS
LlcReceiveIndication(
IN PDLC_FILE_CONTEXT hFileContext,
IN PDLC_OBJECT hDlcObject,
IN NDIS_HANDLE MacReceiveContext,
IN USHORT FrameType,
IN PUCHAR pLookBuf,
IN UINT cbLookBuf
);
VOID
LlcEventIndication(
IN PDLC_FILE_CONTEXT pFileContext,
IN PVOID hEventObject,
IN UINT Event,
IN PVOID pEventInformation,
IN ULONG SecondaryInfo
);
VOID
LlcCommandCompletion(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pDlcObject,
IN PDLC_PACKET pPacket
);
#else
DLC_STATUS
LlcReceiveIndication(
IN PVOID hFileContext,
IN PVOID hClientHandle,
IN NDIS_HANDLE MacReceiveContext,
IN USHORT FrameType,
IN PVOID pLookBuf,
IN UINT cbLookBuf
);
VOID
LlcEventIndication(
IN PVOID hFileContext,
IN PVOID hEventObject,
IN UINT Event,
IN PVOID pEventInformation,
IN ULONG SecondaryInformation
);
VOID
LlcCommandCompletion(
IN PVOID hFileContext,
IN PVOID hDlcObject,
IN PVOID hRequest
);
#endif
VOID
CompleteTransmitCommand(
IN PDLC_FILE_CONTEXT pFileContext,
IN PIRP pIrp,
IN PDLC_OBJECT pChainObject,
IN PDLC_PACKET pRootXmitNode
);
NTSTATUS
DlcQueryInformation(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcSetInformation(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
VOID
GetOpenSapAndStationCount(
IN PDLC_FILE_CONTEXT pFileContext,
OUT PUCHAR OpenSaps,
OUT PUCHAR OpenStations
);
NTSTATUS
SetupGroupSaps(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pDlcObject,
IN UINT GroupSapCount,
IN PUCHAR pGroupSapList
);
NTSTATUS
MakeDlcEvent(
IN PDLC_FILE_CONTEXT pFileContext,
IN ULONG Event,
IN USHORT StationId,
IN PDLC_OBJECT pDlcObject,
IN PVOID pEventInformation,
IN ULONG SecondaryInfo,
IN BOOLEAN FreeEventInfo
);
NTSTATUS
QueueDlcCommand(
IN PDLC_FILE_CONTEXT pFileContext,
IN ULONG Event,
IN USHORT StationId,
IN USHORT StationIdMask,
IN PIRP pIrp,
IN PVOID AbortHandle,
IN PFCOMPLETION_HANDLER pfCompletionHandler
);
NTSTATUS
AbortCommand(
IN PDLC_FILE_CONTEXT pFileContext,
IN USHORT StationId,
IN USHORT StationIdMask,
IN PVOID AbortHandle,
IN OUT PVOID *ppCcbLink,
IN UINT CancelStatus,
IN BOOLEAN SuppressCommandCompletion
);
VOID
CancelDlcCommand(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_COMMAND pDlcCommand,
IN OUT PVOID *ppCcbLink,
IN UINT CancelStatus,
IN BOOLEAN SuppressCommandCompletion
);
VOID
PurgeDlcEventQueue(
IN PDLC_FILE_CONTEXT pFileContext
);
VOID
PurgeDlcFlowControlQueue(
IN PDLC_FILE_CONTEXT pFileContext
);
VOID
CompleteDlcCommand(
IN PDLC_FILE_CONTEXT pFileContext,
IN USHORT StationId,
IN PDLC_COMMAND pDlcCommand,
IN UINT Status
);
PDLC_COMMAND
IsCommandOnList(
IN PVOID RequestHandle,
IN PLIST_ENTRY List
);
PDLC_COMMAND
SearchAndRemoveCommand(
IN PLIST_ENTRY pListHead,
IN ULONG EventMask,
IN USHORT StationId,
IN USHORT StationIdMask
);
PDLC_COMMAND
SearchAndRemoveCommandByHandle(
IN PLIST_ENTRY pListHead,
IN ULONG EventMask,
IN USHORT StationId,
IN USHORT StationIdMask,
IN PVOID AbortHandle
);
PDLC_COMMAND
SearchAndRemoveSpecificCommand(
IN PLIST_ENTRY pListHead,
IN PVOID AbortHandle
);
PDLC_COMMAND
SearchAndRemoveAnyCommand(
IN PDLC_FILE_CONTEXT pFileContext,
IN ULONG Event,
IN USHORT StationId,
IN USHORT StationIdMask,
IN PVOID pSearchHandle
);
VOID
SearchReadCommandForClose(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_CLOSE_WAIT_INFO pClosingInfo,
IN PVOID pCcbAddress,
IN ULONG CommandCompletionFlag,
IN USHORT StationId,
IN USHORT StationIdMask
);
NTSTATUS
DlcBufferFree(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcBufferGet(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcBufferCreate(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcBufferMaintain(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcConnectStation(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcFlowControl(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcReallocate(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcReset(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
BOOLEAN
ConnectCompletion(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pDlcObject,
IN PIRP pIrp,
IN UINT Event,
IN PVOID pEventInformation,
IN ULONG SecondaryInfo
);
NTSTATUS
DirSetExceptionFlags(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
VOID
DlcCompleteRequest(
IN PIRP pIrp,
IN PVOID pUserCcbPointer
);
VOID
CompleteAsyncCommand(
IN PDLC_FILE_CONTEXT pFileContext,
IN UINT Status,
IN PIRP pIrp,
IN PVOID pUserCcbPointer,
IN BOOLEAN InCancel
);
NTSTATUS
GetLinkStation(
IN PDLC_FILE_CONTEXT pFileContext,
IN USHORT StationId,
OUT PDLC_OBJECT *ppLinkStation
);
NTSTATUS
GetSapStation(
IN PDLC_FILE_CONTEXT pFileContext,
IN USHORT StationId,
OUT PDLC_OBJECT *ppLinkStation
);
NTSTATUS
GetStation(
IN PDLC_FILE_CONTEXT pFileContext,
IN USHORT StationId,
OUT PDLC_OBJECT *ppStation
);
NTSTATUS
DlcReadCancel(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG ParameterLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DirOpenAdapter(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG ParameterLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DirCloseAdapter(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG ParameterLength,
IN ULONG OutputBufferLength
);
VOID
CompleteDirInitialize(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_CLOSE_WAIT_INFO pClosingInfo,
IN PVOID pCcbLink
);
VOID
CompleteDirCloseAdapter(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_CLOSE_WAIT_INFO pClosingInfo,
IN PVOID pCcbLink
);
NTSTATUS
DlcTransmit(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pParameters,
IN ULONG ParameterLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DirTimerSet(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
BOOLEAN
DirTimerSetCompletion(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pDlcObject,
IN PIRP pIrp,
IN UINT Event,
IN PVOID pEventInformation,
IN ULONG SecondaryInfo
);
NTSTATUS
DirTimerCancelGroup(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DirTimerCancel(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG ParameterLength,
IN ULONG OutputBufferLength
);
PDLC_COMMAND*
SearchTimerCommand(
IN PDLC_COMMAND *ppQueue,
IN PVOID pSearchHandle,
IN BOOLEAN SearchCompletionFlags
);
PDLC_COMMAND
SearchPrevCommandWithFlag(
IN PDLC_COMMAND pQueueBase,
IN ULONG Event,
IN ULONG CommandCompletionFlag
);
VOID
AbortCommandsWithFlag(
IN PDLC_FILE_CONTEXT pFileContext,
IN ULONG CommandCompletionFlag,
IN OUT PVOID *ppCcbLink,
IN UINT CancelStatus
);
NTSTATUS
DlcOpenSap(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DirOpenDirect(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcOpenLinkStation(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
NTSTATUS
InitializeLinkStation(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pSap,
IN PNT_DLC_PARMS pDlcParms OPTIONAL,
IN PVOID LlcLinkHandle OPTIONAL,
OUT PDLC_OBJECT *ppLinkStation
);
NTSTATUS
DlcCloseStation(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
BOOLEAN
CloseAllStations(
IN PDLC_FILE_CONTEXT pFileContext,
IN PIRP pIrp,
IN ULONG Event,
IN PFCLOSE_COMPLETE pfCloseComplete,
IN PNT_DLC_PARMS pDlcParms,
IN PDLC_CLOSE_WAIT_INFO pClosingInfo
);
VOID
CloseAnyStation(
IN PDLC_OBJECT pDlcObject,
IN PDLC_CLOSE_WAIT_INFO pClosingInfo,
IN BOOLEAN DoImmediateClose
);
VOID
CompleteCloseReset(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_CLOSE_WAIT_INFO pClosingInfo
);
NTSTATUS
DlcReceiveRequest(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
BOOLEAN
ReceiveCompletion(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pDlcObject,
IN PIRP pIrp,
IN ULONG Event,
IN PVOID pEventInformation,
IN ULONG SecondaryInfo
);
NTSTATUS
DlcReadRequest(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG ParameterLength,
IN ULONG OutputBufferLength
);
BOOLEAN
ReadCompletion(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pDlcObject,
IN PIRP pIrp,
IN ULONG Event,
IN PVOID pEventInformation,
IN ULONG SecondaryInfo
);
VOID
CreateBufferChain(
IN PDLC_BUFFER_HEADER pBufferHeaders,
OUT PVOID *pFirstBuffer,
OUT PUSHORT pReceivedFrameCount
);
NTSTATUS
DlcReceiveCancel(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG ParameterLength,
IN ULONG OutputBufferLength
);
NTSTATUS
DlcCompleteCommand(
IN PIRP pIrp,
IN PDLC_FILE_CONTEXT pFileContext,
IN PNT_DLC_PARMS pDlcParms,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
VOID
GetDlcErrorCounters(
IN PDLC_FILE_CONTEXT pFileContext,
IN PUCHAR pAdapterErrors
);
VOID
QueueDlcEvent(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_PACKET pPacket
);
VOID
CompleteCloseStation(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pDlcObject
);
VOID
CloseStation(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_OBJECT pDlcObject,
IN BOOLEAN DoImmediateClose
);
VOID
CleanUpEvents(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_CLOSE_WAIT_INFO pClosingInfo,
IN PDLC_OBJECT pDlcObject
);
VOID
CompleteCompletionPacket(
IN PDLC_FILE_CONTEXT pFileContext,
IN PDLC_COMPLETION_EVENT_INFO pCompletionInfo,
IN OUT PNT_DLC_PARMS pParms
);
PMDL
AllocateProbeAndLockMdl(
IN PVOID UserBuffer,
IN UINT UserBufferLength
);
VOID
BuildMappedPartialMdl(
IN PMDL pMappedSourceMdl,
IN OUT PMDL pTargetMdl,
IN PVOID BaseVa,
IN ULONG Length
);
VOID
BufferTrace(
IN PDLC_BUFFER_POOL pBufferPool,
IN PSZ DebugString
);
VOID
CheckIrql(
PKIRQL pOldIrqLevel
);
VOID
ResetLocalBusyBufferStates(
IN PDLC_FILE_CONTEXT pFileContext
);
VOID
CompleteLlcObjectClose(
IN PDLC_OBJECT pDlcObject
);
VOID
UnlockAndFreeMdl(
PMDL pMdl
);
BOOLEAN
DecrementCloseCounters(
PDLC_FILE_CONTEXT pFileContext,
PDLC_CLOSE_WAIT_INFO pClosingInfo
);
VOID
CompleteDirectOutIrp(
IN PIRP Irp,
IN UCHAR Status,
IN PLLC_CCB NextCcb
);