/*
 * Copyright (c) 2008-2011 Kernel Drivers, LLC.
 * Copyright (c) 2009-2011 Your File System, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice,
 *   this list of conditions and the following disclaimer in the
 *   documentation
 *   and/or other materials provided with the distribution.
 * - Neither the name of Kernel Drivers, LLC nor the names of its
 *   contributors may be
 *   used to endorse or promote products derived from this software without
 *   specific prior written permission from Kernel Drivers, LLC
 *   and Your File System, Inc.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _AFS_REDIR_COMMON_DEFINES_H
#define _AFS_REDIR_COMMON_DEFINES_H

//
// Allocation defines
//

#define AFS_GENERIC_MEMORY_1_TAG     '1GFA'
#define AFS_GENERIC_MEMORY_2_TAG     '2GFA'
#define AFS_GENERIC_MEMORY_3_TAG     '3GFA'
#define AFS_GENERIC_MEMORY_4_TAG     '4GFA'
#define AFS_GENERIC_MEMORY_5_TAG     '5GFA'
#define AFS_GENERIC_MEMORY_6_TAG     '6GFA'
#define AFS_GENERIC_MEMORY_7_TAG     '7GFA'
#define AFS_GENERIC_MEMORY_8_TAG     '8GFA'
#define AFS_GENERIC_MEMORY_9_TAG     '9GFA'
#define AFS_GENERIC_MEMORY_10_TAG    'AGFA'
#define AFS_GENERIC_MEMORY_11_TAG    'BGFA'
#define AFS_GENERIC_MEMORY_12_TAG    'CGFA'
#define AFS_GENERIC_MEMORY_13_TAG    'DGFA'
#define AFS_GENERIC_MEMORY_14_TAG    'EGFA'
#define AFS_GENERIC_MEMORY_15_TAG    'FGFA'
#define AFS_GENERIC_MEMORY_16_TAG    'GGFA'
#define AFS_GENERIC_MEMORY_17_TAG    'HGFA'
#define AFS_GENERIC_MEMORY_18_TAG    'IGFA'
#define AFS_GENERIC_MEMORY_19_TAG    'JGFA'
#define AFS_GENERIC_MEMORY_20_TAG    'KGFA'
#define AFS_GENERIC_MEMORY_21_TAG    'LGFA'
#define AFS_GENERIC_MEMORY_22_TAG    'MGFA'
#define AFS_GENERIC_MEMORY_23_TAG    'NGFA'
#define AFS_GENERIC_MEMORY_24_TAG    'OGFA'
#define AFS_GENERIC_MEMORY_25_TAG    'PGFA'
#define AFS_GENERIC_MEMORY_26_TAG    'QGFA'
#define AFS_GENERIC_MEMORY_27_TAG    'RGFA'
#define AFS_GENERIC_MEMORY_28_TAG    'SGFA'
#define AFS_GENERIC_MEMORY_29_TAG    'TGFA'
#define AFS_GENERIC_MEMORY_30_TAG    'UGFA'
#define AFS_GENERIC_MEMORY_31_TAG    'VGFA'
#define AFS_GENERIC_MEMORY_32_TAG    'WGFA'
#define AFS_FCB_ALLOCATION_TAG       'AFFA'
#define AFS_FCB_NP_ALLOCATION_TAG    'NFFA'
#define AFS_VCB_ALLOCATION_TAG       'CVFA'
#define AFS_VCB_NP_ALLOCATION_TAG    'NVFA'
#define AFS_CCB_ALLOCATION_TAG       'CCFA'
#define AFS_WORKER_CB_TAG            'CWFA'
#define AFS_WORK_ITEM_TAG            'IWFA'
#define AFS_POOL_ENTRY_TAG           'EPFA'
#define AFS_PROCESS_CB_TAG           'CPFA'
#define AFS_DIR_BUFFER_TAG           'BDFA'
#define AFS_DIR_ENTRY_TAG            'EDFA'
#define AFS_NAME_BUFFER_ONE_TAG      '1NFA'
#define AFS_NAME_BUFFER_TWO_TAG      '2NFA'
#define AFS_NAME_BUFFER_THREE_TAG    '3NFA'
#define AFS_NAME_BUFFER_FOUR_TAG     '4NFA'
#define AFS_NAME_BUFFER_FIVE_TAG     '5NFA'
#define AFS_NAME_BUFFER_SIX_TAG      '6NFA'
#define AFS_NAME_BUFFER_SEVEN_TAG    '7NFA'
#define AFS_NAME_BUFFER_EIGHT_TAG    '8NFA'
#define AFS_NAME_BUFFER_NINE_TAG     '9NFA'
#define AFS_NAME_BUFFER_TEN_TAG      'ANFA'
#define AFS_SUBST_BUFFER_TAG         'SBFA'
#define AFS_FILE_CREATE_BUFFER_TAG   'CFFA'
#define AFS_RENAME_REQUEST_TAG       'RFFA'
#define AFS_DIR_ENTRY_NP_TAG         'NDFA'
#define AFS_PROVIDER_CB              'PNFA'
#define AFS_EXTENT_TAG               'xSFA'
#define AFS_EXTENT_REQUEST_TAG       'XSFA'
#define AFS_EXTENT_RELEASE_TAG       'LSFA'
#define AFS_IO_RUN_TAG               'iSFA'
#define AFS_GATHER_TAG               'gSFA'
#define AFS_UPDATE_RESULT_TAG        'RUFA'
#define AFS_EXTENTS_RESULT_TAG       'XEFA'
#define AFS_SYS_NAME_NODE_TAG        'NSFA'
#define AFS_REPARSE_NAME_TAG         'NRFA'
#define AFS_NAME_ARRAY_TAG           'ANFA'
#define AFS_OBJECT_INFO_TAG          'IOFA'
#define AFS_NP_OBJECT_INFO_TAG       'ONFA'
#define AFS_DIR_SNAPSHOT_TAG         'SSFA'
#define AFS_LIBRARY_QUEUE_TAG        'QLFA'
#define AFS_NETWORK_PROVIDER_1_TAG   '1ZFA'
#define AFS_NETWORK_PROVIDER_2_TAG   '2ZFA'
#define AFS_NETWORK_PROVIDER_3_TAG   '3ZFA'
#define AFS_NETWORK_PROVIDER_4_TAG   '4ZFA'
#define AFS_NETWORK_PROVIDER_5_TAG   '5ZFA'
#define AFS_NETWORK_PROVIDER_6_TAG   '6ZFA'
#define AFS_NETWORK_PROVIDER_7_TAG   '7ZFA'
#define AFS_NETWORK_PROVIDER_8_TAG   '8ZFA'
#define AFS_NETWORK_PROVIDER_9_TAG   '9ZFA'
#define AFS_NETWORK_PROVIDER_10_TAG  'AZFA'
#define AFS_NETWORK_PROVIDER_11_TAG  'BZFA'
#define AFS_AG_ENTRY_CB_TAG          'GAFA'
#define AFS_PROCESS_AG_CB_TAG        'APFA'

#define __Enter

#define try_return(S) { S; goto try_exit; }

//
// Object types allocated
//

#define AFS_FILE_FCB                            0x0001
#define AFS_DIRECTORY_FCB                       0x0002
#define AFS_NON_PAGED_FCB                       0x0003
#define AFS_CCB                                 0x0004
#define AFS_ROOT_FCB                            0x0006
#define AFS_VCB                                 0x0007
#define AFS_NON_PAGED_VCB                       0x0008
#define AFS_ROOT_ALL                            0x0009
#define AFS_IOCTL_FCB                           0x000A
#define AFS_MOUNT_POINT_FCB                     0x000B
#define AFS_SYMBOLIC_LINK_FCB                   0x000C
#define AFS_SPECIAL_SHARE_FCB                   0x000D
#define AFS_DFS_LINK_FCB                        0x000E

#define AFS_INVALID_FCB                         0x00FF

//
// Debug information
//

#define AFS_DBG_FLAG_BREAK_ON_ENTRY     0x00000001   // Only enabled in checked build
#define AFS_DBG_TRACE_TO_DEBUGGER       0x00000002
#define AFS_DBG_FLAG_ENABLE_FORCE_CRASH 0x00000004   // Only enabled in checked build
#define AFS_DBG_BUGCHECK_EXCEPTION      0x00000008
#define AFS_DBG_CLEAN_SHUTDOWN          0x00000010
#define AFS_DBG_REQUIRE_CLEAN_SHUTDOWN  0x00000020

//
// Pool state
//

#define POOL_UNKNOWN            0
#define POOL_INACTIVE           1
#define POOL_ACTIVE             2

//
// Volume flags
//

#define AFS_VOLUME_FLAGS_OFFLINE                        0x00000001
#define AFS_VOLUME_PRIVATE_WOKER_INITIALIZED            0x00000002
#define AFS_VOLUME_INSERTED_HASH_TREE                   0x00000004
#define AFS_VOLUME_ACTIVE_GLOBAL_ROOT                   0x00000008

//
// Need this to handle the break point definition
//

typedef
void
(*PAFSDumpTraceFiles)( void);

extern PAFSDumpTraceFiles  AFSDumpTraceFilesFnc;

//
// Debug information
//

static inline void AFS_ASSERT() {
    AFSDumpTraceFilesFnc();
}

#if DBG

//#define AFS_VALIDATE_EXTENTS            0

static inline void AFSBreakPoint() {
    AFSDumpTraceFilesFnc();
#if !defined(KD_DEBUGGER_ENABLED)
#define KD_DEBUGGER_ENABLED DBG
#endif // KD_DEBUGGER_ENABLED

#if (NTDDI_VERSION >= NTDDI_WS03)
    KdRefreshDebuggerNotPresent();
#endif

#if defined(KD_DEBUGGER_NOT_PRESENT)
    if (KD_DEBUGGER_NOT_PRESENT == FALSE)
        DbgBreakPoint();
#endif // KD_DEBUGGER_NOT_PRESENT
}

#define AFSPrint        DbgPrint

#else

static inline void AFSBreakPoint() {
    AFSDumpTraceFilesFnc();
}

#define AFSPrint

#endif

//
// Library control device name
//

#define AFS_LIBRARY_CONTROL_DEVICE_NAME     L"\\Device\\AFSLibraryControlDevice"

#define AFS_REDIR_LIBRARY_SERVICE_ENTRY     L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\AFSLibrary"

#endif

