/*
* Copyright (c) Likewise Software. All rights Reserved.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the license, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details. You should have received a copy
* of the GNU Lesser General Public License along with this program. If
* not, see .
*
* LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING
* TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT
* WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE
* TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU
* LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU
* HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING
* TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT
* license@likewisesoftware.com
*/
/*
* Module Name:
*
* types.h
*
* Abstract:
*
* Common type and constant definitions
*
* Authors: Brian Koropoff (bkoropoff@likewise.com)
* Danilo Almeida (dalmeida@likewise.com)
*
*/
#ifndef __LWBASE_TYPES_H__
#define __LWBASE_TYPES_H__
//
// Define base sized integer types based on whether doing DCE IDL.
// The fundamental issue is that this file can be included in IDL
// files but it cannot include system headers in that case.
// So for IDL purposes, some type definitions are skipped.
// In particular, the following are skipped:
//
// TODO-Get rid of LW_(P)(U)INT types.
// - LW_(P)(U)INT since it is based on "int", which is not
// considered to be of any particular size by DCE IDL.
//
// - LW_(P)HANDLE/LW_PHANDLE due to [context_handle] attribute issues.
//
// - LW_(P)(S)SIZE_T and LW_(P)(U)LONG_PTR types since they are based on
// variable length integer types that cannot be represented in DCE IDL.
//
// Note that int_t types cannot be used in unprotected typedefs
// because otherwise the resulting DCE RPC stubs will have conflicts
// with system headers. Therefore, the LW_INT types are
// used instead with different definitions depending on whether
// this is a DCE IDL compiler pass.
//
#ifdef _DCE_IDL_
cpp_quote("#include ")
cpp_quote("#if 0")
#endif
#ifndef _DCE_IDL_
#include
#include
#include
#include
#define _LW_IDL_STRING
typedef uint8_t LW_UINT8, *LW_PUINT8;
typedef uint16_t LW_UINT16, *LW_PUINT16;
typedef uint32_t LW_UINT32, *LW_PUINT32;
typedef uint64_t LW_UINT64, *LW_PUINT64;
typedef int8_t LW_INT8, *LW_PINT8;
typedef int16_t LW_INT16, *LW_PINT16;
typedef int32_t LW_INT32, *LW_PINT32;
typedef int64_t LW_INT64, *LW_PINT64;
#else
#define _LW_IDL_STRING [string]
typedef unsigned short int wchar16_t;
typedef unsigned small int LW_UINT8, *LW_PUINT8;
typedef unsigned short int LW_UINT16, *LW_PUINT16;
typedef unsigned long int LW_UINT32, *LW_PUINT32;
typedef unsigned hyper int LW_UINT64, *LW_PUINT64;
typedef small int LW_INT8, *LW_PINT8;
typedef short int LW_INT16, *LW_PINT16;
typedef long int LW_INT32, *LW_PINT32;
typedef hyper int LW_INT64, *LW_PINT64;
#define const
#endif
typedef void LW_VOID, *LW_PVOID;
typedef void const *LW_PCVOID;
typedef LW_UINT8 LW_BOOLEAN, *LW_PBOOLEAN;
typedef LW_UINT8 LW_BYTE, *LW_PBYTE;
typedef char LW_CHAR, *LW_PCHAR;
// DCE IDL does not allow a char type to be used in size_is attribute.
#ifndef _DCE_IDL_
typedef unsigned char LW_UCHAR, *LW_PUCHAR;
#else
typedef LW_UINT8 LW_UCHAR, *LW_PUCHAR;
#endif
typedef wchar16_t LW_WCHAR, *LW_PWCHAR;
typedef LW_INT16 LW_SHORT, *LW_PSHORT;
typedef LW_UINT16 LW_USHORT, *LW_PUSHORT;
typedef LW_INT32 LW_LONG, *LW_PLONG;
typedef LW_UINT32 LW_ULONG, *LW_PULONG;
typedef LW_INT64 LW_LONG64, *LW_PLONG64;
typedef LW_UINT64 LW_ULONG64, *LW_PULONG64;
#ifndef _DCE_IDL_
typedef int LW_INT, *LW_PINT;
typedef unsigned int LW_UINT, *LW_PUINT;
typedef void *LW_HANDLE, **LW_PHANDLE;
typedef size_t LW_SIZE_T, *LW_PSIZE_T;
typedef ssize_t LW_SSIZE_T, *LW_PSSIZE_T;
typedef size_t LW_ULONG_PTR, *LW_PULONG_PTR;
typedef ssize_t LW_LONG_PTR, *LW_PLONG_PTR;
#endif
typedef _LW_IDL_STRING char *LW_PSTR;
typedef _LW_IDL_STRING char const *LW_PCSTR;
typedef _LW_IDL_STRING wchar16_t *LW_PWSTR;
typedef _LW_IDL_STRING wchar16_t const *LW_PCWSTR;
typedef LW_UINT32 LW_BOOL, *LW_PBOOL;
typedef LW_UINT16 LW_WORD, *LW_PWORD;
typedef LW_UINT32 LW_DWORD, *LW_PDWORD;
typedef LW_DWORD LW_WINERROR, *LW_PWINERROR;
typedef LW_LONG LW_NTSTATUS, *LW_PNTSTATUS;
#ifdef UNICODE
typedef LW_WCHAR LW_TCHAR;
#else
typedef LW_CHAR LW_TCHAR;
#endif
#define LW_TRUE 1
#define LW_FALSE 0
// ISSUE-On Windows, this is ((HANDLE)-1). Should not define this here
// as it is an artifact of a few Win32 APIs (such as CreateFile).
#define LW_INVALID_HANDLE_VALUE 0
#define LW_MAXUCHAR ((LW_UCHAR) -1)
#define LW_MAXCHAR ((LW_CHAR) (LW_MAXUCHAR >> 1))
#define LW_MINCHAR ((LW_CHAR) ~LW_MAXCHAR)
#define LW_MAXUSHORT ((LW_USHORT) -1)
#define LW_MAXSHORT ((LW_SHORT) (LW_MAXUSHORT >> 1))
#define LW_MINSHORT ((LW_SHORT) ~LW_MAXSHORT)
#define LW_MAXULONG ((LW_ULONG) -1)
#define LW_MAXLONG ((LW_LONG) (LW_MAXULONG >> 1))
#define LW_MINLONG ((LW_LONG) ~LW_MAXLONG)
#define LW_MAXULONG64 ((LW_ULONG64) -1)
#define LW_MAXLONG64 ((LW_LONG64) (LW_MAXULONG64 >> 1))
#define LW_MINLONG64 ((LW_LONG64) ~LW_MAXLONG64)
#define LW_MAXSIZE_T ((LW_SIZE_T) -1)
#define LW_MAXSSIZE_T ((LW_SSIZE_T) (LW_MAXSIZE_T >> 1))
#define LW_MINSSIZE_T ((LW_SSIZE_T) ~LW_MAXSSIZE_T)
#define LW_MAXULONG_PTR ((LW_ULONG_PTR) -1)
#define LW_MAXLONG_PTR ((LW_LONG_PTR) (LW_MAXULONG_PTR >> 1))
#define LW_MINLONG_PTR ((LW_SSIZE_T) ~LW_MAXLONG_PTR)
#define LW_MAXBYTE ((LW_BYTE) -1)
#define LW_MAXWORD ((LW_WORD) -1)
#define LW_MAXDWORD ((LW_DWORD) -1)
#define LW_OUT_PPVOID(_expr_) ((LW_PVOID*) (LW_PVOID) (_expr_))
#define LW_MIN(a, b) (((a) < (b)) ? (a) : (b))
#define LW_MAX(a, b) (((a) > (b)) ? (a) : (b))
#define LwSetFlag(Variable, Flags) ((Variable) |= (Flags))
#define LwClearFlag(Variable, Flags) ((Variable) &= ~(Flags))
#define LwIsSetFlag(Variable, Flags) (((Variable) & (Flags)) != 0)
#define LW_IS_BOTH_OR_NEITHER(Condition1, Condition2) \
!(!!(Condition1) ^ !!(Condition2))
#define LW_IS_VALID_FLAGS(Flags, Mask) \
(((Flags) & ~(Mask)) == 0)
#define LwRtlPointerToOffset(BasePointer, Pointer) \
((int)((char*)(Pointer) - (char*)(BasePointer)))
#define LwRtlOffsetToPointer(Pointer, Offset) \
((char*)(Pointer) + Offset)
// TODO-Remove these deprecated macro names
#define LW_PTR_OFFSET(BasePointer, Pointer) LwRtlPointerToOffset(BasePointer, Pointer)
#define LW_PTR_ADD(Pointer, Offset) LwRtlOffsetToPointer(Pointer, Offset)
#define LW_FIELD_OFFSET(Type, Field) \
((size_t)(&(((Type*)(0))->Field)))
#define LW_FIELD_SIZE(Type, Field) \
(sizeof(((Type*)(0))->Field))
#define LW_STRUCT_FROM_FIELD(Pointer, Type, Field) \
((Type*)LwRtlOffsetToPointer(Pointer, -((ssize_t)LW_FIELD_OFFSET(Type, Field))))
#define LW_ARRAY_SIZE(StaticArray) \
(sizeof(StaticArray)/sizeof((StaticArray)[0]))
#ifndef LW_STRICT_NAMESPACE
typedef LW_UINT8 UINT8;
typedef LW_PUINT8 PUINT8;
typedef LW_UINT16 UINT16;
typedef LW_PUINT16 PUINT16;
typedef LW_UINT32 UINT32;
typedef LW_PUINT32 PUINT32;
typedef LW_UINT64 UINT64;
typedef LW_PUINT64 PUINT64;
typedef LW_INT8 INT8;
typedef LW_PINT8 PINT8;
typedef LW_INT16 INT16;
typedef LW_PINT16 PINT16;
typedef LW_INT32 INT32;
typedef LW_PINT32 PINT32;
typedef LW_INT64 INT64;
typedef LW_PINT64 PINT64;
typedef LW_VOID VOID;
typedef LW_PVOID PVOID;
typedef LW_PCVOID PCVOID;
typedef LW_BOOLEAN BOOLEAN;
typedef LW_PBOOLEAN PBOOLEAN;
typedef LW_BYTE BYTE;
typedef LW_PBYTE PBYTE;
typedef LW_CHAR CHAR;
typedef LW_WCHAR WCHAR;
typedef LW_PCHAR PCHAR;
typedef LW_PWCHAR PWCHAR;
typedef LW_UCHAR UCHAR;
typedef LW_PUCHAR PUCHAR;
typedef LW_SHORT SHORT;
typedef LW_PSHORT PSHORT;
typedef LW_USHORT USHORT;
typedef LW_PUSHORT PUSHORT;
typedef LW_LONG LONG;
typedef LW_PLONG PLONG;
typedef LW_ULONG ULONG;
typedef LW_PULONG PULONG;
typedef LW_LONG64 LONG64;
typedef LW_PLONG64 PLONG64;
typedef LW_ULONG64 ULONG64;
typedef LW_PULONG64 PULONG64;
#ifndef _DCE_IDL_
typedef LW_INT INT;
typedef LW_PINT PINT;
typedef LW_UINT UINT;
typedef LW_PUINT PUINT;
typedef LW_HANDLE HANDLE;
typedef LW_PHANDLE PHANDLE;
typedef LW_SIZE_T SIZE_T;
typedef LW_PSIZE_T PSIZE_T;
typedef LW_SSIZE_T SSIZE_T;
typedef LW_PSSIZE_T PSSIZE_T;
typedef LW_ULONG_PTR ULONG_PTR;
typedef LW_PULONG_PTR PULONG_PTR;
typedef LW_LONG_PTR LONG_PTR;
typedef LW_PLONG_PTR PLONG_PTR;
#endif
typedef LW_PSTR PSTR;
typedef LW_PCSTR PCSTR;
typedef LW_PWSTR PWSTR;
typedef LW_PCWSTR PCWSTR;
typedef LW_BOOL BOOL;
typedef LW_PBOOL PBOOL;
typedef LW_WORD WORD;
typedef LW_PWORD PWORD;
typedef LW_DWORD DWORD;
typedef LW_PDWORD PDWORD;
typedef LW_WINERROR WINERROR;
typedef LW_PWINERROR PWINERROR;
typedef LW_NTSTATUS NTSTATUS;
typedef LW_PNTSTATUS PNTSTATUS;
typedef LW_TCHAR TCHAR;
#ifndef TRUE
#define TRUE LW_TRUE
#endif
#ifndef FALSE
#define FALSE LW_FALSE
#endif
#define INVALID_HANDLE_VALUE LW_INVALID_HANDLE_VALUE
#define MAXUCHAR LW_MAXUCHAR
#define MAXCHAR LW_MAXCHAR
#define MINCHAR LW_MINCHAR
#define MAXUSHORT LW_MAXUSHORT
#define MAXSHORT LW_MAXSHORT
#define MINSHORT LW_MINSHORT
#define MAXULONG LW_MAXULONG
#define MAXLONG LW_MAXLONG
#define MINLONG LW_MINLONG
#define MAXULONG64 LW_MAXULONG64
#define MAXLONG64 LW_MAXLONG64
#define MINLONG64 LW_MINLONG64
#define MAXSIZE_T LW_MAXSIZE_T
#define MAXSSIZE_T LW_MAXSSIZE_T
#define MINSSIZE_T LW_MINSSIZE_T
#define MAXULONG_PTR LW_MAXULONG_PTR
#define MAXLONG_PTR LW_MAXLONG_PTR
#define MINLONG_PTR LW_MINLONG_PTR
#define MAXBYTE LW_MAXBYTE
#define MAXWORD LW_MAXWORD
#define MAXDWORD LW_MAXDWORD
#define BYTE_MAX MAXBYTE
#define WORD_MAX MAXWORD
#define DWORD_MAX MAXDWORD
#define OUT_PPVOID LW_OUT_PPVOID
#define SetFlag(Variable, Flags) LwSetFlag(Variable, Flags)
#define ClearFlag(Variable, Flags) LwClearFlag(Variable, Flags)
#define IsSetFlag(Variable, Flags) LwIsSetFlag(Variable, Flags)
#define IS_BOTH_OR_NEITHER(Condition1, Condition2) LW_IS_BOTH_OR_NEITHER(Condition1, Condition2)
#endif /* LW_STRICT_NAMESPACE */
typedef struct _LW_UNICODE_STRING {
LW_USHORT Length;
LW_USHORT MaximumLength;
#ifdef _DCE_IDL_
[size_is(MaximumLength/2),length_is(Length/2)]
#endif
LW_PWCHAR Buffer;
} LW_UNICODE_STRING, *LW_PUNICODE_STRING;
// Need to do division and multiplication to round down.
#define LW_UNICODE_STRING_MAX_CHARS (LW_MAXUSHORT / 2)
#define LW_UNICODE_STRING_MAX_BYTES (LW_UNICODE_STRING_MAX_CHARS * 2)
typedef struct _LW_ANSI_STRING {
LW_USHORT Length;
LW_USHORT MaximumLength;
#ifdef _DCE_IDL_
[size_is(MaximumLength),length_is(Length)]
#endif
LW_PCHAR Buffer;
} LW_ANSI_STRING, *LW_PANSI_STRING;
// TODO-Perhaps make these shorter to match LW_UNICODE_STRING_MAX_CHARS.
#define LW_ANSI_STRING_MAX_CHARS LW_MAXUSHORT
#define LW_ANSI_STRING_MAX_BYTES LW_MAXUSHORT
// Works on any character size strings/cstrings:
#define LW_RTL_STRING_IS_NULL_OR_EMPTY(String) (!(String) || !((String)->Length))
#define LwRtlCStringIsNullOrEmpty(String) (!(String) || !(*(String)))
#define LW_RTL_CONSTANT_STRING(StringLiteral) \
{ \
sizeof(StringLiteral) - sizeof((StringLiteral)[0]), \
sizeof(StringLiteral), \
(StringLiteral) \
}
#define LW_RTL_STRING_NUM_CHARS(String) \
( (String)->Length / sizeof((String)->Buffer[0]) )
#define LW_RTL_STRING_LAST_CHAR(String) \
( (String)->Buffer[LW_RTL_STRING_NUM_CHARS(String) - 1] )
#define LW_RTL_STRING_IS_NULL_TERMINATED(String) \
((String) && \
(String)->Buffer && \
((String)->MaximumLength > (String)->Length) && \
!(String)->Buffer[LW_RTL_STRING_NUM_CHARS(String)])
// This works for CHAR and WCHAR since WCHAR is native byte order.
#define LwRtlIsDecimalDigit(Character) \
( ((Character) >= '0') && ((Character) <= '9') )
// This works for CHAR and WCHAR since WCHAR is native byte order.
#define LwRtlDecimalDigitValue(Character) \
((Character) - '0')
#ifndef LW_STRICT_NAMESPACE
typedef LW_UNICODE_STRING UNICODE_STRING;
typedef LW_PUNICODE_STRING PUNICODE_STRING;
#define UNICODE_STRING_MAX_CHARS LW_UNICODE_STRING_MAX_CHARS
#define UNICODE_STRING_MAX_BYTES LW_UNICODE_STRING_MAX_BYTES
typedef LW_ANSI_STRING ANSI_STRING;
typedef LW_PANSI_STRING PANSI_STRING;
#define ANSI_STRING_MAX_CHARS LW_ANSI_STRING_MAX_CHARS
#define ANSI_STRING_MAX_BYTES LW_ANSI_STRING_MAX_BYTES
#define RTL_STRING_IS_NULL_OR_EMPTY(String) LW_RTL_STRING_IS_NULL_OR_EMPTY(String)
#define RtlCStringIsNullOrEmpty(String) LwRtlCStringIsNullOrEmpty(String)
#define RTL_CONSTANT_STRING(StringLiteral) LW_RTL_CONSTANT_STRING(StringLiteral)
#define RTL_STRING_NUM_CHARS(String) LW_RTL_STRING_NUM_CHARS(String)
#define RTL_STRING_LAST_CHAR(String) LW_RTL_STRING_LAST_CHAR(String)
#define RTL_STRING_IS_NULL_TERMINATED(String) LW_RTL_STRING_IS_NULL_TERMINATED(String)
#define RtlIsDecimalDigit(Character) LwRtlIsDecimalDigit(Character)
#define RtlDecimalDigitValue(Character) LwRtlDecimalDigitValue(Character)
#endif /* LW_STRICT_NAMESPACE */
#ifdef _DCE_IDL_
cpp_quote("#endif")
#endif
#endif