aboutsummaryrefslogtreecommitdiff
path: root/Application/EfiDSEFix/src/EfiDSEFix.h
diff options
context:
space:
mode:
Diffstat (limited to 'Application/EfiDSEFix/src/EfiDSEFix.h')
-rw-r--r--Application/EfiDSEFix/src/EfiDSEFix.h255
1 files changed, 255 insertions, 0 deletions
diff --git a/Application/EfiDSEFix/src/EfiDSEFix.h b/Application/EfiDSEFix/src/EfiDSEFix.h
new file mode 100644
index 0000000..b22336f
--- /dev/null
+++ b/Application/EfiDSEFix/src/EfiDSEFix.h
@@ -0,0 +1,255 @@
+#pragma once
+
+#include "ntdll.h"
+
+#if defined(__cplusplus) && \
+ ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || defined(__clang__))
+#define CONSTEXPR constexpr
+#else
+#define CONSTEXPR
+#endif
+
+#if defined(__RESHARPER__)
+#define WPRINTF_ATTR(FormatIndex, FirstToCheck) \
+ [[rscpp::format(wprintf, FormatIndex, FirstToCheck)]]
+#else
+#define WPRINTF_ATTR(FormatIndex, FirstToCheck)
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// EfiDSEFix.cpp
+NTSTATUS
+TestSetVariableHook(
+ );
+
+NTSTATUS
+AdjustCiOptions(
+ _In_ ULONG CiOptionsValue,
+ _Out_opt_ PULONG OldCiOptionsValue
+ );
+
+// sysinfo.cpp
+NTSTATUS
+DumpSystemInformation(
+ );
+
+// pe.cpp
+NTSTATUS
+MapFileSectionView(
+ _In_ PCWCHAR Filename,
+ _Out_ PVOID *ImageBase,
+ _Out_ PSIZE_T ViewSize
+ );
+
+PVOID
+GetProcedureAddress(
+ _In_ ULONG_PTR DllBase,
+ _In_ PCSTR RoutineName
+ );
+
+FORCEINLINE
+ULONG
+RtlNtMajorVersion(
+ )
+{
+ return *(PULONG)(0x7FFE0000 + 0x026C);
+}
+
+FORCEINLINE
+ULONG
+RtlNtMinorVersion(
+ )
+{
+ return *(PULONG)(0x7FFE0000 + 0x0270);
+}
+
+CONSTEXPR
+FORCEINLINE
+LONGLONG
+RtlMsToTicks(
+ _In_ ULONG Milliseconds
+ )
+{
+ return 10000LL * (LONGLONG)Milliseconds;
+}
+
+FORCEINLINE
+VOID
+RtlSleep(
+ _In_ ULONG Milliseconds
+ )
+{
+ LARGE_INTEGER Timeout;
+ Timeout.QuadPart = -1 * RtlMsToTicks(Milliseconds);
+ NtDelayExecution(FALSE, &Timeout);
+}
+
+// Ntdll string functions, not in ntdll.h as they are incompatible with the CRT
+typedef const WCHAR *LPCWCHAR, *PCWCHAR;
+
+NTSYSAPI
+int
+__cdecl
+_snwprintf(
+ _Out_ PWCHAR Buffer,
+ _In_ size_t BufferCount,
+ _In_ PCWCHAR Format,
+ ...
+ );
+
+NTSYSAPI
+int
+__cdecl
+_vsnwprintf(
+ _Out_ PWCHAR Buffer,
+ _In_ size_t BufferCount,
+ _In_ PCWCHAR Format,
+ _In_ va_list ArgList
+ );
+
+NTSYSAPI
+int
+__cdecl
+_wtoi(
+ _In_ PCWCHAR Str
+ );
+
+// Console functions
+WPRINTF_ATTR(1, 2)
+inline
+VOID
+Printf(
+ _In_ PCWCHAR Format,
+ ...
+ )
+{
+ WCHAR Buffer[512];
+ va_list VaList;
+ va_start(VaList, Format);
+ ULONG N = _vsnwprintf(Buffer, sizeof(Buffer), Format, VaList);
+ WriteConsoleW(NtCurrentPeb()->ProcessParameters->StandardOutput, Buffer, N, &N, NULL);
+ va_end(VaList);
+}
+
+inline
+VOID
+PrintGuid(
+ _In_ GUID Guid
+ )
+{
+ Printf(L"{%08lx-%04hx-%04hx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx}",
+ Guid.Data1, Guid.Data2, Guid.Data3,
+ Guid.Data4[0], Guid.Data4[1], Guid.Data4[2], Guid.Data4[3],
+ Guid.Data4[4], Guid.Data4[5], Guid.Data4[6], Guid.Data4[7]);
+}
+
+inline
+VOID
+WaitForKey(
+ )
+{
+ const HANDLE StdIn = NtCurrentPeb()->ProcessParameters->StandardInput;
+ INPUT_RECORD InputRecord = { 0 };
+ ULONG NumRead;
+ while (InputRecord.EventType != KEY_EVENT || !InputRecord.Event.KeyEvent.bKeyDown || InputRecord.Event.KeyEvent.dwControlKeyState !=
+ (InputRecord.Event.KeyEvent.dwControlKeyState & ~(RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED)))
+ {
+ ReadConsoleInputW(StdIn, &InputRecord, 1, &NumRead);
+ }
+}
+
+#ifdef NT_ANALYSIS_ASSUME
+// wdm.h's asserts are incompatible with both clang and MS's own analyzer
+#undef NT_ANALYSIS_ASSUME
+#undef NT_ASSERT_ACTION
+#undef NT_ASSERTMSG_ACTION
+#undef NT_ASSERTMSGW_ACTION
+#undef NT_ASSERT_ASSUME
+#undef NT_ASSERTMSG_ASSUME
+#undef NT_ASSERTMSGW_ASSUME
+#undef NT_ASSERT
+#undef NT_ASSERTMSG
+#undef NT_ASSERTMSGW
+#endif
+
+#ifdef _PREFAST_
+#define NT_ANALYSIS_ASSUME(...) _Analysis_assume_(__VA_ARGS__)
+#elif defined(_DEBUG) || defined(DBG)
+#define NT_ANALYSIS_ASSUME(...) ((void) 0)
+#else
+#define NT_ANALYSIS_ASSUME(...) __noop(__VA_ARGS__)
+#endif
+
+#if !defined(__clang__)
+#if !defined(DbgRaiseAssertionFailure)
+#define DbgRaiseAssertionFailure() __int2c()
+#endif
+
+#define NT_ASSERT_ACTION(_exp) \
+ ((!(_exp)) ? \
+ (__annotation((PWCHAR)L"Debug", L"AssertFail", L#_exp), \
+ DbgRaiseAssertionFailure(), FALSE) : \
+ TRUE)
+
+#define NT_ASSERTMSG_ACTION(_msg, _exp) \
+ ((!(_exp)) ? \
+ (__annotation((PWCHAR)L"Debug", L"AssertFail", L##_msg), \
+ DbgRaiseAssertionFailure(), FALSE) : \
+ TRUE)
+
+#define NT_ASSERTMSGW_ACTION(_msg, _exp) \
+ ((!(_exp)) ? \
+ (__annotation((PWCHAR)L"Debug", L"AssertFail", _msg), \
+ DbgRaiseAssertionFailure(), FALSE) : \
+ TRUE)
+#else
+#define NT_ASSERT_ACTION(_exp) \
+ ((!(_exp)) ? (__debugbreak(), FALSE) : TRUE)
+#define NT_ASSERTMSG_ACTION(_msg, _exp) \
+ NT_ASSERT_ACTION(_exp)
+#define NT_ASSERTMSGW_ACTION(_msg, _exp) \
+ NT_ASSERT_ACTION(_exp)
+#endif
+
+#if defined(_DEBUG) || defined(DBG)
+#define NT_ASSERT_ASSUME(_exp) \
+ (NT_ANALYSIS_ASSUME(_exp), NT_ASSERT_ACTION(_exp))
+
+#define NT_ASSERTMSG_ASSUME(_msg, _exp) \
+ (NT_ANALYSIS_ASSUME(_exp), NT_ASSERTMSG_ACTION(_msg, _exp))
+
+#define NT_ASSERTMSGW_ASSUME(_msg, _exp) \
+ (NT_ANALYSIS_ASSUME(_exp), NT_ASSERTMSGW_ACTION(_msg, _exp))
+
+#define NT_ASSERT NT_ASSERT_ASSUME
+#define NT_ASSERTMSG NT_ASSERTMSG_ASSUME
+#define NT_ASSERTMSGW NT_ASSERTMSGW_ASSUME
+#else
+#define NT_ASSERT(_exp) ((void) 0)
+#define NT_ASSERTMSG(_msg, _exp) ((void) 0)
+#define NT_ASSERTMSGW(_msg, _exp) ((void) 0)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef __cplusplus
+#pragma warning(push)
+#pragma warning(disable:4309)
+// Convenience utility
+// Usage: static_print<some_constant>()() gives the value as compiler warning C4305 or -Wconstant-conversion
+template<ULONG N>
+struct static_print
+{
+ CONSTEXPR CHAR operator()() const { return N + 256; }
+};
+#pragma warning(pop)
+
+#define PRINT_SIZE(T) { static_print<sizeof(T)>()(); }
+#define PRINT_OFFSET(T, V) { static_print<UFIELD_OFFSET(T, V)>()(); }
+
+#endif