windows-nt/Source/XPSP1/NT/inetsrv/iis/iisrearc/ulrtl/misc.h
2020-09-26 16:20:57 +08:00

253 lines
7.6 KiB
C

/*++
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
misc.h
Abstract:
This module contains miscellaneous constants & declarations.
Author:
Keith Moore (keithmo) 10-Jun-1998
Henry Sanders (henrysa) 17-Jun-1998 Merge with old httputil.h
Paul McDaniel (paulmcd) 30-Mar-1999 added refcounted eresource
Revision History:
--*/
#ifndef _MISC_H_
#define _MISC_H_
extern ULONG HttpChars[256];
#define HTTP_CHAR 0x001
#define HTTP_UPCASE 0x002
#define HTTP_LOCASE 0x004
#define HTTP_ALPHA (HTTP_UPCASE | HTTP_LOCASE)
#define HTTP_DIGIT 0x008
#define HTTP_CTL 0x010
#define HTTP_LWS 0x020
#define HTTP_HEX 0x040
#define HTTP_SEPERATOR 0x080
#define HTTP_TOKEN 0x100
#define URL_LEGAL 0x200
#define URL_TOKEN (HTTP_ALPHA | HTTP_DIGIT | URL_LEGAL)
#define IS_HTTP_UPCASE(c) (HttpChars[(UCHAR)(c)] & HTTP_UPCASE)
#define IS_HTTP_LOCASE(c) (HttpChars[(UCHAR)(c)] & HTTP_UPCASE)
#define IS_HTTP_ALPHA(c) (HttpChars[(UCHAR)(c)] & HTTP_ALPHA)
#define IS_HTTP_DIGIT(c) (HttpChars[(UCHAR)(c)] & HTTP_DIGIT)
#define IS_HTTP_HEX(c) (HttpChars[(UCHAR)(c)] & HTTP_HEX)
#define IS_HTTP_CTL(c) (HttpChars[(UCHAR)(c)] & HTTP_CTL)
#define IS_HTTP_LWS(c) (HttpChars[(UCHAR)(c)] & HTTP_LWS)
#define IS_HTTP_SEPERATOR(c) (HttpChars[(UCHAR)(c)] & HTTP_SEPERATOR)
#define IS_HTTP_TOKEN(c) (HttpChars[(UCHAR)(c)] & HTTP_TOKEN)
#define IS_URL_TOKEN(c) (HttpChars[(UCHAR)(c)] & URL_TOKEN)
NTSTATUS
InitializeHttpUtil(
VOID
);
//
// Our presumed cache-line size.
//
#define CACHE_LINE_SIZE 32
//
// Alignment macros.
//
#define ROUND_UP( val, pow2 ) \
( ( (ULONG_PTR)(val) + (pow2) - 1 ) & ~( (pow2) - 1 ) )
//
// Calculate the dimension of an array.
//
#define DIMENSION(x) ( sizeof(x) / sizeof(x[0]) )
//
// nice MIN/MAX macros
//
#define MIN(a,b) ( ((a) > (b)) ? (b) : (a) )
#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
//
// Macros for swapping the bytes in a long and a short.
//
#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || ((defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
#define SWAP_LONG(l) _byteswap_ulong((unsigned long)l)
#define SWAP_SHORT(s) _byteswap_ushort((unsigned short)s)
#else
#define SWAP_LONG(l) \
( ( ((l) >> 24) & 0x000000FFL ) | \
( ((l) >> 8) & 0x0000FF00L ) | \
( ((l) << 8) & 0x00FF0000L ) | \
( ((l) << 24) & 0xFF000000L ) )
#define SWAP_SHORT(s) \
( ( ((s) >> 8) & 0x00FF ) | \
( ((s) << 8) & 0xFF00 ) )
#endif
//
// Context values stored in PFILE_OBJECT->FsContext2 to identify a handle
// as either a control channel or an app pool.
//
#define UL_CONTROL_CHANNEL_CONTEXT ((PVOID)'LRTC')
#define UL_CONTROL_CHANNEL_CONTEXT_X ((PVOID)'rtcX')
#define UL_APP_POOL_CONTEXT ((PVOID)'PPPA')
#define UL_APP_POOL_CONTEXT_X ((PVOID)'ppaX')
#define IS_CONTROL_CHANNEL( pFileObject ) \
( (pFileObject)->FsContext2 == UL_CONTROL_CHANNEL_CONTEXT )
#define MARK_VALID_CONTROL_CHANNEL( pFileObject ) \
( (pFileObject)->FsContext2 = UL_CONTROL_CHANNEL_CONTEXT )
#define MARK_INVALID_CONTROL_CHANNEL( pFileObject ) \
( (pFileObject)->FsContext2 = UL_CONTROL_CHANNEL_CONTEXT_X )
#define GET_CONTROL_CHANNEL( pFileObject ) \
((PUL_CONTROL_CHANNEL)((pFileObject)->FsContext))
#define GET_PP_CONTROL_CHANNEL( pFileObject ) \
((PUL_CONTROL_CHANNEL *)&((pFileObject)->FsContext))
#define IS_APP_POOL( pFileObject ) \
( (pFileObject)->FsContext2 == UL_APP_POOL_CONTEXT )
#define IS_EX_APP_POOL( pFileObject ) \
( (pFileObject)->FsContext2 == UL_APP_POOL_CONTEXT_X )
#define MARK_VALID_APP_POOL( pFileObject ) \
( (pFileObject)->FsContext2 = UL_APP_POOL_CONTEXT )
#define MARK_INVALID_APP_POOL( pFileObject ) \
( (pFileObject)->FsContext2 = UL_APP_POOL_CONTEXT_X )
#define GET_APP_POOL_PROCESS( pFileObject ) \
((PUL_APP_POOL_PROCESS)((pFileObject)->FsContext))
#define GET_PP_APP_POOL_PROCESS( pFileObject ) \
((PUL_APP_POOL_PROCESS *)&((pFileObject)->FsContext))
#define IS_VALID_UL_NONPAGED_RESOURCE(pResource) \
(((pResource) != NULL) && \
((pResource)->Signature == UL_NONPAGED_RESOURCE_SIGNATURE) && \
((pResource)->RefCount > 0))
typedef struct _UL_NONPAGED_RESOURCE
{
//
// NonPagedPool
//
SINGLE_LIST_ENTRY LookasideEntry; // must be first, links
// into the lookaside list
ULONG Signature; // UL_NONPAGED_RESOURCE_SIGNATURE
LONG RefCount; // the reference count
UL_ERESOURCE Resource; // the actual resource
} UL_NONPAGED_RESOURCE, * PUL_NONPAGED_RESOURCE;
#define UL_NONPAGED_RESOURCE_SIGNATURE ((ULONG)'RNLU')
#define UL_NONPAGED_RESOURCE_SIGNATURE_X MAKE_FREE_SIGNATURE(UL_NONPAGED_RESOURCE_SIGNATURE)
PUL_NONPAGED_RESOURCE
UlResourceNew(
);
VOID
UlReferenceResource(
PUL_NONPAGED_RESOURCE pResource
REFERENCE_DEBUG_FORMAL_PARAMS
);
VOID
UlDereferenceResource(
PUL_NONPAGED_RESOURCE pResource
REFERENCE_DEBUG_FORMAL_PARAMS
);
#define REFERENCE_RESOURCE( pres ) \
UlReferenceResource( \
(pres) \
REFERENCE_DEBUG_ACTUAL_PARAMS \
)
#define DEREFERENCE_RESOURCE( pres ) \
UlDereferenceResource( \
(pres) \
REFERENCE_DEBUG_ACTUAL_PARAMS \
)
PVOID
UlResourceAllocatePool(
IN POOL_TYPE PoolType,
IN SIZE_T ByteLength,
IN ULONG Tag
);
VOID
UlResourceFreePool(
IN PVOID pBuffer
);
//
// Miscellaneous validators.
//
#define IS_VALID_DEVICE_OBJECT( pDeviceObject ) \
( ((pDeviceObject) != NULL) && \
((pDeviceObject)->Type == IO_TYPE_DEVICE) && \
((pDeviceObject)->Size == sizeof(DEVICE_OBJECT)) )
#define IS_VALID_FILE_OBJECT( pFileObject ) \
( ((pFileObject) != NULL) && \
((pFileObject)->Type == IO_TYPE_FILE) && \
((pFileObject)->Size == sizeof(FILE_OBJECT)) )
#define IS_VALID_IRP( pIrp ) \
( ((pIrp) != NULL) && \
((pIrp)->Type == IO_TYPE_IRP) && \
((pIrp)->Size == IoSizeOfIrp((pIrp)->StackCount)) )
NTSTATUS
TimeFieldsToHttpDate(
IN PTIME_FIELDS pTime,
OUT PWSTR pBuffer,
IN ULONG BufferLength
);
#endif // _MISC_H_