33 lines
1.0 KiB
C++
33 lines
1.0 KiB
C++
// Copyright 2021 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "base/win/nt_status.h"
|
|
|
|
#include <windows.h>
|
|
#include <winternl.h>
|
|
|
|
#include "base/check.h"
|
|
|
|
using GetLastNtStatusFn = NTSTATUS NTAPI (*)();
|
|
|
|
constexpr const wchar_t kNtDllName[] = L"ntdll.dll";
|
|
constexpr const char kLastStatusFnName[] = "RtlGetLastNtStatus";
|
|
|
|
namespace base {
|
|
namespace win {
|
|
|
|
NTSTATUS GetLastNtStatus() {
|
|
// This is equivalent to calling NtCurrentTeb() and extracting
|
|
// LastStatusValue from the returned _TEB structure, except that the public
|
|
// _TEB struct definition does not actually specify the location of the
|
|
// LastStatusValue field. We avoid depending on such a definition by
|
|
// internally using RtGetLastNtStatus() from ntdll.dll instead.
|
|
static auto* get_last_nt_status = reinterpret_cast<GetLastNtStatusFn>(
|
|
::GetProcAddress(::GetModuleHandle(kNtDllName), kLastStatusFnName));
|
|
return get_last_nt_status();
|
|
}
|
|
|
|
} // namespace win
|
|
} // namespace base
|