- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
class LoaderLock
{
public:
void lock();
void unlock();
bool IsLocked() const;
LoaderLock() = default;
private:
LoaderLock(LoaderLock&) = delete;
LoaderLock(LoaderLock&&) = delete;
LoaderLock& operator=(LoaderLock&) = delete;
LoaderLock& operator=(LoaderLock&&) = delete;
bool _Locked = false;
ULONG _cookie = 0;
std::unique_ptr<void, std::function<void(void*)>> _ntdll{ LoadLibrary("NTDLL.DLL"), [](void* h){if (h)FreeLibrary((HMODULE)h); } };
typedef NTSTATUS(__stdcall*LdrLockLoaderLockFunc)(
ULONG Flags,
ULONG *State,
ULONG *Cookie);
LdrLockLoaderLockFunc _LdrLockLoaderLock = !_ntdll ? 0 : (LdrLockLoaderLockFunc)GetProcAddress((HMODULE)_ntdll.get(), "LdrLockLoaderLock");
typedef NTSTATUS(__stdcall*LdrUnlockLoaderLockFunc)(
ULONG Flags,
ULONG Cookie);
LdrUnlockLoaderLockFunc _LdrUnlockLoaderLock = !_ntdll ? 0 : (LdrUnlockLoaderLockFunc)GetProcAddress((HMODULE)_ntdll.get(), "LdrUnlockLoaderLock");
};
Уже давно минул 2014 год, а C++11 не перестает радовать нас размазанными по интерфейсу конструкторами и деструкторами.