mirror of https://github.com/tongzx/nt5src
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
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_
|