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.
 
 
 
 
 
 

1210 lines
41 KiB

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