_In_ PVOID FailedAssertion,
_In_ PVOID FileName,
_In_ ULONG LineNumber,
- _In_opt_ PSTR Message);
+ _In_opt_z_ PSTR Message);
/* VOID
* RtlCopyMemory(
_IRQL_requires_max_(DISPATCH_LEVEL)
_At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
-//_At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
-_At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR)))
+_When_(SourceString != NULL,
+_At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
+_At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR))))
+_When_(SourceString == NULL,
+_At_(DestinationString->Length, _Post_equal_to_(0))
+_At_(DestinationString->MaximumLength, _Post_equal_to_(0)))
NTSYSAPI
VOID
NTAPI
RtlInitUnicodeString(
- _Out_ PUNICODE_STRING DestinationString,
- _In_opt_z_ __drv_aliasesMem PCWSTR SourceString);
+ _Out_ PUNICODE_STRING DestinationString,
+ _In_opt_z_ __drv_aliasesMem PCWSTR SourceString);
/* VOID
* RtlMoveMemory(
_Out_ PANSI_STRING DestinationString,
_In_opt_z_ __drv_aliasesMem PCSZ SourceString);
+_At_(BitMapHeader->SizeOfBitMap, _Post_equal_to_(SizeOfBitMap))
+_At_(BitMapHeader->Buffer, _Post_equal_to_(BitMapBuffer))
NTSYSAPI
VOID
NTAPI
RtlInitializeBitMap(
_Out_ PRTL_BITMAP BitMapHeader,
- _In_ __drv_aliasesMem PULONG BitMapBuffer,
- _In_ ULONG SizeOfBitMap);
+ _In_opt_ __drv_aliasesMem PULONG BitMapBuffer,
+ _In_opt_ ULONG SizeOfBitMap);
_IRQL_requires_max_(DISPATCH_LEVEL)
NTSYSAPI
NTSTATUS
NTAPI
RtlQueryRegistryValues(
- _In_ ULONG RelativeTo,
- _In_ PCWSTR Path,
- _Inout_ _At_(*(*QueryTable).EntryContext, _Post_valid_)
- PRTL_QUERY_REGISTRY_TABLE QueryTable,
- _In_opt_ PVOID Context,
- _In_opt_ PVOID Environment);
+ _In_ ULONG RelativeTo,
+ _In_ PCWSTR Path,
+ _Inout_ _At_(*(*QueryTable).EntryContext, _Pre_unknown_)
+ PRTL_QUERY_REGISTRY_TABLE QueryTable,
+ _In_opt_ PVOID Context,
+ _In_opt_ PVOID Environment);
#define SHORT_SIZE (sizeof(USHORT))
#define SHORT_MASK (SHORT_SIZE - 1)
#define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
#endif /* _WIN64 */
-_Success_(return != 0)
+_Success_(return!=FALSE)
+_Must_inspect_result_
NTSYSAPI
BOOLEAN
NTAPI
RtlTimeFieldsToTime(
- _In_ PTIME_FIELDS TimeFields,
- _Out_ PLARGE_INTEGER Time);
+ _In_ PTIME_FIELDS TimeFields,
+ _Out_ PLARGE_INTEGER Time);
NTSYSAPI
VOID
RtlValidSecurityDescriptor(
_In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
+_IRQL_requires_max_(PASSIVE_LEVEL)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetVersion(
+ _Out_
+ _At_(lpVersionInformation->dwOSVersionInfoSize, _Pre_ _Valid_)
+ _When_(lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW),
+ _At_((PRTL_OSVERSIONINFOEXW)lpVersionInformation, _Out_))
+ PRTL_OSVERSIONINFOW lpVersionInformation);
+
+_IRQL_requires_max_(PASSIVE_LEVEL)
+_Must_inspect_result_
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlVerifyVersionInfo(
+ _In_ PRTL_OSVERSIONINFOEXW VersionInfo,
+ _In_ ULONG TypeMask,
+ _In_ ULONGLONG ConditionMask);
+
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSYSAPI
NTSTATUS
NTAPI
RtlUpperString(
_Inout_ PSTRING DestinationString,
- _In_ const PSTRING SourceString);
+ _In_ const STRING *SourceString);
_IRQL_requires_max_(PASSIVE_LEVEL)
_When_(AllocateDestinationString, _Must_inspect_result_)
_In_ PVOID VolumeDeviceObject,
_Out_ PUNICODE_STRING DosName);
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetVersion(
- IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlVerifyVersionInfo(
- IN PRTL_OSVERSIONINFOEXW VersionInfo,
- IN ULONG TypeMask,
- IN ULONGLONG ConditionMask);
-
_IRQL_requires_max_(PASSIVE_LEVEL)
_Must_inspect_result_
NTSYSAPI
LONG
NTAPI
RtlCompareString(
- _In_ const PSTRING String1,
- _In_ const PSTRING String2,
+ _In_ const STRING *String1,
+ _In_ const STRING *String2,
_In_ BOOLEAN CaseInSensitive);
NTSYSAPI
NTAPI
RtlCopyString(
_Out_ PSTRING DestinationString,
- _In_opt_ const PSTRING SourceString);
+ _In_opt_ const STRING *SourceString);
_IRQL_requires_max_(PASSIVE_LEVEL)
_Must_inspect_result_
BOOLEAN
NTAPI
RtlEqualString(
- _In_ const PSTRING String1,
- _In_ const PSTRING String2,
+ _In_ const STRING *String1,
+ _In_ const STRING *String2,
_In_ BOOLEAN CaseInSensitive);
_IRQL_requires_max_(PASSIVE_LEVEL)
PUNICODE_STRING DestinationString,
_In_z_ PCWSTR SourceString);
+_IRQL_requires_max_(PASSIVE_LEVEL)
+_Must_inspect_result_
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlPrefixString(
+ _In_ const STRING *String1,
+ _In_ const STRING *String2,
+ _In_ BOOLEAN CaseInsensitive);
+
_IRQL_requires_max_(APC_LEVEL)
NTSYSAPI
NTSTATUS
_Out_ PLARGE_INTEGER Time);
_Success_(return != 0)
+_Must_inspect_result_
NTSYSAPI
BOOLEAN
NTAPI
RtlTimeToSecondsSince1970(
- _In_ PLARGE_INTEGER Time,
- _Out_ PULONG ElapsedSeconds);
+ _In_ PLARGE_INTEGER Time,
+ _Out_ PULONG ElapsedSeconds);
NTSYSAPI
VOID
NTSTATUS
NTAPI
RtlCopySid(
- _In_ ULONG Length,
- _Out_writes_bytes_(Length) PSID Destination,
- _In_ PSID Source);
+ _In_ ULONG DestinationSidLength,
+ _Out_writes_bytes_(DestinationSidLength) PSID DestinationSid,
+ _In_ PSID SourceSid);
_IRQL_requires_max_(APC_LEVEL)
NTSYSAPI
NTAPI
RtlInitCodePageTable(
_In_ PUSHORT TableBase,
- _Inout_ PCPTABLEINFO CodePageTable);
+ _Out_ PCPTABLEINFO CodePageTable);
$endif (_NTIFS_)
#if DBG
-#define ASSERT(exp) \
- (VOID)((!(exp)) ? \
+#define RTL_VERIFY(exp) \
+ ((!(exp)) ? \
RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
-#define ASSERTMSG(msg, exp) \
- (VOID)((!(exp)) ? \
+#define RTL_VERIFYMSG(msg, exp) \
+ ((!(exp)) ? \
RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
-#define RTL_SOFT_ASSERT(exp) \
- (VOID)((!(exp)) ? \
+#define RTL_SOFT_VERIFY(exp) \
+ ((!(exp)) ? \
DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
-#define RTL_SOFT_ASSERTMSG(msg, exp) \
- (VOID)((!(exp)) ? \
+#define RTL_SOFT_VERIFYMSG(msg, exp) \
+ ((!(exp)) ? \
DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
-#define RTL_VERIFY(exp) ASSERT(exp)
-#define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
+/* The ASSERTs must be cast to void to avoid warnings about unused results.
+ * We also cannot invoke the VERIFY versions because the indirection messes
+ * with stringify. */
+#define ASSERT(exp) \
+ ((VOID)((!(exp)) ? \
+ RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE))
+
+#define ASSERTMSG(msg, exp) \
+ ((VOID)((!(exp)) ? \
+ RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE))
+
+#define RTL_SOFT_ASSERT(exp) \
+ ((VOID)((!(exp)) ? \
+ DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE))
-#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
-#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
+#define RTL_SOFT_ASSERTMSG(msg, exp) \
+ ((VOID)((!(exp)) ? \
+ DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE))
#if defined(_MSC_VER)
+# define __assert_annotationA(msg) __annotation(L"Debug", L"AssertFail", L ## msg)
+# define __assert_annotationW(msg) __annotation(L"Debug", L"AssertFail", msg)
+#else
+# define __assert_annotationA(msg) \
+ DbgPrint("Assertion failed at %s(%d): %s\n", __FILE__, __LINE__, msg)
+# define __assert_annotationW(msg) \
+ DbgPrint("Assertion failed at %s(%d): %S\n", __FILE__, __LINE__, msg)
+#endif
-#define NT_ASSERT(exp) \
+#define NT_VERIFY(exp) \
((!(exp)) ? \
- (__annotation(L"Debug", L"AssertFail", L#exp), \
+ (__assert_annotationA(#exp), \
DbgRaiseAssertionFailure(), FALSE) : TRUE)
-#define NT_ASSERTMSG(msg, exp) \
+#define NT_VERIFYMSG(msg, exp) \
((!(exp)) ? \
- (__annotation(L"Debug", L"AssertFail", L##msg), \
+ (__assert_annotationA(msg), \
DbgRaiseAssertionFailure(), FALSE) : TRUE)
-#define NT_ASSERTMSGW(msg, exp) \
+#define NT_VERIFYMSGW(msg, exp) \
((!(exp)) ? \
- (__annotation(L"Debug", L"AssertFail", msg), \
+ (__assert_annotationW(msg), \
DbgRaiseAssertionFailure(), FALSE) : TRUE)
-#define NT_VERIFY NT_ASSERT
-#define NT_VERIFYMSG NT_ASSERTMSG
-#define NT_VERIFYMSGW NT_ASSERTMSGW
-
-#else
-
-/* GCC doesn't support __annotation (nor PDB) */
+/* Can't reuse verify, see above */
#define NT_ASSERT(exp) \
- (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
+ ((VOID)((!(exp)) ? \
+ (__assert_annotationA(#exp), \
+ DbgRaiseAssertionFailure(), FALSE) : TRUE))
-#define NT_ASSERTMSG NT_ASSERT
-#define NT_ASSERTMSGW NT_ASSERT
+#define NT_ASSERTMSG(msg, exp) \
+ ((VOID)((!(exp)) ? \
+ (__assert_annotationA(msg), \
+ DbgRaiseAssertionFailure(), FALSE) : TRUE))
-#endif
+#define NT_ASSERTMSGW(msg, exp) \
+ ((VOID)((!(exp)) ? \
+ (__assert_annotationW(msg), \
+ DbgRaiseAssertionFailure(), FALSE) : TRUE))
#else /* !DBG */