You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.1 KiB
122 lines
3.1 KiB
// Copyright (c) 1998 Microsoft Corporation
|
|
//
|
|
// KernHelp.cpp
|
|
//
|
|
// Wrappers for kernel functions to make synth core cross compilable
|
|
//
|
|
|
|
extern "C" {
|
|
#include <ntddk.h>
|
|
};
|
|
|
|
#include "KernHelp.h"
|
|
|
|
VOID InitializeCriticalSection(
|
|
LPCRITICAL_SECTION CritSect)
|
|
{
|
|
KeInitializeMutex((PKMUTEX)CritSect, 1);
|
|
}
|
|
|
|
VOID EnterCriticalSection(
|
|
LPCRITICAL_SECTION CritSect)
|
|
{
|
|
KeWaitForSingleObject((PKMUTEX)CritSect,
|
|
Executive,
|
|
KernelMode,
|
|
FALSE,
|
|
0);
|
|
|
|
}
|
|
|
|
VOID LeaveCriticalSection(
|
|
LPCRITICAL_SECTION CritSect)
|
|
{
|
|
KeReleaseMutex((PKMUTEX)CritSect, FALSE);
|
|
}
|
|
|
|
VOID DeleteCriticalSection(
|
|
LPCRITICAL_SECTION CritSect)
|
|
{
|
|
// NOP in kernel
|
|
//
|
|
}
|
|
|
|
// GetRegValueDword
|
|
//
|
|
// Must be called at passive level
|
|
//
|
|
int GetRegValueDword(
|
|
LPTSTR RegPath,
|
|
LPTSTR ValueName,
|
|
PULONG Value)
|
|
{
|
|
int ReturnValue = 0;
|
|
NTSTATUS Status;
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
HANDLE KeyHandle;
|
|
KEY_VALUE_PARTIAL_INFORMATION *Information;
|
|
ULONG InformationSize;
|
|
UNICODE_STRING UnicodeRegPath;
|
|
UNICODE_STRING UnicodeValueName;
|
|
|
|
RtlInitUnicodeString(&UnicodeRegPath, RegPath);
|
|
RtlInitUnicodeString(&UnicodeValueName, ValueName);
|
|
|
|
InitializeObjectAttributes(&ObjectAttributes,
|
|
&UnicodeRegPath,
|
|
0, // Flags
|
|
NULL, // Root directory
|
|
NULL); // Security descriptor
|
|
|
|
Status = ZwOpenKey(&KeyHandle,
|
|
KEY_QUERY_VALUE,
|
|
&ObjectAttributes);
|
|
if (Status != STATUS_SUCCESS)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
InformationSize = sizeof(Information) + sizeof(ULONG);
|
|
Information = (KEY_VALUE_PARTIAL_INFORMATION*)ExAllocatePool(PagedPool, InformationSize);
|
|
if (Information == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
Status = ZwQueryValueKey(KeyHandle,
|
|
&UnicodeValueName,
|
|
KeyValuePartialInformation,
|
|
Information,
|
|
sizeof(Information),
|
|
&InformationSize);
|
|
if (Status == STATUS_SUCCESS)
|
|
{
|
|
if (Information->Type == REG_DWORD && Information->DataLength == sizeof(ULONG))
|
|
{
|
|
RtlCopyMemory(Value, Information->Data, sizeof(ULONG));
|
|
ReturnValue = 1;
|
|
}
|
|
}
|
|
|
|
ExFreePool(Information);
|
|
ZwClose(KeyHandle);
|
|
|
|
return ReturnValue;
|
|
}
|
|
|
|
ULONG GetTheCurrentTime()
|
|
{
|
|
LARGE_INTEGER Time;
|
|
|
|
KeQuerySystemTime(&Time);
|
|
|
|
return (ULONG)(Time.QuadPart / (10 * 1000));
|
|
}
|
|
|
|
void DebugInit(void)
|
|
{
|
|
}
|
|
|
|
void DebugTrace(int iDebugLevel, LPSTR pstrFormat, ...)
|
|
{
|
|
}
|