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.
 
 
 
 
 
 

516 lines
12 KiB

/*++
Copyright (c) 1998-2001 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_
#ifdef __cplusplus
extern "C" {
#endif
//
// 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
);
//
// 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
);
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
);
NTSTATUS
UlAnsiToULongLong(
PUCHAR pString,
ULONG Base,
PULONGLONG pValue
);
NTSTATUS
UlUnicodeToULongLong(
PWCHAR pString,
ULONG Base,
PULONGLONG 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
);
NTSTATUS
UlInvokeCompletionRoutine(
IN NTSTATUS Status,
IN ULONG_PTR Information,
IN PUL_COMPLETION_ROUTINE pCompletionRoutine,
IN PVOID pCompletionContext
);
//
// Initialize a TA_IP_ADDRESS structure.
//
#define UlInitializeIpTransportAddress( ta, ipaddr, port ) \
do { \
RtlZeroMemory( (ta), sizeof(*(ta)) ); \
(ta)->TAAddressCount = 1; \
(ta)->Address[0].AddressLength = sizeof(TDI_ADDRESS_IP); \
(ta)->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; \
(ta)->Address[0].Address[0].in_addr = SWAP_LONG( (ipaddr) ); \
(ta)->Address[0].Address[0].sin_port = SWAP_SHORT( (port) ); \
} while (FALSE)
//
// The following definitions are used to generate meaningful blue bugcheck
// screens. On a bugcheck the file system can output 4 ulongs of useful
// information. The first ulong will have encoded in it a source file id
// (in the high word) and the line number of the bugcheck (in the low word).
// The other values can be whatever the caller of the bugcheck routine deems
// necessary.
//
// Each individual file that calls bugcheck needs to have defined at the
// start of the file a constant called BugCheckFileId with one of the
// UL_BUG_CHECK_ values defined below and then use UlBugCheck to bugcheck
// the system.
//
#define UL_BUG_CHECK_CLOSE (0x00010000)
#define UL_BUG_CHECK_CREATE (0x00020000)
#define UL_BUG_CHECK_DEBUG (0x00030000)
#define UL_BUG_CHECK_DEVCTRL (0x00040000)
#define UL_BUG_CHECK_INIT (0x00050000)
#define UL_BUG_CHECK_IOCTL (0x00060000)
#define UL_BUG_CHECK_MISC (0x00070000)
#define UL_BUG_CHECK_ULDATA (0x00080000)
#define UlBugCheck(A,B,C) \
KeBugCheckEx( \
UL_INTERNAL_ERROR, \
BugCheckFileId | __LINE__, \
(A), \
(B), \
(C) \
)
//
// IRP context manipulators.
//
#define UlPplAllocateIrpContext() \
(PUL_IRP_CONTEXT)(PplAllocate( \
g_pUlNonpagedData->IrpContextLookaside \
))
#define UlPplFreeIrpContext( pContext ) \
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.
//
#define UlPplAllocateReceiveBuffer() \
(PUL_RECEIVE_BUFFER)(PplAllocate( \
g_pUlNonpagedData->ReceiveBufferLookaside \
))
#define UlPplFreeReceiveBuffer( pBuffer ) \
PplFree( \
g_pUlNonpagedData->ReceiveBufferLookaside, \
(pBuffer) \
)
PVOID
UlAllocateReceiveBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeReceiveBufferPool(
IN PVOID pBuffer
);
//
// Request buffer allocators.
//
#define UlPplAllocateRequestBuffer() \
(PUL_REQUEST_BUFFER)(PplAllocate( \
g_pUlNonpagedData->RequestBufferLookaside \
))
#define UlPplFreeRequestBuffer( pBuffer ) \
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.
//
#define UlPplAllocateInternalRequest() \
(PUL_INTERNAL_REQUEST)(PplAllocate( \
g_pUlNonpagedData->InternalRequestLookaside \
))
#define UlPplFreeInternalRequest( pBuffer ) \
PplFree( \
g_pUlNonpagedData->InternalRequestLookaside, \
(pBuffer) \
)
PVOID
UlAllocateInternalRequestPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeInternalRequestPool(
IN PVOID pBuffer
);
//
// Chunk tracker allocators.
//
#define UlPplAllocateChunkTracker() \
(PUL_CHUNK_TRACKER)(PplAllocate( \
g_pUlNonpagedData->ChunkTrackerLookaside \
))
#define UlPplFreeChunkTracker( pBuffer ) \
PplFree( \
g_pUlNonpagedData->ChunkTrackerLookaside, \
(pBuffer) \
)
PVOID
UlAllocateChunkTrackerPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeChunkTrackerPool(
IN PVOID pBuffer
);
//
// Full tracker allocators.
//
#define UlPplAllocateFullTracker() \
(PUL_FULL_TRACKER)(PplAllocate( \
g_pUlNonpagedData->FullTrackerLookaside \
))
#define UlPplFreeFullTracker( pBuffer ) \
PplFree( \
g_pUlNonpagedData->FullTrackerLookaside, \
(pBuffer) \
)
PVOID
UlAllocateFullTrackerPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeFullTrackerPool(
IN PVOID pBuffer
);
//
// Internal response buffer allocators.
//
#define UlPplAllocateResponseBuffer() \
(PUL_INTERNAL_RESPONSE)(PplAllocate( \
g_pUlNonpagedData->ResponseBufferLookaside \
))
#define UlPplFreeResponseBuffer( pBuffer ) \
PplFree( \
g_pUlNonpagedData->ResponseBufferLookaside, \
(pBuffer) \
)
PVOID
UlAllocateResponseBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeResponseBufferPool(
IN PVOID pBuffer
);
//
// Log buffer allocators.
//
__inline
PUL_LOG_FILE_BUFFER
FASTCALL
UlPplAllocateLogBuffer(
VOID
)
{
PUL_LOG_FILE_BUFFER pBuffer;
PAGED_CODE();
pBuffer = (PUL_LOG_FILE_BUFFER)
PplAllocate(
g_pUlNonpagedData->LogBufferLookaside
);
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
FASTCALL
UlPplFreeLogBuffer(
IN PUL_LOG_FILE_BUFFER pBuffer
)
{
PAGED_CODE();
IS_VALID_LOG_FILE_BUFFER(pBuffer);
pBuffer->BufferUsed = 0;
pBuffer->Signature = MAKE_FREE_TAG(UL_LOG_FILE_BUFFER_POOL_TAG);
PplFree(
g_pUlNonpagedData->LogBufferLookaside,
pBuffer
);
}
PVOID
UlAllocateLogBufferPool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlFreeLogBufferPool(
IN PVOID pBuffer
);
//
// Trivial macro that should probably be in ntos\inc\io.h.
//
#define UlUnmarkIrpPending( Irp ) ( \
IoGetCurrentIrpStackLocation( (Irp) )->Control &= ~SL_PENDING_RETURNED )
#ifdef __cplusplus
}; // extern "C"
#endif
#endif // _PROC_H_