|
|
/*++
Copyright (c) 1998-2002 Microsoft Corporation
Module Name:
debug.h
Abstract:
This module contains debug-specific declarations.
Author:
Keith Moore (keithmo) 10-Jun-1998
Revision History:
--*/
#ifndef _DEBUG_H_
#define _DEBUG_H_
#define UL_DEFAULT_ERROR_ON_EXCEPTION STATUS_INVALID_PARAMETER
#if DBG
//
// Initialization/termination functions.
//
VOID UlDbgInitializeDebugData( VOID );
VOID UlDbgTerminateDebugData( VOID );
//
// Driver entry/exit notifications.
//
VOID UlDbgEnterDriver( IN PCSTR pFunctionName, IN PIRP pIrp OPTIONAL, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgLeaveDriver( IN PCSTR pFunctionName, IN PCSTR pFileName, IN USHORT LineNumber );
#define UL_ENTER_DRIVER( function, pirp ) \
UlDbgEnterDriver( \ (function), \ (pirp), \ __FILE__, \ __LINE__ \ )
#define UL_LEAVE_DRIVER( function ) \
UlDbgLeaveDriver( \ (function), \ __FILE__, \ __LINE__ \ )
//
// An instrumented resource.
//
#define MAX_RESOURCE_NAME_LENGTH 64
typedef struct _UL_ERESOURCE { //
// The actual resource.
//
// N.B. This must be the first entry in the structure to make the
// debugger extension work properly!
//
ERESOURCE Resource;
//
// Links onto the global resource list.
//
LIST_ENTRY GlobalResourceListEntry;
//
// Pointer to the thread that owns this lock exclusively.
//
PETHREAD pExclusiveOwner; PETHREAD pPreviousOwner;
//
// The number of times this lock has been acquired recursively (in
// exclusive acquisition case.)
//
LONG ExclusiveRecursionCount;
//
// Statistics.
//
LONG ExclusiveCount; LONG SharedCount; LONG ReleaseCount;
//
// The object that created this lock
//
ULONG OwnerTag;
//
// The name of the resource, for display purposes.
//
UCHAR ResourceName[MAX_RESOURCE_NAME_LENGTH];
} UL_ERESOURCE, *PUL_ERESOURCE;
NTSTATUS UlDbgInitializeResource( IN PUL_ERESOURCE pResource, IN PCSTR pResourceName, IN ULONG_PTR Parameter, IN ULONG OwnerTag, IN PCSTR pFileName, IN USHORT LineNumber );
NTSTATUS UlDbgDeleteResource( IN PUL_ERESOURCE pResource, IN PCSTR pFileName, IN USHORT LineNumber );
BOOLEAN UlDbgAcquireResourceExclusive( IN PUL_ERESOURCE pResource, IN BOOLEAN Wait, IN PCSTR pFileName, IN USHORT LineNumber );
BOOLEAN UlDbgAcquireResourceShared( IN PUL_ERESOURCE pResource, IN BOOLEAN Wait, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgReleaseResource( IN PUL_ERESOURCE pResource, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgConvertExclusiveToShared( IN PUL_ERESOURCE pResource, IN PCSTR pFileName, IN USHORT LineNumber );
BOOLEAN UlDbgTryToAcquireResourceExclusive( IN PUL_ERESOURCE pResource, IN PCSTR pFileName, IN USHORT LineNumber );
BOOLEAN UlDbgResourceOwnedExclusive( IN PUL_ERESOURCE pResource );
BOOLEAN UlDbgResourceUnownedExclusive( IN PUL_ERESOURCE pResource );
PDRIVER_CANCEL UlDbgIoSetCancelRoutine( PIRP pIrp, PDRIVER_CANCEL pCancelRoutine );
#define UlInitializeResource( resource, name, param, tag ) \
UlDbgInitializeResource( \ (resource), \ (name), \ (ULONG_PTR)(param), \ (tag), \ __FILE__, \ __LINE__ \ )
#define UlDeleteResource( resource ) \
UlDbgDeleteResource( \ (resource), \ __FILE__, \ __LINE__ \ )
#define UlAcquireResourceExclusive( resource, wait ) \
UlDbgAcquireResourceExclusive( \ (resource), \ (wait), \ __FILE__, \ __LINE__ \ )
#define UlAcquireResourceShared( resource, wait ) \
UlDbgAcquireResourceShared( \ (resource), \ (wait), \ __FILE__, \ __LINE__ \ )
#define UlReleaseResource( resource ) \
UlDbgReleaseResource( \ (resource), \ __FILE__, \ __LINE__ \ )
#define UlConvertExclusiveToShared( resource ) \
UlDbgConvertExclusiveToShared( \ (resource), \ __FILE__, \ __LINE__ \ )
#define UlTryToAcquireResourceExclusive( resource ) \
UlDbgTryToAcquireResourceExclusive( \ (resource), \ __FILE__, \ __LINE__ \ )
#define IS_RESOURCE_INITIALIZED( resource ) \
((resource)->Resource.SystemResourcesList.Flink != NULL)
//
// An instrumented push lock.
//
#define MAX_PUSHLOCK_NAME_LENGTH 64
typedef struct _UL_PUSH_LOCK { //
// The actual push lock.
//
// N.B. This must be the first entry in the structure to make the
// debugger extension work properly!
//
EX_PUSH_LOCK PushLock;
//
// Links onto the global push lock list.
//
LIST_ENTRY GlobalPushLockListEntry;
//
// Pointer to the thread that owns this lock exclusively.
//
PETHREAD pExclusiveOwner; PETHREAD pPreviousOwner;
//
// Statistics.
//
LONG ExclusiveCount; LONG SharedCount; LONG ReleaseCount;
//
// The object that created this lock
//
ULONG OwnerTag;
//
// The name of the push lock, for display purposes.
//
UCHAR PushLockName[MAX_PUSHLOCK_NAME_LENGTH];
} UL_PUSH_LOCK, *PUL_PUSH_LOCK;
VOID UlDbgInitializePushLock( IN PUL_PUSH_LOCK pPushLock, IN PCSTR pPushLockName, IN ULONG_PTR Parameter, IN ULONG OwnerTag, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgDeletePushLock( IN PUL_PUSH_LOCK pPushLock, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgAcquirePushLockExclusive( IN PUL_PUSH_LOCK pPushLock, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgReleasePushLockExclusive( IN PUL_PUSH_LOCK pPushLock, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgAcquirePushLockShared( IN PUL_PUSH_LOCK pPushLock, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgReleasePushLockShared( IN PUL_PUSH_LOCK pPushLock, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgReleasePushLock( IN PUL_PUSH_LOCK pPushLock, IN PCSTR pFileName, IN USHORT LineNumber );
BOOLEAN UlDbgPushLockOwnedExclusive( IN PUL_PUSH_LOCK pPushLock );
BOOLEAN UlDbgPushLockUnownedExclusive( IN PUL_PUSH_LOCK pPushLock );
#define UlInitializePushLock( pushlock, name, param, tag ) \
UlDbgInitializePushLock( \ (pushlock), \ (name), \ (ULONG_PTR)(param), \ (tag), \ __FILE__, \ __LINE__ \ )
#define UlDeletePushLock( pushlock ) \
UlDbgDeletePushLock( \ (pushlock), \ __FILE__, \ __LINE__ \ )
#define UlAcquirePushLockExclusive( pushlock ) \
UlDbgAcquirePushLockExclusive( \ (pushlock), \ __FILE__, \ __LINE__ \ )
#define UlReleasePushLockExclusive( pushlock ) \
UlDbgReleasePushLockExclusive( \ (pushlock), \ __FILE__, \ __LINE__ \ )
#define UlAcquirePushLockShared( pushlock ) \
UlDbgAcquirePushLockShared( \ (pushlock), \ __FILE__, \ __LINE__ \ )
#define UlReleasePushLockShared( pushlock ) \
UlDbgReleasePushLockShared( \ (pushlock), \ __FILE__, \ __LINE__ \ )
#define UlReleasePushLock( pushlock ) \
UlDbgReleasePushLock( \ (pushlock), \ __FILE__, \ __LINE__ \ )
//
// An instrumented spinlock.
//
typedef struct _UL_SPIN_LOCK // SpinLock
{ //
// The actual lock.
//
// N.B. This must be the first entry in the structure to make the
// debugger extension work properly!
//
KSPIN_LOCK KSpinLock;
//
// The name of the spinlock, for display purposes.
//
PCSTR pSpinLockName;
//
// Pointer to the thread that owns this lock.
//
PETHREAD pOwnerThread;
//
// Statistics.
//
PCSTR pLastAcquireFileName; PCSTR pLastReleaseFileName; USHORT LastAcquireLineNumber; USHORT LastReleaseLineNumber; ULONG OwnerProcessor; LONG Acquisitions; LONG Releases; LONG AcquisitionsAtDpcLevel; LONG ReleasesFromDpcLevel; LONG Spare;
} UL_SPIN_LOCK, *PUL_SPIN_LOCK;
#define KSPIN_LOCK_FROM_UL_SPIN_LOCK( pLock ) \
&((pLock)->KSpinLock)
VOID UlDbgInitializeSpinLock( IN PUL_SPIN_LOCK pSpinLock, IN PCSTR pSpinLockName, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgAcquireSpinLock( IN PUL_SPIN_LOCK pSpinLock, OUT PKIRQL pOldIrql, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgReleaseSpinLock( IN PUL_SPIN_LOCK pSpinLock, IN KIRQL OldIrql, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgAcquireSpinLockAtDpcLevel( IN PUL_SPIN_LOCK pSpinLock, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgReleaseSpinLockFromDpcLevel( IN PUL_SPIN_LOCK pSpinLock, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgAcquireInStackQueuedSpinLock( IN PUL_SPIN_LOCK pSpinLock, OUT PKLOCK_QUEUE_HANDLE pLockHandle, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgReleaseInStackQueuedSpinLock( IN PUL_SPIN_LOCK pSpinLock, IN PKLOCK_QUEUE_HANDLE pLockHandle, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgAcquireInStackQueuedSpinLockAtDpcLevel( IN PUL_SPIN_LOCK pSpinLock, OUT PKLOCK_QUEUE_HANDLE pLockHandle, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgReleaseInStackQueuedSpinLockFromDpcLevel( IN PUL_SPIN_LOCK pSpinLock, IN PKLOCK_QUEUE_HANDLE pLockHandle, IN PCSTR pFileName, IN USHORT LineNumber );
BOOLEAN UlDbgSpinLockOwned( IN PUL_SPIN_LOCK pSpinLock );
BOOLEAN UlDbgSpinLockUnowned( IN PUL_SPIN_LOCK pSpinLock );
#define UlInitializeSpinLock( spinlock, name ) \
UlDbgInitializeSpinLock( \ (spinlock), \ (name), \ __FILE__, \ __LINE__ \ )
#define UlAcquireSpinLock( spinlock, oldirql ) \
UlDbgAcquireSpinLock( \ (spinlock), \ (oldirql), \ __FILE__, \ __LINE__ \ )
#define UlReleaseSpinLock( spinlock, oldirql ) \
UlDbgReleaseSpinLock( \ (spinlock), \ (oldirql), \ __FILE__, \ __LINE__ \ )
#define UlAcquireSpinLockAtDpcLevel( spinlock ) \
UlDbgAcquireSpinLockAtDpcLevel( \ (spinlock), \ __FILE__, \ __LINE__ \ )
#define UlReleaseSpinLockFromDpcLevel( spinlock ) \
UlDbgReleaseSpinLockFromDpcLevel( \ (spinlock), \ __FILE__, \ __LINE__ \ )
#define UlAcquireInStackQueuedSpinLock( spinlock, lockhandle ) \
UlDbgAcquireInStackQueuedSpinLock( \ (spinlock), \ (lockhandle), \ __FILE__, \ __LINE__ \ )
#define UlReleaseInStackQueuedSpinLock( spinlock, lockhandle ) \
UlDbgReleaseInStackQueuedSpinLock( \ (spinlock), \ (lockhandle), \ __FILE__, \ __LINE__ \ )
#define UlAcquireInStackQueuedSpinLockAtDpcLevel( spinlock, lockhandle ) \
UlDbgAcquireInStackQueuedSpinLockAtDpcLevel( \ (spinlock), \ (lockhandle), \ __FILE__, \ __LINE__ \ )
#define UlReleaseInStackQueuedSpinLockFromDpcLevel( spinlock, lockhandle ) \
UlDbgReleaseInStackQueuedSpinLockFromDpcLevel( \ (spinlock), \ (lockhandle), \ __FILE__, \ __LINE__ \ )
#define DEBUG
#if !TRACE_TO_STRING_LOG
# define WriteGlobalStringLog DbgPrint
#endif
VOID UlDbgPrettyPrintBuffer( IN const UCHAR* pBuffer, IN ULONG_PTR BufferSize );
//
// Debug pool allocator.
//
PVOID UlDbgAllocatePool ( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag, IN PCSTR pFileName, IN USHORT LineNumber, IN PEPROCESS pProcess );
VOID UlDbgFreePool ( IN PVOID pPointer, IN ULONG Tag, IN PCSTR pFileName, IN USHORT LineNumber, IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN PEPROCESS pProcess );
#define UL_ALLOCATE_POOL( type, len, tag ) \
UlDbgAllocatePool( \ (type), \ (len), \ (tag), \ __FILE__, \ __LINE__, \ NULL \ )
#define UL_FREE_POOL( ptr, tag ) \
UlDbgFreePool( \ (ptr), \ (tag), \ __FILE__, \ __LINE__, \ PagedPool, \ 0, \ NULL \ )
#define UL_ALLOCATE_POOL_WITH_QUOTA(type, len, tag, process) \
UlDbgAllocatePool( \ (type), \ (len), \ (tag), \ __FILE__, \ __LINE__, \ (process) \ )
#define UL_FREE_POOL_WITH_QUOTA( ptr, tag, type, len, process ) \
UlDbgFreePool( \ (ptr), \ (tag), \ __FILE__, \ __LINE__, \ (type), \ (len), \ (process) \ )
//
// Exception filter.
//
LONG UlDbgExceptionFilter( IN PEXCEPTION_POINTERS pExceptionPointers, IN PCSTR pFileName, IN USHORT LineNumber );
#define UL_EXCEPTION_FILTER() \
UlDbgExceptionFilter( \ GetExceptionInformation(), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ \ )
//
// Exception warning converter.
//
NTSTATUS UlDbgConvertExceptionCode( IN NTSTATUS status, IN PCSTR pFileName, IN USHORT LineNumber );
#define UL_CONVERT_EXCEPTION_CODE(status) \
(NT_WARNING(status) ? \ UlDbgConvertExceptionCode( \ (status), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ ) \ : \ (status))
//
// Invalid completion routine for catching incomplete IRP contexts.
//
VOID UlDbgInvalidCompletionRoutine( IN PVOID pCompletionContext, IN NTSTATUS Status, IN ULONG_PTR Information );
//
// Error handlers.
//
NTSTATUS UlDbgStatus( IN NTSTATUS Status, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgBreakOnError( PCSTR pFilename, ULONG LineNumber );
#if KERNEL_PRIV
#define RETURN(status) \
return UlDbgStatus( \ (status), \ (PCSTR) __FILE__, \ (USHORT) __LINE__ \ )
#define CHECK_STATUS(status) \
UlDbgStatus( \ (status), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ \ )
#endif // KERNEL_PRIV
//
// Random structure dumpers.
//
VOID UlDbgDumpRequestBuffer( IN struct _UL_REQUEST_BUFFER *pBuffer, IN PCSTR pName );
VOID UlDbgDumpHttpConnection( IN struct _UL_HTTP_CONNECTION *pConnection, IN PCSTR pName );
//
// IO wrappers.
//
PIRP UlDbgAllocateIrp( IN CCHAR StackSize, IN BOOLEAN ChargeQuota, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgFreeIrp( IN PIRP pIrp, IN PCSTR pFileName, IN USHORT LineNumber );
NTSTATUS UlDbgCallDriver( IN PDEVICE_OBJECT pDeviceObject, IN OUT PIRP pIrp, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgCompleteRequest( IN PIRP pIrp, IN CCHAR PriorityBoost, IN PCSTR pFileName, IN USHORT LineNumber );
#define UlAllocateIrp( stack, quota ) \
UlDbgAllocateIrp( \ (stack), \ (quota), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ \ )
#define UlFreeIrp( pirp ) \
UlDbgFreeIrp( \ (pirp), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ \ )
#define UlCallDriver( pdevice, pirp ) \
UlDbgCallDriver( \ (pdevice), \ (pirp), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ \ )
#define UlCompleteRequest( pirp, boost ) \
UlDbgCompleteRequest( \ (pirp), \ (boost), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ \ )
PMDL UlDbgAllocateMdl( IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN OUT PIRP Irp, IN PCSTR pFileName, IN USHORT LineNumber );
VOID UlDbgFreeMdl( IN PMDL Mdl, IN PCSTR pFileName, IN USHORT LineNumber );
#define UlAllocateMdl( add, len, second, quota, irp ) \
UlDbgAllocateMdl( \ (add), \ (len), \ (second), \ (quota), \ (irp), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ \ )
#define UlFreeMdl( mdl ) \
UlDbgFreeMdl( \ (mdl), \ (PCSTR)__FILE__, \ (USHORT)__LINE__ \ )
// #define SPECIAL_MDL_FLAG 0x8000
PCSTR UlDbgFindFilePart( IN PCSTR pPath );
//
// List Manipulation
//
#define UlRemoveEntryList(pEntry) \
do { \ ASSERT(NULL != (pEntry)); \ ASSERT(NULL != (pEntry)); \ ASSERT(NULL != (pEntry)->Flink); \ ASSERT(NULL != (pEntry)->Blink); \ RemoveEntryList(pEntry); \ (pEntry)->Flink = (pEntry)->Blink = NULL; \ } while (0, 0)
#define UlIoSetCancelRoutine UlDbgIoSetCancelRoutine
#else // !DBG -----------------------------------------------------------
//
// Disable all of the above.
//
#define UL_ENTER_DRIVER( function, pirp ) NOP_FUNCTION
#define UL_LEAVE_DRIVER( function ) NOP_FUNCTION
#define UL_ERESOURCE ERESOURCE
#define PUL_ERESOURCE PERESOURCE
#define UlInitializeResource( resource, name, param, tag ) \
ExInitializeResourceLite( (resource) )
#define UlDeleteResource( resource ) \
ExDeleteResourceLite( (resource) )
#define UlAcquireResourceExclusive( resource, wait ) \
do \ { \ KeEnterCriticalRegion(); \ ExAcquireResourceExclusiveLite( (resource), (wait) ); \ } while (0, 0)
#define UlAcquireResourceShared( resource, wait ) \
do \ { \ KeEnterCriticalRegion(); \ ExAcquireResourceSharedLite( (resource), (wait) ); \ } while (0, 0)
#define UlReleaseResource( resource ) \
do \ { \ ExReleaseResourceLite( (resource) ); \ KeLeaveCriticalRegion(); \ } while (0, 0)
#define UlConvertExclusiveToShared( resource ) \
ExConvertExclusiveToSharedLite( (resource) )
__inline BOOLEAN UlTryToAcquireResourceExclusive( IN PERESOURCE Resource ) { BOOLEAN fLocked; KeEnterCriticalRegion(); fLocked = ExAcquireResourceExclusiveLite( Resource, FALSE ); if (! fLocked ) KeLeaveCriticalRegion(); return fLocked; }
#define IS_RESOURCE_INITIALIZED( resource ) \
((resource)->SystemResourcesList.Flink != NULL)
#define UL_PUSH_LOCK EX_PUSH_LOCK
#define PUL_PUSH_LOCK PEX_PUSH_LOCK
#define UlInitializePushLock( pushlock, name, param, tag ) \
ExInitializePushLock( (pushlock) )
#define UlDeletePushLock( pushlock ) NOP_FUNCTION
#define UlAcquirePushLockExclusive( pushlock ) \
do \ { \ KeEnterCriticalRegion(); \ ExAcquirePushLockExclusive( (pushlock) ); \ } while (0, 0)
#define UlReleasePushLockExclusive( pushlock ) \
do \ { \ ExReleasePushLockExclusive( (pushlock) ); \ KeLeaveCriticalRegion(); \ } while (0, 0)
#define UlAcquirePushLockShared( pushlock ) \
do \ { \ KeEnterCriticalRegion(); \ ExAcquirePushLockShared( (pushlock) ); \ } while (0, 0)
#define UlReleasePushLockShared( pushlock ) \
do \ { \ ExReleasePushLockShared( (pushlock) ); \ KeLeaveCriticalRegion(); \ } while (0, 0)
#define UlReleasePushLock( pushlock ) \
do \ { \ ExReleasePushLock( (pushlock) ); \ KeLeaveCriticalRegion(); \ } while (0, 0)
#define UL_SPIN_LOCK KSPIN_LOCK
#define PUL_SPIN_LOCK PKSPIN_LOCK
#define KSPIN_LOCK_FROM_UL_SPIN_LOCK( pLock ) (pLock)
#define UlInitializeSpinLock( spinlock, name ) \
KeInitializeSpinLock( (spinlock) )
#define UlAcquireSpinLock( spinlock, oldirql ) \
KeAcquireSpinLock( (spinlock), (oldirql) )
#define UlReleaseSpinLock( spinlock, oldirql ) \
KeReleaseSpinLock( (spinlock), (oldirql) )
#define UlAcquireSpinLockAtDpcLevel( spinlock ) \
KeAcquireSpinLockAtDpcLevel( (spinlock) )
#define UlReleaseSpinLockFromDpcLevel( spinlock ) \
KeReleaseSpinLockFromDpcLevel( (spinlock) )
#define UlAcquireInStackQueuedSpinLock( spinlock, lockhandle ) \
KeAcquireInStackQueuedSpinLock( (spinlock), (lockhandle) )
#define UlReleaseInStackQueuedSpinLock( spinlock, lockhandle ) \
KeReleaseInStackQueuedSpinLock( (lockhandle) )
#define KeAcquireInStackQueueddSpinLockAtDpcLevel( spinlock, lockhandle ) \
KeAcquireInStackQueuedSpinLockAtDpcLevel( (spinlock), (lockhandle) )
#define UlReleaseInStackQueuedSpinLockFromDpcLevel( spinlock, lockhandle ) \
KeReleaseInStackQueuedSpinLockFromDpcLevel( (lockhandle) )
#define UlDbgPrettyPrintBuffer(pBuffer, BufferSize) NOP_FUNCTION
#define UL_ALLOCATE_POOL( type, len, tag ) \
ExAllocatePoolWithTagPriority( \ (type), \ (len), \ (tag), \ (LowPoolPriority) \ )
#define UL_FREE_POOL( ptr, tag ) \
MyFreePoolWithTag( \ (ptr), \ (tag) \ )
__inline PVOID UlAllocatePoolWithQuota( POOL_TYPE PoolType, SIZE_T Length, ULONG Tag, PEPROCESS pProcess ) { PVOID p;
if (PsChargeProcessPoolQuota( pProcess, PoolType, Length) == STATUS_SUCCESS) { if ((p = ExAllocatePoolWithTagPriority( PoolType, Length, Tag, LowPoolPriority)) != NULL) { return p; } PsReturnPoolQuota(pProcess, PoolType, Length); }
return NULL; }
#define UL_ALLOCATE_POOL_WITH_QUOTA(type, len, tag, process) \
UlAllocatePoolWithQuota( \ (type), \ (len), \ (tag), \ (process) \ )
#define UL_FREE_POOL_WITH_QUOTA( ptr, tag, type, len, process ) \
do \ { \ PsReturnPoolQuota( \ (process), \ (type), \ (len)); \ MyFreePoolWithTag( \ (ptr), \ (tag) \ ); \ } while (0, 0)
#define UL_EXCEPTION_FILTER() EXCEPTION_EXECUTE_HANDLER
#define UL_CONVERT_EXCEPTION_CODE(status) \
(NT_WARNING(status) ? UL_DEFAULT_ERROR_ON_EXCEPTION : (status))
#if KERNEL_PRIV
# define RETURN(status) return (status)
# define CHECK_STATUS(Status) NOP_FUNCTION
#endif
#define UlAllocateIrp( stack, quota ) \
IoAllocateIrp( (stack), (quota) )
#define UlFreeIrp( pirp ) \
IoFreeIrp( (pirp) )
#define UlCallDriver( pdevice, pirp ) \
IoCallDriver( (pdevice), (pirp) )
#define UlCompleteRequest( pirp, boost ) \
IoCompleteRequest( (pirp), (boost) )
#define UlAllocateMdl( add, len, second, quota, irp ) \
IoAllocateMdl( \ (add), \ (len), \ (second), \ (quota), \ (irp) \ )
#define UlFreeMdl( mdl ) \
IoFreeMdl( (mdl) )
#define UlRemoveEntryList(pEntry) \
RemoveEntryList(pEntry)
#define UlIoSetCancelRoutine \
IoSetCancelRoutine
#endif // DBG
// Allocation wrapper helpers
#define UL_ALLOCATE_STRUCT_WITH_SPACE(pt,ot,cb,t) \
(ot *)(UL_ALLOCATE_POOL(pt,ALIGN_UP(sizeof(ot),PVOID)+(cb),t))
#define UL_ALLOCATE_STRUCT(pt,ot,t) \
(ot *)(UL_ALLOCATE_POOL(pt,sizeof(ot),t))
#define UL_ALLOCATE_ARRAY(pt,et,c,t) \
(et *)(UL_ALLOCATE_POOL(pt,sizeof(et)*(c),t))
#define UL_FREE_POOL_WITH_SIG(p,sig) \
do { \ PREFAST_ASSUME(NULL != (p), "Callers check this"); \ (p)->Signature = MAKE_FREE_SIGNATURE(sig); \ UL_FREE_POOL(p,sig); \ (p) = NULL; \ } while (0)
#define HAS_VALID_SIGNATURE(p, sig) \
( (NULL != (p)) && ((sig) == (p)->Signature) )
#endif // _DEBUG_H_
|