/*
 * kernelspecs.h
 *
 * SAL 2 annotations for kernel mode drivers
 *
 * This file is part of the ReactOS DDK package.
 *
 * Contributor:
 *   Timo Kreuzer (timo.kreuzer@reactos.org)
 *
 * THIS SOFTWARE IS NOT COPYRIGHTED
 *
 * This source code is offered for use in the public domain. You may
 * use, modify or distribute it freely.
 *
 * This code is distributed in the hope that it will be useful but
 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 * DISCLAIMED. This includes but is not limited to warranties of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */
#pragma once

#define KERNELSPECS_H

#include "driverspecs.h"

#ifdef _PREFAST_

/* Make sure we have IRQL level definitions early */
#define DISPATCH_LEVEL 2
#define APC_LEVEL 1
#define PASSIVE_LEVEL 0
#if defined(_X86_)
#define HIGH_LEVEL 31
#elif defined(_AMD64_)
#define HIGH_LEVEL 15
#elif defined(_ARM_)
#define HIGH_LEVEL 15
#elif defined(_IA64_)
#define HIGH_LEVEL 15
#endif

#undef _IRQL_always_function_max_
#undef _IRQL_always_function_min_
#undef _IRQL_raises_
#undef _IRQL_requires_
#undef _IRQL_requires_max_
#undef _IRQL_requires_min_
#undef _IRQL_requires_same_
#undef _IRQL_restores_
#undef _IRQL_restores_global_
#undef _IRQL_saves_
#undef _IRQL_saves_global_
#undef _IRQL_uses_cancel_
#undef _IRQL_is_cancel_
#undef __drv_setsIRQL
#undef __drv_raisesIRQL
#undef __drv_requiresIRQL
#undef __drv_maxIRQL
#undef __drv_minIRQL
#undef __drv_savesIRQL
#undef __drv_savesIRQLGlobal
#undef __drv_restoresIRQL
#undef __drv_restoresIRQLGlobal
#undef __drv_minFunctionIRQL
#undef __drv_maxFunctionIRQL
#undef __drv_sameIRQL
#undef __drv_useCancelIRQL
#undef __drv_isCancelIRQL

#define _IRQL_always_function_max_(irql)    _Pre_ _SA_annotes1(SAL_maxFunctionIrql,irql)
#define _IRQL_always_function_min_(irql)    _Pre_ _SA_annotes1(SAL_minFunctionIrql,irql)
#define _IRQL_raises_(irql)                 _Post_ _SA_annotes1(SAL_raiseIRQL,irql)
#define _IRQL_requires_(irql)               _Pre_ _SA_annotes1(SAL_IRQL,irql)
#define _IRQL_requires_max_(irql)           _Pre_ _SA_annotes1(SAL_maxIRQL,irql)
#define _IRQL_requires_min_(irql)           _Pre_ _SA_annotes1(SAL_minIRQL,irql)
#define _IRQL_requires_same_                _Post_ _SA_annotes0(SAL_sameIRQL)
#define _IRQL_restores_                     _Post_ _SA_annotes0(SAL_restoreIRQL)
#define _IRQL_restores_global_(kind,param)  _Post_ _SA_annotes2(SAL_restoreIRQLGlobal, #kind, param\t)
#define _IRQL_saves_                        _Post_ _SA_annotes0(SAL_saveIRQL)
#define _IRQL_saves_global_(kind,param)     _Post_ _SA_annotes2(SAL_saveIRQLGlobal,#kind, param\t)
#define _IRQL_uses_cancel_                  _Post_ _SA_annotes0(SAL_UseCancelIrql)
#define _IRQL_is_cancel_                    _IRQL_uses_cancel_ _Releases_nonreentrant_lock_(_Global_cancel_spin_lock_) \
                                                _At_(return, _IRQL_always_function_min_(DISPATCH_LEVEL) _IRQL_requires_(DISPATCH_LEVEL))
#define __drv_setsIRQL(irql)                _Post_ _SA_annotes1(SAL_IRQL,irql)
#define __drv_raisesIRQL(irql)              _IRQL_raises_(irql)
#define __drv_requiresIRQL(irql)            _IRQL_requires_(irql)
#define __drv_maxIRQL(irql)                 _IRQL_requires_max_(irql)
#define __drv_minIRQL(irql)                 _IRQL_requires_min_(irql)
#define __drv_savesIRQL                     _IRQL_saves_
#define __drv_savesIRQLGlobal(kind,param)   _IRQL_saves_global_(kind,param)
#define __drv_restoresIRQL                  _IRQL_restores_
#define __drv_restoresIRQLGlobal(kind,param) _IRQL_restores_global_(kind,param)
#define __drv_minFunctionIRQL(irql)         _IRQL_always_function_min_(irql)
#define __drv_maxFunctionIRQL(irql)         _IRQL_always_function_max_(irql)
#define __drv_sameIRQL                      _IRQL_requires_same_
#define __drv_useCancelIRQL                 _IRQL_uses_cancel_
#define __drv_isCancelIRQL                  _IRQL_is_cancel_

#ifdef __cplusplus
extern "C" {
#endif

__ANNOTATION(SAL_IRQL(__int64);)
__ANNOTATION(SAL_raiseIRQL(__int64);)
__ANNOTATION(SAL_maxIRQL(__int64);)
__ANNOTATION(SAL_minIRQL(__int64);)
__ANNOTATION(SAL_saveIRQL(void);)
__ANNOTATION(SAL_saveIRQLGlobal(_In_ char *, ...);)
__ANNOTATION(SAL_restoreIRQL(void);)
__ANNOTATION(SAL_restoreIRQLGlobal(_In_ char *, ...);)
__ANNOTATION(SAL_minFunctionIrql(__int64);)
__ANNOTATION(SAL_maxFunctionIrql(__int64);)
__ANNOTATION(SAL_sameIRQL(void);)
__ANNOTATION(SAL_UseCancelIrql(void);)

#ifdef __cplusplus
} // extern "C"
#endif

#endif /* _PREFAST_ */