141 lines
4.8 KiB
C
141 lines
4.8 KiB
C
/*++
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
ntrtloverflow.h
|
|
|
|
Abstract:
|
|
|
|
32bit/64bit signed/unsigned add/multiply with overflow checking
|
|
|
|
Author:
|
|
|
|
Jay Krell (JayKrell) March 2002
|
|
|
|
Environment:
|
|
|
|
anywhere
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _NTRTLOVERFLOW_
|
|
#define _NTRTLOVERFLOW_
|
|
|
|
#if (_MSC_VER > 1020)
|
|
#pragma once
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//
|
|
// add functions are FORCEINLINE in ntrtl.h
|
|
//
|
|
|
|
//
|
|
// *pc = a * b
|
|
// return value is STATUS_INTEGER_OVERFLOW or STATUS_SUCCESS
|
|
//
|
|
NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
RtlMultiplyWithOverflowCheckSigned32(
|
|
__int32 * pc,
|
|
__int32 a,
|
|
__int32 b
|
|
);
|
|
|
|
// not implemented
|
|
// NTSYSAPI
|
|
// NTSTATUS
|
|
// NTAPI
|
|
// RtlMultiplyWithOverflowCheckSigned64(
|
|
// __int64 * pc,
|
|
// __int64 a,
|
|
// __int64 b
|
|
// );
|
|
|
|
//
|
|
// *pc = a * b
|
|
// return value is STATUS_INTEGER_OVERFLOW or STATUS_SUCCESS
|
|
//
|
|
NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
RtlMultiplyWithOverflowCheckUnsigned32(
|
|
unsigned __int32 * pc,
|
|
unsigned __int32 a,
|
|
unsigned __int32 b
|
|
);
|
|
|
|
//
|
|
// *pc = a * b
|
|
// return value is STATUS_INTEGER_OVERFLOW or STATUS_SUCCESS
|
|
//
|
|
NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
RtlMultiplyWithOverflowCheckUnsigned64(
|
|
unsigned __int64 * pc,
|
|
unsigned __int64 a,
|
|
unsigned __int64 b
|
|
);
|
|
|
|
#define RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK(type, base) ((NTSTATUS (NTAPI * )(type *, type, type))base)
|
|
|
|
#define RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED32(type) \
|
|
RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK(type, RtlMultiplyWithOverflowCheckUnsigned32)
|
|
|
|
#define RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED64(type) \
|
|
RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK(type, RtlMultiplyWithOverflowCheckUnsigned64)
|
|
|
|
#define RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED32(type) \
|
|
RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK(type, RtlMultiplyWithOverflowCheckSigned32)
|
|
|
|
// signed64 not implemented
|
|
|
|
#if !defined(_WIN64)
|
|
#define RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED_PTR(x) RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED32(x)
|
|
#else
|
|
#define RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED_PTR(x) RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED64(x)
|
|
#endif
|
|
|
|
#define RtlMultiplyWithOverflowCheckUint RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED32(UINT)
|
|
#define RtlMultiplyWithOverflowCheckUint32 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED32(UINT32)
|
|
#define RtlMultiplyWithOverflowCheckUlong RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED32(ULONG)
|
|
#define RtlMultiplyWithOverflowCheckUlong32 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED32(ULONG32)
|
|
#define RtlMultiplyWithOverflowCheckDword RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED32(DWORD)
|
|
#define RtlMultiplyWithOverflowCheckDword32 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED32(DWORD32)
|
|
#define RtlMultiplyWithOverflowCheckUint64 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED64(UINT64)
|
|
#define RtlMultiplyWithOverflowCheckUlong64 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED64(ULONG64)
|
|
#define RtlMultiplyWithOverflowCheckDword64 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED64(DWORD64)
|
|
#define RtlMultiplyWithOverflowCheckUlonglong RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED64(ULONGLONG)
|
|
#define RtlMultiplyWithOverflowCheckInt RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED32(INT)
|
|
#define RtlMultiplyWithOverflowCheckInt32 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED32(INT32)
|
|
#define RtlMultiplyWithOverflowCheckLong RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED32(LONG)
|
|
#define RtlMultiplyWithOverflowCheckLong32 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED32(LONG32)
|
|
//not implemented
|
|
//#define RtlMultiplyWithOverflowCheckInt64 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED64(INT64)
|
|
//#define RtlMultiplyWithOverflowCheckLong64 RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED64(LONG64)
|
|
//#define RtlMultiplyWithOverflowCheckLonglong RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED64(LONGLONG)
|
|
|
|
#define RtlMultiplyWithOverflowCheckUintPtr RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED_PTR(UINT_PTR)
|
|
#define RtlMultiplyWithOverflowCheckUlongPtr RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED_PTR(ULONG_PTR)
|
|
#define RtlMultiplyWithOverflowCheckDwordPtr RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED_PTR(DWORD_PTR)
|
|
#define RtlMultiplyWithOverflowCheckSizet RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_UNSIGNED_PTR(SIZE_T)
|
|
//not implemented
|
|
//#define RtlMultiplyWithOverflowCheckIntPtr RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED_PTR(INT_PTR)
|
|
//#define RtlMultiplyWithOverflowCheckLongPtr RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED_PTR(LONG_PTR)
|
|
//#define RtlMultiplyWithOverflowCheckSsizet RTL_CAST_MULTIPLY_WITH_OVERFLOW_CHECK_SIGNED_PTR(SSIZE_T)
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#endif
|