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.
 
 
 
 
 
 

856 lines
17 KiB

/*++
Copyright (c) 1998-2002 Microsoft Corporation
Module Name:
proc.h
Abstract:
This module contains routine prototypes for UL.
Author:
Keith Moore (keithmo) 10-Jun-1998
Revision History:
--*/
#ifndef _PROC_H_
#define _PROC_H_
//
// Device driver entry routine from INIT.C.
//
EXTERN_C
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
//
// IRP handlers from various modules.
//
NTSTATUS
UlCleanup(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
UlClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
UlCreate(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
UlDeviceControl (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
UlEtwDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// Fast IO handler from DEVCTRL.C.
//
BOOLEAN
UlFastDeviceControl(
IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength,
IN ULONG IoControlCode,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
//
// Global data initialization/termination from DATA.C.
//
NTSTATUS
UlInitializeData(
PUL_CONFIG pConfig
);
VOID
UlTerminateData(
VOID
);
//
// Utility functions from MISC.C.
//
NTSTATUS
UlOpenRegistry(
IN PUNICODE_STRING BaseName,
OUT PHANDLE ParametersHandle,
IN PWSTR OptionalParameterString
);
LONG
UlReadLongParameter(
IN HANDLE ParametersHandle,
IN PWCHAR ValueName,
IN LONG DefaultValue
);
LONGLONG
UlReadLongLongParameter(
IN HANDLE ParametersHandle,
IN PWCHAR ValueName,
IN LONGLONG DefaultValue
);
NTSTATUS
UlReadGenericParameter(
IN HANDLE ParametersHandle,
IN PWCHAR ValueName,
OUT PKEY_VALUE_PARTIAL_INFORMATION * Value
);
VOID
UlBuildDeviceControlIrp(
IN OUT PIRP Irp,
IN ULONG IoControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
IN PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength,
IN PMDL MdlAddress,
IN PFILE_OBJECT FileObject,
IN PDEVICE_OBJECT DeviceObject,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN PIO_COMPLETION_ROUTINE CompletionRoutine,
IN PVOID CompletionContext,
IN PETHREAD TargetThread OPTIONAL
);
PSTR
UlULongLongToAscii(
IN PSTR String,
IN ULONGLONG Value
);
NTSTATUS
_RtlIntegerToUnicode(
IN ULONG Integer,
IN ULONG Base OPTIONAL,
IN LONG BufferLength,
OUT PWSTR pBuffer
);
__inline
NTSTATUS
UlAnsiToULongLong(
PUCHAR pString,
USHORT StringLength,
ULONG Base,
PULONGLONG pValue
)
{
ASSERT(StringLength > 0);
return HttpAnsiStringToULongLong(
pString,
StringLength,
TRUE, // LeadingZerosAllowed
Base,
NULL, // ppTerminator
pValue
);
}
__inline
NTSTATUS
UlUnicodeToULongLong(
PWCHAR pString,
USHORT StringLength,
ULONG Base,
PULONGLONG pValue
)
{
ASSERT(StringLength > 0);
return HttpWideStringToULongLong(
pString,
StringLength,
TRUE, // LeadingZerosAllowed
Base,
NULL, // ppTerminator
pValue
);
}
NTSTATUS
UlIssueDeviceControl(
IN PUX_TDI_OBJECT pTdiObject,
IN PVOID pIrpParameters,
IN ULONG IrpParametersLength,
IN PVOID pMdlBuffer OPTIONAL,
IN ULONG MdlBufferLength OPTIONAL,
IN UCHAR MinorFunction
);
/***************************************************************************++
Routine Description:
Invokes the completion routine (if specified) and determines the
appropriate return code. This routine ensures that, if the completion
routine is invoked, the caller always returns STATUS_PENDING.
Arguments:
Status - Supplies the completion status.
Information - Optionally supplies additional information about
the completed operation, such as the number of bytes
transferred.
pCompletionRoutine - Supplies a pointer to a completion routine to
invoke after the listening endpoint is fully closed.
pCompletionContext - Supplies an uninterpreted context value for the
completion routine.
Return Value:
NTSTATUS - Completion status. Will always be STATUS_PENDING if the
completion routine is invoked.
--***************************************************************************/
__inline
NTSTATUS
UlInvokeCompletionRoutine(
IN NTSTATUS Status,
IN ULONG_PTR Information,
IN PUL_COMPLETION_ROUTINE pCompletionRoutine,
IN PVOID pCompletionContext
)
{
if (pCompletionRoutine != NULL)
{
(pCompletionRoutine)(
pCompletionContext,
Status,
Information
);
Status = STATUS_PENDING;
}
return Status;
} // UlInvokeCompletionRoutine
//
// Initialize a TA_IP_ADDRESS[6] structure.
//
#define UlInitializeIpTransportAddress( ta, inaddr, port ) \
do { \
RtlZeroMemory( (ta), sizeof(*(ta)) ); \
(ta)->TAAddressCount = 1; \
(ta)->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP; \
(ta)->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; \
(ta)->Address[0].Address[0].in_addr = (inaddr); \
(ta)->Address[0].Address[0].sin_port = (USHORT) (port); \
} while (0, 0)
#define UlInitializeIp6TransportAddress( ta, in6addr, port, scope_id) \
do { \
RtlZeroMemory( (ta), sizeof(*(ta)) ); \
(ta)->TAAddressCount = 1; \
(ta)->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP6; \
(ta)->Address[0].AddressType = TDI_ADDRESS_TYPE_IP6; \
RtlCopyMemory((ta)->Address[0].Address[0].sin6_addr, \
(in6addr), \
sizeof(in6addr)); \
(ta)->Address[0].Address[0].sin6_port = (USHORT) (port); \
(ta)->Address[0].Address[0].sin6_flowinfo = 0; \
(ta)->Address[0].Address[0].sin6_scope_id = (scope_id); \
} while (0, 0)
//
// IRP context manipulators.
//
__inline
PUL_IRP_CONTEXT
UlPplAllocateIrpContext(
VOID
)
{
PUL_IRP_CONTEXT pContext;
pContext = (PUL_IRP_CONTEXT)
PplAllocate(g_pUlNonpagedData->IrpContextLookaside);
if (pContext)
{
ASSERT(pContext->Signature == UL_IRP_CONTEXT_SIGNATURE_X);
pContext->Signature = UL_IRP_CONTEXT_SIGNATURE;
}
return pContext;
}
__inline
VOID
UlPplFreeIrpContext(
PUL_IRP_CONTEXT pContext
)
{
ASSERT(HAS_VALID_SIGNATURE(pContext, UL_IRP_CONTEXT_SIGNATURE));
pContext->Signature = UL_IRP_CONTEXT_SIGNATURE_X;
PplFree(g_pUlNonpagedData->IrpContextLookaside, pContext);
}
PVOID
UlAllocateIrpContextPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeIrpContextPool(
IN PVOID pBuffer
);
//
// Buffer allocators.
//
__inline
PUL_RECEIVE_BUFFER
UlPplAllocateReceiveBuffer(
VOID
)
{
PUL_RECEIVE_BUFFER pBuffer;
pBuffer = (PUL_RECEIVE_BUFFER)
PplAllocate(g_pUlNonpagedData->ReceiveBufferLookaside);
if (pBuffer)
{
ASSERT(pBuffer->Signature == UL_RECEIVE_BUFFER_SIGNATURE_X);
pBuffer->Signature = UL_RECEIVE_BUFFER_SIGNATURE;
}
return pBuffer;
}
__inline
VOID
UlPplFreeReceiveBuffer(
PUL_RECEIVE_BUFFER pBuffer
)
{
ASSERT(HAS_VALID_SIGNATURE(pBuffer, UL_RECEIVE_BUFFER_SIGNATURE));
pBuffer->Signature = UL_RECEIVE_BUFFER_SIGNATURE_X;
PplFree(g_pUlNonpagedData->ReceiveBufferLookaside, pBuffer);
}
PVOID
UlAllocateReceiveBuffer(
IN CCHAR IrpStackSize
);
PVOID
UlAllocateReceiveBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeReceiveBufferPool(
IN PVOID pBuffer
);
//
// Request buffer allocators.
//
__inline
PUL_REQUEST_BUFFER
UlPplAllocateRequestBuffer(
VOID
)
{
PUL_REQUEST_BUFFER pBuffer;
pBuffer = (PUL_REQUEST_BUFFER)
PplAllocate(g_pUlNonpagedData->RequestBufferLookaside);
if (pBuffer)
{
ASSERT(pBuffer->Signature == MAKE_FREE_TAG(UL_REQUEST_BUFFER_POOL_TAG));
pBuffer->Signature = UL_REQUEST_BUFFER_POOL_TAG;
}
return pBuffer;
}
__inline
VOID
UlPplFreeRequestBuffer(
PUL_REQUEST_BUFFER pBuffer
)
{
ASSERT(HAS_VALID_SIGNATURE(pBuffer, UL_REQUEST_BUFFER_POOL_TAG));
pBuffer->Signature = MAKE_FREE_TAG(UL_REQUEST_BUFFER_POOL_TAG);
PplFree(g_pUlNonpagedData->RequestBufferLookaside, pBuffer);
}
PVOID
UlAllocateRequestBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeRequestBufferPool(
IN PVOID pBuffer
);
//
// Internal request buffer allocators.
//
__inline
PUL_INTERNAL_REQUEST
UlPplAllocateInternalRequest(
VOID
)
{
PUL_INTERNAL_REQUEST pRequest;
pRequest = (PUL_INTERNAL_REQUEST)
PplAllocate(g_pUlNonpagedData->InternalRequestLookaside);
if (pRequest)
{
ASSERT(pRequest->Signature ==
MAKE_FREE_TAG(UL_INTERNAL_REQUEST_POOL_TAG));
pRequest->Signature = UL_INTERNAL_REQUEST_POOL_TAG;
}
return pRequest;
}
__inline
VOID
UlPplFreeInternalRequest(
PUL_INTERNAL_REQUEST pRequest
)
{
ASSERT(HAS_VALID_SIGNATURE(pRequest, UL_INTERNAL_REQUEST_POOL_TAG));
pRequest->Signature = MAKE_FREE_TAG(UL_INTERNAL_REQUEST_POOL_TAG);
PplFree(g_pUlNonpagedData->InternalRequestLookaside, pRequest);
}
PVOID
UlAllocateInternalRequestPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeInternalRequestPool(
IN PVOID pBuffer
);
//
// Chunk tracker allocators.
//
__inline
PUL_CHUNK_TRACKER
UlPplAllocateChunkTracker(
VOID
)
{
PUL_CHUNK_TRACKER pTracker;
pTracker = (PUL_CHUNK_TRACKER)
PplAllocate(g_pUlNonpagedData->ChunkTrackerLookaside);
if (pTracker)
{
ASSERT(pTracker->Signature == MAKE_FREE_TAG(UL_CHUNK_TRACKER_POOL_TAG));
pTracker->Signature = UL_CHUNK_TRACKER_POOL_TAG;
}
return pTracker;
}
__inline
VOID
UlPplFreeChunkTracker(
PUL_CHUNK_TRACKER pTracker
)
{
ASSERT(HAS_VALID_SIGNATURE(pTracker, UL_CHUNK_TRACKER_POOL_TAG));
pTracker->Signature = MAKE_FREE_TAG(UL_CHUNK_TRACKER_POOL_TAG);
PplFree(g_pUlNonpagedData->ChunkTrackerLookaside, pTracker);
}
PVOID
UlAllocateChunkTrackerPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeChunkTrackerPool(
IN PVOID pBuffer
);
//
// Full tracker allocators.
//
__inline
PUL_FULL_TRACKER
UlPplAllocateFullTracker(
VOID
)
{
PUL_FULL_TRACKER pTracker;
pTracker = (PUL_FULL_TRACKER)
PplAllocate(g_pUlNonpagedData->FullTrackerLookaside);
if (pTracker)
{
ASSERT(pTracker->Signature == MAKE_FREE_TAG(UL_FULL_TRACKER_POOL_TAG));
pTracker->Signature = UL_FULL_TRACKER_POOL_TAG;
}
return pTracker;
}
__inline
VOID
UlPplFreeFullTracker(
PUL_FULL_TRACKER pTracker
)
{
ASSERT(HAS_VALID_SIGNATURE(pTracker, UL_FULL_TRACKER_POOL_TAG));
pTracker->Signature = MAKE_FREE_TAG(UL_FULL_TRACKER_POOL_TAG);
PplFree(g_pUlNonpagedData->FullTrackerLookaside, pTracker);
}
PVOID
UlAllocateFullTrackerPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeFullTrackerPool(
IN PVOID pBuffer
);
//
// Internal response buffer allocators.
//
__inline
PUL_INTERNAL_RESPONSE
UlPplAllocateResponseBuffer(
VOID
)
{
PUL_INTERNAL_RESPONSE pResponse;
pResponse = (PUL_INTERNAL_RESPONSE)
PplAllocate(g_pUlNonpagedData->ResponseBufferLookaside);
if (pResponse)
{
ASSERT(pResponse->Signature ==
MAKE_FREE_TAG(UL_INTERNAL_RESPONSE_POOL_TAG));
pResponse->Signature = UL_INTERNAL_RESPONSE_POOL_TAG;
}
return pResponse;
}
__inline
VOID
UlPplFreeResponseBuffer(
PUL_INTERNAL_RESPONSE pResponse
)
{
ASSERT(HAS_VALID_SIGNATURE(pResponse, UL_INTERNAL_RESPONSE_POOL_TAG));
pResponse->Signature = MAKE_FREE_TAG(UL_INTERNAL_RESPONSE_POOL_TAG);
PplFree(g_pUlNonpagedData->ResponseBufferLookaside, pResponse);
}
PVOID
UlAllocateResponseBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeResponseBufferPool(
IN PVOID pBuffer
);
//
// Log file buffer allocators.
//
__inline
PUL_LOG_FILE_BUFFER
UlPplAllocateLogFileBuffer(
VOID
)
{
PUL_LOG_FILE_BUFFER pBuffer;
PAGED_CODE();
pBuffer = (PUL_LOG_FILE_BUFFER)
PplAllocate(g_pUlNonpagedData->LogFileBufferLookaside);
if (pBuffer)
{
ASSERT(pBuffer->Signature ==
MAKE_FREE_TAG(UL_LOG_FILE_BUFFER_POOL_TAG));
pBuffer->Signature = UL_LOG_FILE_BUFFER_POOL_TAG;
}
return pBuffer;
}
__inline
VOID
UlPplFreeLogFileBuffer(
IN PUL_LOG_FILE_BUFFER pBuffer
)
{
PAGED_CODE();
ASSERT(IS_VALID_LOG_FILE_BUFFER(pBuffer));
pBuffer->BufferUsed = 0;
pBuffer->Signature = MAKE_FREE_TAG(UL_LOG_FILE_BUFFER_POOL_TAG);
PplFree(g_pUlNonpagedData->LogFileBufferLookaside, pBuffer);
}
PVOID
UlAllocateLogFileBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeLogFileBufferPool(
IN PVOID pBuffer
);
//
// Log data buffer allocators
//
__inline
PUL_LOG_DATA_BUFFER
UlPplAllocateLogDataBuffer(
BOOLEAN Binary
)
{
PUL_LOG_DATA_BUFFER pBuffer;
HANDLE Lookaside;
ULONG Tag;
PAGED_CODE();
if (Binary)
{
Tag = UL_BINARY_LOG_DATA_BUFFER_POOL_TAG;
Lookaside = g_pUlNonpagedData->BinaryLogDataBufferLookaside;
}
else
{
Tag = UL_ANSI_LOG_DATA_BUFFER_POOL_TAG;
Lookaside = g_pUlNonpagedData->AnsiLogDataBufferLookaside;
}
pBuffer = (PUL_LOG_DATA_BUFFER) PplAllocate(Lookaside);
if (pBuffer)
{
ASSERT(pBuffer->Signature == MAKE_FREE_TAG(Tag));
pBuffer->Signature = Tag;
pBuffer->Used = 0;
}
return pBuffer;
}
__inline
VOID
UlPplFreeLogDataBuffer(
IN PUL_LOG_DATA_BUFFER pBuffer
)
{
HANDLE Lookaside;
ULONG Tag;
PAGED_CODE();
ASSERT(IS_VALID_LOG_DATA_BUFFER(pBuffer));
if (pBuffer->Flags.Binary)
{
Tag = UL_BINARY_LOG_DATA_BUFFER_POOL_TAG;
Lookaside = g_pUlNonpagedData->BinaryLogDataBufferLookaside;
}
else
{
Tag = UL_ANSI_LOG_DATA_BUFFER_POOL_TAG;
Lookaside = g_pUlNonpagedData->AnsiLogDataBufferLookaside;
}
pBuffer->Used = 0;
pBuffer->Signature = MAKE_FREE_TAG(Tag);
PplFree(Lookaside, pBuffer);
}
PVOID
UlAllocateLogDataBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeLogDataBufferPool(
IN PVOID pBuffer
);
//
// Error logging buffer allocaters and de-allocators
//
__inline
PUL_ERROR_LOG_BUFFER
UlPplAllocateErrorLogBuffer(
VOID
)
{
PUL_ERROR_LOG_BUFFER pBuffer;
HANDLE Lookaside = g_pUlNonpagedData->ErrorLogBufferLookaside;
PAGED_CODE();
UlTrace(ERROR_LOGGING,("Http!UlPplAllocateErrorLogBuffer: <LOOKASIDE>\n"));
pBuffer = (PUL_ERROR_LOG_BUFFER) PplAllocate(Lookaside);
if (pBuffer)
{
ASSERT(pBuffer->Signature ==
MAKE_FREE_TAG(UL_ERROR_LOG_BUFFER_POOL_TAG));
pBuffer->Signature = UL_ERROR_LOG_BUFFER_POOL_TAG;
pBuffer->Used = 0;
}
return pBuffer;
}
__inline
VOID
UlPplFreeErrorLogBuffer(
IN PUL_ERROR_LOG_BUFFER pBuffer
)
{
HANDLE Lookaside = g_pUlNonpagedData->ErrorLogBufferLookaside;
PAGED_CODE();
ASSERT(IS_VALID_ERROR_LOG_BUFFER(pBuffer));
pBuffer->Used = 0;
pBuffer->Signature = MAKE_FREE_TAG(UL_ERROR_LOG_BUFFER_POOL_TAG);
PplFree(Lookaside, pBuffer);
}
PVOID
UlAllocateErrorLogBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeErrorLogBufferPool(
IN PVOID pBuffer
);
//
// Trivial macro that should probably be in ntos\inc\io.h.
//
#define UlUnmarkIrpPending( Irp ) ( \
IoGetCurrentIrpStackLocation( (Irp) )->Control &= ~SL_PENDING_RETURNED )
#endif // _PROC_H_