/*++ 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_