mirror of https://github.com/tongzx/nt5src
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.
264 lines
8.1 KiB
264 lines
8.1 KiB
/*
|
|
* stock.h - Stock header file.
|
|
*/
|
|
|
|
|
|
/* Constants
|
|
************/
|
|
|
|
#define FOREVER for (;;)
|
|
|
|
#define INVALID_SEEK_POSITION (0xffffffff)
|
|
|
|
#define EMPTY_STRING ""
|
|
|
|
#ifdef DEBUG
|
|
#define NULL_STRING "(null)"
|
|
#endif
|
|
|
|
#define SLASH_SLASH "\\\\"
|
|
|
|
#define ASTERISK '*'
|
|
#define BACKSLASH '/'
|
|
#define COLON ':'
|
|
#define COMMA ','
|
|
#define EQUAL '='
|
|
#define PERIOD '.'
|
|
#define POUND '#'
|
|
#define QMARK '?'
|
|
#define QUOTE '\''
|
|
#define QUOTES '"'
|
|
#define SLASH '\\'
|
|
#define SPACE ' '
|
|
#define TAB '\t'
|
|
|
|
/* linkage */
|
|
|
|
/* #pragma data_seg() doesn't work for variables defined extern. */
|
|
#define PUBLIC_CODE
|
|
#define PUBLIC_DATA
|
|
/* Make private functions and data public for profiling and debugging. */
|
|
#define PRIVATE_CODE PUBLIC_CODE
|
|
#define PRIVATE_DATA PUBLIC_DATA
|
|
#ifdef __cplusplus
|
|
#define INLINE inline
|
|
#else
|
|
#define INLINE __inline
|
|
#endif
|
|
|
|
/* limits */
|
|
|
|
#define WORD_MAX USHRT_MAX
|
|
#define DWORD_MAX ULONG_MAX
|
|
|
|
/* file system constants */
|
|
|
|
#define MAX_BUF 260
|
|
#define MAX_PATH_LEN MAX_PATH
|
|
#define MAX_NAME_LEN MAX_PATH
|
|
#define MAX_FOLDER_DEPTH (MAX_PATH / 2)
|
|
#define DRIVE_ROOT_PATH_LEN (4)
|
|
|
|
/* ui constants */
|
|
|
|
#define MAX_MSG_LEN MAX_PATH_LEN
|
|
|
|
/* invalid thread ID */
|
|
|
|
#define INVALID_THREAD_ID (0xffffffff)
|
|
|
|
/* no context-sensitive help available */
|
|
|
|
#define NO_HELP ((DWORD)-1)
|
|
|
|
/* Win32 HRESULTs */
|
|
|
|
#define E_FILE_NOT_FOUND MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
|
|
#define E_PATH_NOT_FOUND MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32, ERROR_PATH_NOT_FOUND)
|
|
|
|
/* file-related flag combinations */
|
|
|
|
#define ALL_FILE_ACCESS_FLAGS (GENERIC_READ |\
|
|
GENERIC_WRITE)
|
|
|
|
#define ALL_FILE_SHARING_FLAGS (FILE_SHARE_READ |\
|
|
FILE_SHARE_WRITE)
|
|
|
|
#define ALL_FILE_ATTRIBUTES (FILE_ATTRIBUTE_READONLY |\
|
|
FILE_ATTRIBUTE_HIDDEN |\
|
|
FILE_ATTRIBUTE_SYSTEM |\
|
|
FILE_ATTRIBUTE_DIRECTORY |\
|
|
FILE_ATTRIBUTE_ARCHIVE |\
|
|
FILE_ATTRIBUTE_NORMAL |\
|
|
FILE_ATTRIBUTE_TEMPORARY |\
|
|
FILE_ATTRIBUTE_ATOMIC_WRITE |\
|
|
FILE_ATTRIBUTE_XACTION_WRITE)
|
|
|
|
#define ALL_FILE_FLAGS (FILE_FLAG_WRITE_THROUGH |\
|
|
FILE_FLAG_OVERLAPPED |\
|
|
FILE_FLAG_NO_BUFFERING |\
|
|
FILE_FLAG_RANDOM_ACCESS |\
|
|
FILE_FLAG_SEQUENTIAL_SCAN |\
|
|
FILE_FLAG_DELETE_ON_CLOSE |\
|
|
FILE_FLAG_BACKUP_SEMANTICS |\
|
|
FILE_FLAG_POSIX_SEMANTICS)
|
|
|
|
#define ALL_FILE_ATTRIBUTES_AND_FLAGS (ALL_FILE_ATTRIBUTES |\
|
|
ALL_FILE_FLAGS)
|
|
|
|
|
|
/* Macros
|
|
*********/
|
|
|
|
#ifndef DECLARE_STANDARD_TYPES
|
|
|
|
/*
|
|
* For a type "FOO", define the standard derived types PFOO, CFOO, and PCFOO.
|
|
*/
|
|
|
|
#define DECLARE_STANDARD_TYPES(type) typedef type *P##type; \
|
|
typedef const type C##type; \
|
|
typedef const type *PC##type;
|
|
|
|
#endif
|
|
|
|
/*
|
|
* For a type "FOO", define the standard derived UNALIGNED types PFOO, CFOO, and PCFOO.
|
|
* WINNT: RISC boxes care about ALIGNED, intel does not.
|
|
*/
|
|
|
|
#define DECLARE_STANDARD_TYPES_U(type) typedef UNALIGNED type *P##type; \
|
|
typedef UNALIGNED const type C##type; \
|
|
typedef UNALIGNED const type *PC##type;
|
|
|
|
|
|
/* character manipulation */
|
|
|
|
#define IS_SLASH(ch) ((ch) == SLASH || (ch) == BACKSLASH)
|
|
|
|
#ifdef InRange
|
|
#undef InRange
|
|
#endif
|
|
#define InRange(id, idFirst, idLast) ((UINT)(id-idFirst) <= (UINT)(idLast-idFirst))
|
|
|
|
/* bit flag manipulation */
|
|
|
|
#define SET_FLAG(dwAllFlags, dwFlag) ((dwAllFlags) |= (dwFlag))
|
|
#define CLEAR_FLAG(dwAllFlags, dwFlag) ((dwAllFlags) &= (~dwFlag))
|
|
|
|
#define IS_FLAG_SET(dwAllFlags, dwFlag) ((BOOL)((dwAllFlags) & (dwFlag)))
|
|
#define IS_FLAG_CLEAR(dwAllFlags, dwFlag) (! (IS_FLAG_SET(dwAllFlags, dwFlag)))
|
|
|
|
#define SetFlag SET_FLAG
|
|
#define ClearFlag CLEAR_FLAG
|
|
#define IsFlagSet IS_FLAG_SET
|
|
#define IsFlagClear IS_FLAG_CLEAR
|
|
|
|
/* array element count */
|
|
|
|
#define ARRAY_ELEMENTS(rg) (sizeof(rg) / sizeof((rg)[0]))
|
|
#ifdef SIZECHARS
|
|
#undef SIZECHARS
|
|
#endif
|
|
#define SIZECHARS(rg) ARRAY_ELEMENTS(rg)
|
|
|
|
/* string safety */
|
|
|
|
#define CHECK_STRING(psz) ((psz) ? (psz) : NULL_STRING)
|
|
|
|
/* file attribute manipulation */
|
|
|
|
#define IS_ATTR_DIR(attr) (IS_FLAG_SET((attr), FILE_ATTRIBUTE_DIRECTORY))
|
|
#define IS_ATTR_VOLUME(attr) (IS_FLAG_SET((attr), FILE_ATTRIBUTE_VOLUME))
|
|
|
|
/* stuff a point value packed in an LPARAM into a POINT */
|
|
|
|
#define LPARAM_TO_POINT(lparam, pt) ((pt).x = (short)LOWORD(lparam), \
|
|
(pt).y = (short)HIWORD(lparam))
|
|
|
|
/* use the Win32 API string equivalents */
|
|
|
|
#define lstrnicmp(sz1, sz2, cch) (CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, sz1, cch, sz2, cch) - 2)
|
|
#define lstrncmp(sz1, sz2, cch) (CompareString(LOCALE_USER_DEFAULT, 0, sz1, cch, sz2, cch) - 2)
|
|
|
|
// Count of characters to count of bytes
|
|
//
|
|
#define CbFromCchW(cch) ((cch)*sizeof(WCHAR))
|
|
#define CbFromCchA(cch) ((cch)*sizeof(CHAR))
|
|
#ifdef UNICODE
|
|
#define CbFromCch CbFromCchW
|
|
#else // UNICODE
|
|
#define CbFromCch CbFromCchA
|
|
#endif // UNICODE
|
|
|
|
|
|
//
|
|
// SAFECAST(obj, type)
|
|
//
|
|
// This macro is extremely useful for enforcing strong typechecking on other
|
|
// macros. It generates no code.
|
|
//
|
|
// Simply insert this macro at the beginning of an expression list for
|
|
// each parameter that must be typechecked. For example, for the
|
|
// definition of MYMAX(x, y), where x and y absolutely must be integers,
|
|
// use:
|
|
//
|
|
// #define MYMAX(x, y) (SAFECAST(x, int), SAFECAST(y, int), ((x) > (y) ? (x) : (y)))
|
|
//
|
|
//
|
|
#define SAFECAST(_obj, _type) (((_type)(_obj)==(_obj)?0:0), (_type)(_obj))
|
|
|
|
|
|
/* Types
|
|
********/
|
|
|
|
typedef const void *PCVOID;
|
|
typedef const INT CINT;
|
|
typedef const INT *PCINT;
|
|
typedef const UINT CUINT;
|
|
typedef const UINT *PCUINT;
|
|
typedef const LONG CULONG;
|
|
typedef const LONG *PCULONG;
|
|
typedef const BYTE CBYTE;
|
|
typedef const BYTE *PCBYTE;
|
|
typedef const WORD CWORD;
|
|
typedef const WORD *PCWORD;
|
|
typedef const DWORD CDWORD;
|
|
typedef const DWORD *PCDWORD;
|
|
typedef const CRITICAL_SECTION CCRITICAL_SECTION;
|
|
typedef const CRITICAL_SECTION *PCCRITICAL_SECTION;
|
|
typedef const FILETIME CFILETIME;
|
|
typedef const FILETIME *PCFILETIME;
|
|
typedef const BITMAPINFO CBITMAPINFO;
|
|
typedef const BITMAPINFO *PCBITMAPINFO;
|
|
typedef const POINT CPOINT;
|
|
typedef const POINT *PCPOINT;
|
|
typedef const POINTL CPOINTL;
|
|
typedef const POINTL *PCPOINTL;
|
|
typedef const SECURITY_ATTRIBUTES CSECURITY_ATTRIBUTES;
|
|
typedef const SECURITY_ATTRIBUTES *PCSECURITY_ATTRIBUTES;
|
|
typedef const WIN32_FIND_DATA CWIN32_FIND_DATA;
|
|
typedef const WIN32_FIND_DATA *PCWIN32_FIND_DATA;
|
|
|
|
DECLARE_STANDARD_TYPES(HGLOBAL);
|
|
DECLARE_STANDARD_TYPES(HICON);
|
|
DECLARE_STANDARD_TYPES(HMENU);
|
|
DECLARE_STANDARD_TYPES(HWND);
|
|
DECLARE_STANDARD_TYPES(NMHDR);
|
|
|
|
#ifndef _COMPARISONRESULT_DEFINED_
|
|
|
|
/* comparison result */
|
|
|
|
typedef enum _comparisonresult
|
|
{
|
|
CR_FIRST_SMALLER = -1,
|
|
CR_EQUAL = 0,
|
|
CR_FIRST_LARGER = +1
|
|
}
|
|
COMPARISONRESULT;
|
|
DECLARE_STANDARD_TYPES(COMPARISONRESULT);
|
|
|
|
#define _COMPARISONRESULT_DEFINED_
|
|
|
|
#endif
|