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.
3895 lines
92 KiB
3895 lines
92 KiB
/*++
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
vfzwapi.c
|
|
|
|
Abstract:
|
|
|
|
Zw interfaces verifier.
|
|
|
|
Author:
|
|
|
|
Silviu Calinoiu (silviuc) 23-Jul-2002
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "vfdef.h"
|
|
#include "zwapi.h"
|
|
#include "vfzwapi.h"
|
|
|
|
VOID
|
|
VfZwCheckAddress (
|
|
PVOID Address,
|
|
PVOID Caller
|
|
);
|
|
|
|
VOID
|
|
VfZwCheckHandle (
|
|
PVOID Handle,
|
|
PVOID Caller
|
|
);
|
|
|
|
VOID
|
|
VfZwCheckObjectAttributes (
|
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
|
PVOID Caller
|
|
);
|
|
|
|
VOID
|
|
VfZwCheckUnicodeString (
|
|
PUNICODE_STRING String,
|
|
PVOID Caller
|
|
);
|
|
|
|
LOGICAL
|
|
VfZwShouldCheck (
|
|
PVOID Caller
|
|
);
|
|
|
|
VOID
|
|
VfZwReportIssue (
|
|
ULONG IssueType,
|
|
PVOID Information,
|
|
PVOID Caller
|
|
);
|
|
|
|
LOGICAL
|
|
VfZwShouldReportIssue (
|
|
PVOID Caller
|
|
);
|
|
|
|
LOGICAL
|
|
VfZwShouldSimulateDecommitAttack (
|
|
VOID
|
|
);
|
|
|
|
ULONG
|
|
VfZwExceptionFilter (
|
|
PVOID ExceptionInfo
|
|
);
|
|
|
|
VOID
|
|
VfZwReportUserModeVirtualSpaceOperation (
|
|
PVOID Caller
|
|
);
|
|
|
|
#define VF_ZW_CHECK_ADDRESS(Address) try {VfZwCheckAddress(Address, Caller);}except(VfZwExceptionFilter(_exception_info())){}
|
|
#define VF_ZW_CHECK_HANDLE(Handle) try {VfZwCheckHandle(Handle, Caller);}except(VfZwExceptionFilter(_exception_info())){}
|
|
#define VF_ZW_CHECK_OBJECT_ATTRIBUTES(A) try {VfZwCheckObjectAttributes(A, Caller);}except(VfZwExceptionFilter(_exception_info())){}
|
|
#define VF_ZW_CHECK_UNICODE_STRING(S) try {VfZwCheckUnicodeString(S, Caller);}except(VfZwExceptionFilter(_exception_info())){}
|
|
|
|
//
|
|
// Put all verifier globals into the verifier data section so
|
|
// that it can be paged out whenever verifier is not enabled.
|
|
// Note that this declaration affects all global declarations
|
|
// within the module since there is no `data_seg()' counterpart.
|
|
//
|
|
|
|
#ifdef ALLOC_DATA_PRAGMA
|
|
#pragma data_seg("PAGEVRFD")
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
|
|
#pragma alloc_text(PAGEVRFY, VfZwShouldCheck)
|
|
#pragma alloc_text(PAGEVRFY, VfZwReportIssue)
|
|
#pragma alloc_text(PAGEVRFY, VfZwShouldReportIssue)
|
|
#pragma alloc_text(PAGEVRFY, VfZwExceptionFilter)
|
|
#pragma alloc_text(PAGEVRFY, VfZwReportUserModeVirtualSpaceOperation)
|
|
#pragma alloc_text(PAGEVRFY, VfZwShouldSimulateDecommitAttack)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCheckAddress)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCheckHandle)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCheckObjectAttributes)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCheckUnicodeString)
|
|
|
|
#pragma alloc_text(PAGEVRFY, VfZwAccessCheckAndAuditAlarm)
|
|
#pragma alloc_text(PAGEVRFY, VfZwAddBootEntry)
|
|
#pragma alloc_text(PAGEVRFY, VfZwAddDriverEntry)
|
|
#pragma alloc_text(PAGEVRFY, VfZwAdjustPrivilegesToken)
|
|
#pragma alloc_text(PAGEVRFY, VfZwAlertThread)
|
|
#pragma alloc_text(PAGEVRFY, VfZwAllocateVirtualMemory)
|
|
#pragma alloc_text(PAGEVRFY, VfZwAssignProcessToJobObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCancelIoFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCancelTimer)
|
|
#pragma alloc_text(PAGEVRFY, VfZwClearEvent)
|
|
#pragma alloc_text(PAGEVRFY, VfZwClose)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCloseObjectAuditAlarm)
|
|
#pragma alloc_text(PAGEVRFY, VfZwConnectPort)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCreateDirectoryObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCreateEvent)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCreateFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCreateJobObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCreateKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCreateSection)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCreateSymbolicLinkObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwCreateTimer)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDeleteBootEntry)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDeleteDriverEntry)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDeleteFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDeleteKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDeleteValueKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDeviceIoControlFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDisplayString)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDuplicateObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwDuplicateToken)
|
|
#pragma alloc_text(PAGEVRFY, VfZwEnumerateBootEntries)
|
|
#pragma alloc_text(PAGEVRFY, VfZwEnumerateDriverEntries)
|
|
#pragma alloc_text(PAGEVRFY, VfZwEnumerateKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwEnumerateValueKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwFlushInstructionCache)
|
|
#pragma alloc_text(PAGEVRFY, VfZwFlushKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwFlushVirtualMemory)
|
|
#pragma alloc_text(PAGEVRFY, VfZwFreeVirtualMemory)
|
|
#pragma alloc_text(PAGEVRFY, VfZwFsControlFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwInitiatePowerAction)
|
|
#pragma alloc_text(PAGEVRFY, VfZwIsProcessInJob)
|
|
#pragma alloc_text(PAGEVRFY, VfZwLoadDriver)
|
|
#pragma alloc_text(PAGEVRFY, VfZwLoadKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwMakeTemporaryObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwMapViewOfSection)
|
|
#pragma alloc_text(PAGEVRFY, VfZwModifyBootEntry)
|
|
#pragma alloc_text(PAGEVRFY, VfZwModifyDriverEntry)
|
|
#pragma alloc_text(PAGEVRFY, VfZwNotifyChangeKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenDirectoryObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenEvent)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenJobObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenProcess)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenProcessToken)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenProcessTokenEx)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenSection)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenSymbolicLinkObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenThread)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenThreadToken)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenThreadTokenEx)
|
|
#pragma alloc_text(PAGEVRFY, VfZwOpenTimer)
|
|
#pragma alloc_text(PAGEVRFY, VfZwPowerInformation)
|
|
#pragma alloc_text(PAGEVRFY, VfZwPulseEvent)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryBootEntryOrder)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryBootOptions)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryDefaultLocale)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryDefaultUILanguage)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryDriverEntryOrder)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryInstallUILanguage)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryDirectoryFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryDirectoryObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryEaFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryFullAttributesFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryInformationFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryInformationJobObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryInformationProcess)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryInformationThread)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryInformationToken)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryInformationToken)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQuerySection)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQuerySecurityObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQuerySymbolicLinkObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQuerySystemInformation)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryValueKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwQueryVolumeInformationFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwReadFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwReplaceKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwRequestWaitReplyPort)
|
|
#pragma alloc_text(PAGEVRFY, VfZwResetEvent)
|
|
#pragma alloc_text(PAGEVRFY, VfZwRestoreKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSaveKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSaveKeyEx)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetBootEntryOrder)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetBootOptions)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetDefaultLocale)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetDefaultUILanguage)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetDriverEntryOrder)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetEaFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetEvent)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetInformationFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetInformationJobObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetInformationObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetInformationProcess)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetInformationThread)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetSecurityObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetSystemInformation)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetSystemTime)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetTimer)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetValueKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwSetVolumeInformationFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwTerminateJobObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwTerminateProcess)
|
|
#pragma alloc_text(PAGEVRFY, VfZwTranslateFilePath)
|
|
#pragma alloc_text(PAGEVRFY, VfZwUnloadDriver)
|
|
#pragma alloc_text(PAGEVRFY, VfZwUnloadKey)
|
|
#pragma alloc_text(PAGEVRFY, VfZwUnmapViewOfSection)
|
|
#pragma alloc_text(PAGEVRFY, VfZwWaitForMultipleObjects)
|
|
#pragma alloc_text(PAGEVRFY, VfZwWaitForSingleObject)
|
|
#pragma alloc_text(PAGEVRFY, VfZwWriteFile)
|
|
#pragma alloc_text(PAGEVRFY, VfZwYieldExecution)
|
|
|
|
#endif
|
|
/////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwAccessCheckAndAuditAlarm (
|
|
IN PUNICODE_STRING SubsystemName,
|
|
IN PVOID HandleId,
|
|
IN PUNICODE_STRING ObjectTypeName,
|
|
IN PUNICODE_STRING ObjectName,
|
|
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN PGENERIC_MAPPING GenericMapping,
|
|
IN BOOLEAN ObjectCreation,
|
|
OUT PACCESS_MASK GrantedAccess,
|
|
OUT PNTSTATUS AccessStatus,
|
|
OUT PBOOLEAN GenerateOnClose
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_UNICODE_STRING (SubsystemName);
|
|
VF_ZW_CHECK_UNICODE_STRING (ObjectTypeName);
|
|
VF_ZW_CHECK_UNICODE_STRING (ObjectName);
|
|
VF_ZW_CHECK_ADDRESS (SecurityDescriptor);
|
|
VF_ZW_CHECK_ADDRESS (GenericMapping);
|
|
VF_ZW_CHECK_ADDRESS (GrantedAccess);
|
|
VF_ZW_CHECK_ADDRESS (GenerateOnClose);
|
|
}
|
|
|
|
Status = ZwAccessCheckAndAuditAlarm (SubsystemName,
|
|
HandleId,
|
|
ObjectTypeName,
|
|
ObjectName,
|
|
SecurityDescriptor,
|
|
DesiredAccess,
|
|
GenericMapping,
|
|
ObjectCreation,
|
|
GrantedAccess,
|
|
AccessStatus,
|
|
GenerateOnClose);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwAddBootEntry (
|
|
IN PBOOT_ENTRY BootEntry,
|
|
OUT PULONG Id OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (BootEntry);
|
|
VF_ZW_CHECK_ADDRESS (Id);
|
|
}
|
|
|
|
Status = ZwAddBootEntry (BootEntry,
|
|
Id);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwAddDriverEntry (
|
|
IN PEFI_DRIVER_ENTRY DriverEntry,
|
|
OUT PULONG Id OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (DriverEntry);
|
|
VF_ZW_CHECK_ADDRESS (Id);
|
|
}
|
|
|
|
Status = ZwAddDriverEntry (DriverEntry,
|
|
Id);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwAdjustPrivilegesToken (
|
|
IN HANDLE TokenHandle,
|
|
IN BOOLEAN DisableAllPrivileges,
|
|
IN PTOKEN_PRIVILEGES NewState OPTIONAL,
|
|
IN ULONG BufferLength OPTIONAL,
|
|
OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL,
|
|
OUT PULONG ReturnLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (TokenHandle);
|
|
VF_ZW_CHECK_ADDRESS (NewState);
|
|
VF_ZW_CHECK_ADDRESS (PreviousState);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwAdjustPrivilegesToken (TokenHandle,
|
|
DisableAllPrivileges,
|
|
NewState OPTIONAL,
|
|
BufferLength OPTIONAL,
|
|
PreviousState OPTIONAL,
|
|
ReturnLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwAlertThread(
|
|
IN HANDLE ThreadHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ThreadHandle);
|
|
}
|
|
|
|
Status = ZwAlertThread (ThreadHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwAllocateVirtualMemory(
|
|
IN HANDLE ProcessHandle,
|
|
IN OUT PVOID *BaseAddress,
|
|
IN ULONG_PTR ZeroBits,
|
|
IN OUT PSIZE_T RegionSize,
|
|
IN ULONG AllocationType,
|
|
IN ULONG Protect
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (BaseAddress);
|
|
VF_ZW_CHECK_ADDRESS (RegionSize);
|
|
|
|
VfZwReportUserModeVirtualSpaceOperation (Caller);
|
|
|
|
if (VfZwShouldSimulateDecommitAttack() &&
|
|
Protect == PAGE_READWRITE) {
|
|
|
|
DbgPrint ("DVRF:ZW: simulating decommit attack for caller %p \n", Caller);
|
|
Protect = PAGE_READONLY;
|
|
}
|
|
}
|
|
|
|
Status = ZwAllocateVirtualMemory (ProcessHandle,
|
|
BaseAddress,
|
|
ZeroBits,
|
|
RegionSize,
|
|
AllocationType,
|
|
Protect);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwAssignProcessToJobObject(
|
|
IN HANDLE JobHandle,
|
|
IN HANDLE ProcessHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (JobHandle);
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
}
|
|
|
|
Status = ZwAssignProcessToJobObject (JobHandle,
|
|
ProcessHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCancelIoFile(
|
|
IN HANDLE FileHandle,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
}
|
|
|
|
Status = ZwCancelIoFile (FileHandle,
|
|
IoStatusBlock);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCancelTimer (
|
|
IN HANDLE TimerHandle,
|
|
OUT PBOOLEAN CurrentState OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (TimerHandle);
|
|
VF_ZW_CHECK_ADDRESS (CurrentState);
|
|
}
|
|
|
|
Status = ZwCancelTimer (TimerHandle,
|
|
CurrentState);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwClearEvent (
|
|
IN HANDLE EventHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (EventHandle);
|
|
}
|
|
|
|
Status = ZwClearEvent (EventHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwClose(
|
|
IN HANDLE Handle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (Handle);
|
|
}
|
|
|
|
Status = ZwClose (Handle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCloseObjectAuditAlarm (
|
|
IN PUNICODE_STRING SubsystemName,
|
|
IN PVOID HandleId,
|
|
IN BOOLEAN GenerateOnClose
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_UNICODE_STRING (SubsystemName);
|
|
}
|
|
|
|
Status = ZwCloseObjectAuditAlarm (SubsystemName,
|
|
HandleId,
|
|
GenerateOnClose);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwConnectPort(
|
|
OUT PHANDLE PortHandle,
|
|
IN PUNICODE_STRING PortName,
|
|
IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
|
|
IN OUT PPORT_VIEW ClientView OPTIONAL,
|
|
IN OUT PREMOTE_PORT_VIEW ServerView OPTIONAL,
|
|
OUT PULONG MaxMessageLength OPTIONAL,
|
|
IN OUT PVOID ConnectionInformation OPTIONAL,
|
|
IN OUT PULONG ConnectionInformationLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (PortHandle);
|
|
VF_ZW_CHECK_UNICODE_STRING (PortName);
|
|
VF_ZW_CHECK_ADDRESS (SecurityQos);
|
|
VF_ZW_CHECK_ADDRESS (ClientView);
|
|
VF_ZW_CHECK_ADDRESS (ServerView);
|
|
VF_ZW_CHECK_ADDRESS (MaxMessageLength);
|
|
VF_ZW_CHECK_ADDRESS (ConnectionInformation);
|
|
VF_ZW_CHECK_ADDRESS (ConnectionInformationLength);
|
|
}
|
|
|
|
Status = ZwConnectPort(PortHandle,
|
|
PortName,
|
|
SecurityQos,
|
|
ClientView OPTIONAL,
|
|
ServerView OPTIONAL,
|
|
MaxMessageLength OPTIONAL,
|
|
ConnectionInformation OPTIONAL,
|
|
ConnectionInformationLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCreateDirectoryObject(
|
|
OUT PHANDLE DirectoryHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (DirectoryHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwCreateDirectoryObject(DirectoryHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCreateEvent (
|
|
OUT PHANDLE EventHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
IN EVENT_TYPE EventType,
|
|
IN BOOLEAN InitialState
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (EventHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwCreateEvent(EventHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
EventType,
|
|
InitialState);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCreateFile(
|
|
OUT PHANDLE FileHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN PLARGE_INTEGER AllocationSize OPTIONAL,
|
|
IN ULONG FileAttributes,
|
|
IN ULONG ShareAccess,
|
|
IN ULONG CreateDisposition,
|
|
IN ULONG CreateOptions,
|
|
IN PVOID EaBuffer OPTIONAL,
|
|
IN ULONG EaLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (FileHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (AllocationSize);
|
|
VF_ZW_CHECK_ADDRESS (EaBuffer);
|
|
}
|
|
|
|
Status = ZwCreateFile(FileHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
IoStatusBlock,
|
|
AllocationSize OPTIONAL,
|
|
FileAttributes,
|
|
ShareAccess,
|
|
CreateDisposition,
|
|
CreateOptions,
|
|
EaBuffer OPTIONAL,
|
|
EaLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCreateJobObject (
|
|
OUT PHANDLE JobHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (JobHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwCreateJobObject (JobHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCreateKey(
|
|
OUT PHANDLE KeyHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
IN ULONG TitleIndex,
|
|
IN PUNICODE_STRING Class OPTIONAL,
|
|
IN ULONG CreateOptions,
|
|
OUT PULONG Disposition OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (KeyHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_UNICODE_STRING (Class);
|
|
VF_ZW_CHECK_ADDRESS (Disposition);
|
|
}
|
|
|
|
Status = ZwCreateKey(KeyHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
TitleIndex,
|
|
Class OPTIONAL,
|
|
CreateOptions,
|
|
Disposition OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCreateSection (
|
|
OUT PHANDLE SectionHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
IN PLARGE_INTEGER MaximumSize OPTIONAL,
|
|
IN ULONG SectionPageProtection,
|
|
IN ULONG AllocationAttributes,
|
|
IN HANDLE FileHandle OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (SectionHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_ADDRESS (MaximumSize);
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
}
|
|
|
|
Status = ZwCreateSection (SectionHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes OPTIONAL,
|
|
MaximumSize OPTIONAL,
|
|
SectionPageProtection,
|
|
AllocationAttributes,
|
|
FileHandle OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCreateSymbolicLinkObject(
|
|
OUT PHANDLE LinkHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
IN PUNICODE_STRING LinkTarget
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (LinkHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_UNICODE_STRING (LinkTarget);
|
|
}
|
|
|
|
Status = ZwCreateSymbolicLinkObject(LinkHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
LinkTarget);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwCreateTimer (
|
|
OUT PHANDLE TimerHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
IN TIMER_TYPE TimerType
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (TimerHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwCreateTimer(TimerHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
TimerType);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDeleteBootEntry (
|
|
IN ULONG Id
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (NULL);
|
|
}
|
|
|
|
Status = ZwDeleteBootEntry(Id);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDeleteDriverEntry (
|
|
IN ULONG Id
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (NULL);
|
|
}
|
|
|
|
Status = ZwDeleteDriverEntry(Id);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDeleteFile(
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwDeleteFile(ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDeleteKey(
|
|
IN HANDLE KeyHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
}
|
|
|
|
Status = ZwDeleteKey(KeyHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDeleteValueKey(
|
|
IN HANDLE KeyHandle,
|
|
IN PUNICODE_STRING ValueName
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_UNICODE_STRING (ValueName);
|
|
}
|
|
|
|
Status = ZwDeleteValueKey(KeyHandle,
|
|
ValueName);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDeviceIoControlFile(
|
|
IN HANDLE FileHandle,
|
|
IN HANDLE Event OPTIONAL,
|
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
|
IN PVOID ApcContext OPTIONAL,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN ULONG IoControlCode,
|
|
IN PVOID InputBuffer OPTIONAL,
|
|
IN ULONG InputBufferLength,
|
|
OUT PVOID OutputBuffer OPTIONAL,
|
|
IN ULONG OutputBufferLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_HANDLE (Event);
|
|
VF_ZW_CHECK_ADDRESS ((PVOID)ApcRoutine);
|
|
VF_ZW_CHECK_ADDRESS (ApcContext);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (InputBuffer);
|
|
VF_ZW_CHECK_ADDRESS (OutputBuffer);
|
|
}
|
|
|
|
Status = ZwDeviceIoControlFile(FileHandle,
|
|
Event OPTIONAL,
|
|
ApcRoutine OPTIONAL,
|
|
ApcContext OPTIONAL,
|
|
IoStatusBlock,
|
|
IoControlCode,
|
|
InputBuffer OPTIONAL,
|
|
InputBufferLength,
|
|
OutputBuffer OPTIONAL,
|
|
OutputBufferLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDisplayString(
|
|
IN PUNICODE_STRING String
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_UNICODE_STRING (String);
|
|
}
|
|
|
|
Status = ZwDisplayString(String);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDuplicateObject(
|
|
IN HANDLE SourceProcessHandle,
|
|
IN HANDLE SourceHandle,
|
|
IN HANDLE TargetProcessHandle OPTIONAL,
|
|
OUT PHANDLE TargetHandle OPTIONAL,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN ULONG HandleAttributes,
|
|
IN ULONG Options
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (SourceProcessHandle);
|
|
VF_ZW_CHECK_HANDLE (SourceHandle);
|
|
VF_ZW_CHECK_HANDLE (TargetProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (TargetHandle);
|
|
}
|
|
|
|
Status = ZwDuplicateObject(SourceProcessHandle,
|
|
SourceHandle,
|
|
TargetProcessHandle OPTIONAL,
|
|
TargetHandle OPTIONAL,
|
|
DesiredAccess,
|
|
HandleAttributes,
|
|
Options);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwDuplicateToken(
|
|
IN HANDLE ExistingTokenHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
IN BOOLEAN EffectiveOnly,
|
|
IN TOKEN_TYPE TokenType,
|
|
OUT PHANDLE NewTokenHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ExistingTokenHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_ADDRESS (NewTokenHandle);
|
|
}
|
|
|
|
Status = ZwDuplicateToken (ExistingTokenHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
EffectiveOnly,
|
|
TokenType,
|
|
NewTokenHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwEnumerateBootEntries (
|
|
OUT PVOID Buffer,
|
|
IN OUT PULONG BufferLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (Buffer);
|
|
VF_ZW_CHECK_ADDRESS (BufferLength);
|
|
}
|
|
|
|
Status = ZwEnumerateBootEntries (Buffer,
|
|
BufferLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwEnumerateDriverEntries (
|
|
OUT PVOID Buffer,
|
|
IN OUT PULONG BufferLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (Buffer);
|
|
VF_ZW_CHECK_ADDRESS (BufferLength);
|
|
}
|
|
|
|
Status = ZwEnumerateDriverEntries (Buffer,
|
|
BufferLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwEnumerateKey(
|
|
IN HANDLE KeyHandle,
|
|
IN ULONG Index,
|
|
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
|
OUT PVOID KeyInformation,
|
|
IN ULONG Length,
|
|
OUT PULONG ResultLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_ADDRESS (KeyInformation);
|
|
VF_ZW_CHECK_ADDRESS (ResultLength);
|
|
}
|
|
|
|
Status = ZwEnumerateKey(KeyHandle,
|
|
Index,
|
|
KeyInformationClass,
|
|
KeyInformation,
|
|
Length,
|
|
ResultLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwEnumerateValueKey(
|
|
IN HANDLE KeyHandle,
|
|
IN ULONG Index,
|
|
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
|
|
OUT PVOID KeyValueInformation,
|
|
IN ULONG Length,
|
|
OUT PULONG ResultLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_ADDRESS (KeyValueInformation);
|
|
VF_ZW_CHECK_ADDRESS (ResultLength);
|
|
}
|
|
|
|
Status = ZwEnumerateValueKey(KeyHandle,
|
|
Index,
|
|
KeyValueInformationClass,
|
|
KeyValueInformation,
|
|
Length,
|
|
ResultLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwFlushInstructionCache (
|
|
IN HANDLE ProcessHandle,
|
|
IN PVOID BaseAddress OPTIONAL,
|
|
IN SIZE_T Length
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (BaseAddress);
|
|
}
|
|
|
|
Status = ZwFlushInstructionCache (ProcessHandle,
|
|
BaseAddress OPTIONAL,
|
|
Length);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwFlushKey(
|
|
IN HANDLE KeyHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
}
|
|
|
|
Status = ZwFlushKey (KeyHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwFlushVirtualMemory(
|
|
IN HANDLE ProcessHandle,
|
|
IN OUT PVOID *BaseAddress,
|
|
IN OUT PSIZE_T RegionSize,
|
|
OUT PIO_STATUS_BLOCK IoStatus
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (BaseAddress);
|
|
VF_ZW_CHECK_ADDRESS (RegionSize);
|
|
VF_ZW_CHECK_ADDRESS (IoStatus);
|
|
}
|
|
|
|
Status = ZwFlushVirtualMemory(ProcessHandle,
|
|
BaseAddress,
|
|
RegionSize,
|
|
IoStatus);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwFreeVirtualMemory(
|
|
IN HANDLE ProcessHandle,
|
|
IN OUT PVOID *BaseAddress,
|
|
IN OUT PSIZE_T RegionSize,
|
|
IN ULONG FreeType
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (BaseAddress);
|
|
VF_ZW_CHECK_ADDRESS (RegionSize);
|
|
}
|
|
|
|
Status = ZwFreeVirtualMemory (ProcessHandle,
|
|
BaseAddress,
|
|
RegionSize,
|
|
FreeType);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwFsControlFile(
|
|
IN HANDLE FileHandle,
|
|
IN HANDLE Event OPTIONAL,
|
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
|
IN PVOID ApcContext OPTIONAL,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN ULONG FsControlCode,
|
|
IN PVOID InputBuffer OPTIONAL,
|
|
IN ULONG InputBufferLength,
|
|
OUT PVOID OutputBuffer OPTIONAL,
|
|
IN ULONG OutputBufferLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_HANDLE (Event);
|
|
VF_ZW_CHECK_ADDRESS ((PVOID)ApcRoutine);
|
|
VF_ZW_CHECK_ADDRESS (ApcContext);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (InputBuffer);
|
|
VF_ZW_CHECK_ADDRESS (OutputBuffer);
|
|
}
|
|
|
|
Status = ZwFsControlFile(FileHandle,
|
|
Event OPTIONAL,
|
|
ApcRoutine OPTIONAL,
|
|
ApcContext OPTIONAL,
|
|
IoStatusBlock,
|
|
FsControlCode,
|
|
InputBuffer OPTIONAL,
|
|
InputBufferLength,
|
|
OutputBuffer OPTIONAL,
|
|
OutputBufferLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwInitiatePowerAction(
|
|
IN POWER_ACTION SystemAction,
|
|
IN SYSTEM_POWER_STATE MinSystemState,
|
|
IN ULONG Flags, // POWER_ACTION_xxx flags
|
|
IN BOOLEAN Asynchronous
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
// no-op call to avoid warnings for `Caller' local.
|
|
VF_ZW_CHECK_ADDRESS (NULL);
|
|
}
|
|
|
|
Status = ZwInitiatePowerAction(SystemAction,
|
|
MinSystemState,
|
|
Flags, // POWER_ACTION_xxx flags
|
|
Asynchronous);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwIsProcessInJob (
|
|
IN HANDLE ProcessHandle,
|
|
IN HANDLE JobHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_HANDLE (JobHandle);
|
|
}
|
|
|
|
Status = ZwIsProcessInJob(ProcessHandle,
|
|
JobHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwLoadDriver(
|
|
IN PUNICODE_STRING DriverServiceName
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_UNICODE_STRING (DriverServiceName);
|
|
}
|
|
|
|
Status = ZwLoadDriver(DriverServiceName);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwLoadKey(
|
|
IN POBJECT_ATTRIBUTES TargetKey,
|
|
IN POBJECT_ATTRIBUTES SourceFile
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (TargetKey);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (SourceFile);
|
|
}
|
|
|
|
Status = ZwLoadKey(TargetKey,
|
|
SourceFile);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwMakeTemporaryObject(
|
|
IN HANDLE Handle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (Handle);
|
|
}
|
|
|
|
Status = ZwMakeTemporaryObject(Handle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwMapViewOfSection(
|
|
IN HANDLE SectionHandle,
|
|
IN HANDLE ProcessHandle,
|
|
IN OUT PVOID *BaseAddress,
|
|
IN ULONG_PTR ZeroBits,
|
|
IN SIZE_T CommitSize,
|
|
IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
|
|
IN OUT PSIZE_T ViewSize,
|
|
IN SECTION_INHERIT InheritDisposition,
|
|
IN ULONG AllocationType,
|
|
IN ULONG Protect
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (SectionHandle);
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (BaseAddress);
|
|
VF_ZW_CHECK_ADDRESS (SectionOffset);
|
|
VF_ZW_CHECK_ADDRESS (ViewSize);
|
|
|
|
VfZwReportUserModeVirtualSpaceOperation (Caller);
|
|
|
|
if (VfZwShouldSimulateDecommitAttack() &&
|
|
Protect == PAGE_READWRITE) {
|
|
|
|
DbgPrint ("DVRF:ZW: simulating unmap attack for caller %p \n", Caller);
|
|
Protect = PAGE_READONLY;
|
|
}
|
|
}
|
|
|
|
Status = ZwMapViewOfSection(SectionHandle,
|
|
ProcessHandle,
|
|
BaseAddress,
|
|
ZeroBits,
|
|
CommitSize,
|
|
SectionOffset OPTIONAL,
|
|
ViewSize,
|
|
InheritDisposition,
|
|
AllocationType,
|
|
Protect);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwModifyBootEntry (
|
|
IN PBOOT_ENTRY BootEntry
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (BootEntry);
|
|
}
|
|
|
|
Status = ZwModifyBootEntry (BootEntry);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwModifyDriverEntry (
|
|
IN PEFI_DRIVER_ENTRY DriverEntry
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (DriverEntry);
|
|
}
|
|
|
|
Status = ZwModifyDriverEntry (DriverEntry);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwNotifyChangeKey(
|
|
IN HANDLE KeyHandle,
|
|
IN HANDLE Event OPTIONAL,
|
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
|
IN PVOID ApcContext OPTIONAL,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN ULONG CompletionFilter,
|
|
IN BOOLEAN WatchTree,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
IN BOOLEAN Asynchronous
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_HANDLE (Event);
|
|
VF_ZW_CHECK_ADDRESS ((PVOID)ApcRoutine);
|
|
VF_ZW_CHECK_ADDRESS (ApcContext);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (Buffer);
|
|
}
|
|
|
|
Status = ZwNotifyChangeKey(KeyHandle,
|
|
Event OPTIONAL,
|
|
ApcRoutine OPTIONAL,
|
|
ApcContext OPTIONAL,
|
|
IoStatusBlock,
|
|
CompletionFilter,
|
|
WatchTree,
|
|
Buffer,
|
|
BufferSize,
|
|
Asynchronous);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenDirectoryObject(
|
|
OUT PHANDLE DirectoryHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (DirectoryHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwOpenDirectoryObject(DirectoryHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenEvent (
|
|
OUT PHANDLE EventHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (EventHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwOpenEvent(EventHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenFile(
|
|
OUT PHANDLE FileHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN ULONG ShareAccess,
|
|
IN ULONG OpenOptions
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (FileHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
}
|
|
|
|
Status = ZwOpenFile(FileHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
IoStatusBlock,
|
|
ShareAccess,
|
|
OpenOptions);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenJobObject(
|
|
OUT PHANDLE JobHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (JobHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwOpenJobObject(JobHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenKey(
|
|
OUT PHANDLE KeyHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (KeyHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwOpenKey(KeyHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenProcess (
|
|
OUT PHANDLE ProcessHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
IN PCLIENT_ID ClientId OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (ProcessHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_ADDRESS (ClientId);
|
|
}
|
|
|
|
Status = ZwOpenProcess (ProcessHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
ClientId OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenProcessToken(
|
|
IN HANDLE ProcessHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
OUT PHANDLE TokenHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (TokenHandle);
|
|
}
|
|
|
|
Status = ZwOpenProcessToken(ProcessHandle,
|
|
DesiredAccess,
|
|
TokenHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenProcessTokenEx(
|
|
IN HANDLE ProcessHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN ULONG HandleAttributes,
|
|
OUT PHANDLE TokenHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (TokenHandle);
|
|
}
|
|
|
|
Status = ZwOpenProcessTokenEx(ProcessHandle,
|
|
DesiredAccess,
|
|
HandleAttributes,
|
|
TokenHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenSection(
|
|
OUT PHANDLE SectionHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (SectionHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwOpenSection(SectionHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenSymbolicLinkObject(
|
|
OUT PHANDLE LinkHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (LinkHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwOpenSymbolicLinkObject(LinkHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenThread (
|
|
OUT PHANDLE ThreadHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
IN PCLIENT_ID ClientId OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (ThreadHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_ADDRESS (ClientId);
|
|
}
|
|
|
|
Status = ZwOpenThread (ThreadHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
ClientId OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenThreadToken(
|
|
IN HANDLE ThreadHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN BOOLEAN OpenAsSelf,
|
|
OUT PHANDLE TokenHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ThreadHandle);
|
|
VF_ZW_CHECK_ADDRESS (TokenHandle);
|
|
}
|
|
|
|
Status = ZwOpenThreadToken(ThreadHandle,
|
|
DesiredAccess,
|
|
OpenAsSelf,
|
|
TokenHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenThreadTokenEx(
|
|
IN HANDLE ThreadHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN BOOLEAN OpenAsSelf,
|
|
IN ULONG HandleAttributes,
|
|
OUT PHANDLE TokenHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ThreadHandle);
|
|
VF_ZW_CHECK_ADDRESS (TokenHandle);
|
|
}
|
|
|
|
Status = ZwOpenThreadTokenEx(ThreadHandle,
|
|
DesiredAccess,
|
|
OpenAsSelf,
|
|
HandleAttributes,
|
|
TokenHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwOpenTimer (
|
|
OUT PHANDLE TimerHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (TimerHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
}
|
|
|
|
Status = ZwOpenTimer (TimerHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwPowerInformation(
|
|
IN POWER_INFORMATION_LEVEL InformationLevel,
|
|
IN PVOID InputBuffer OPTIONAL,
|
|
IN ULONG InputBufferLength,
|
|
OUT PVOID OutputBuffer OPTIONAL,
|
|
IN ULONG OutputBufferLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (InputBuffer);
|
|
VF_ZW_CHECK_ADDRESS (OutputBuffer);
|
|
}
|
|
|
|
Status = ZwPowerInformation(InformationLevel,
|
|
InputBuffer OPTIONAL,
|
|
InputBufferLength,
|
|
OutputBuffer OPTIONAL,
|
|
OutputBufferLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwPulseEvent (
|
|
IN HANDLE EventHandle,
|
|
OUT PLONG PreviousState OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (EventHandle);
|
|
VF_ZW_CHECK_ADDRESS (PreviousState);
|
|
}
|
|
|
|
Status = ZwPulseEvent (EventHandle,
|
|
PreviousState OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryBootEntryOrder (
|
|
OUT PULONG Ids,
|
|
IN OUT PULONG Count
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (Ids);
|
|
VF_ZW_CHECK_ADDRESS (Count);
|
|
}
|
|
|
|
Status = ZwQueryBootEntryOrder(Ids,
|
|
Count);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryBootOptions (
|
|
OUT PBOOT_OPTIONS BootOptions,
|
|
IN OUT PULONG BootOptionsLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (BootOptions);
|
|
VF_ZW_CHECK_ADDRESS (BootOptionsLength);
|
|
}
|
|
|
|
Status = ZwQueryBootOptions (BootOptions,
|
|
BootOptionsLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryDefaultLocale(
|
|
IN BOOLEAN UserProfile,
|
|
OUT PLCID DefaultLocaleId
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (DefaultLocaleId);
|
|
}
|
|
|
|
Status = ZwQueryDefaultLocale(UserProfile,
|
|
DefaultLocaleId);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryDefaultUILanguage(
|
|
OUT LANGID *DefaultUILanguageId
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (DefaultUILanguageId);
|
|
}
|
|
|
|
Status = ZwQueryDefaultUILanguage(DefaultUILanguageId);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryDirectoryFile(
|
|
IN HANDLE FileHandle,
|
|
IN HANDLE Event OPTIONAL,
|
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
|
IN PVOID ApcContext OPTIONAL,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
OUT PVOID FileInformation,
|
|
IN ULONG Length,
|
|
IN FILE_INFORMATION_CLASS FileInformationClass,
|
|
IN BOOLEAN ReturnSingleEntry,
|
|
IN PUNICODE_STRING FileName OPTIONAL,
|
|
IN BOOLEAN RestartScan
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_HANDLE (Event);
|
|
VF_ZW_CHECK_ADDRESS ((PVOID)ApcRoutine);
|
|
VF_ZW_CHECK_ADDRESS (ApcContext);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (FileInformation);
|
|
VF_ZW_CHECK_UNICODE_STRING (FileName);
|
|
}
|
|
|
|
Status = ZwQueryDirectoryFile(FileHandle,
|
|
Event OPTIONAL,
|
|
ApcRoutine OPTIONAL,
|
|
ApcContext OPTIONAL,
|
|
IoStatusBlock,
|
|
FileInformation,
|
|
Length,
|
|
FileInformationClass,
|
|
ReturnSingleEntry,
|
|
FileName OPTIONAL,
|
|
RestartScan);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryDirectoryObject(
|
|
IN HANDLE DirectoryHandle,
|
|
OUT PVOID Buffer,
|
|
IN ULONG Length,
|
|
IN BOOLEAN ReturnSingleEntry,
|
|
IN BOOLEAN RestartScan,
|
|
IN OUT PULONG Context,
|
|
OUT PULONG ReturnLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (DirectoryHandle);
|
|
VF_ZW_CHECK_ADDRESS (Buffer);
|
|
VF_ZW_CHECK_ADDRESS (Context);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwQueryDirectoryObject(DirectoryHandle,
|
|
Buffer,
|
|
Length,
|
|
ReturnSingleEntry,
|
|
RestartScan,
|
|
Context,
|
|
ReturnLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryDriverEntryOrder (
|
|
OUT PULONG Ids,
|
|
IN OUT PULONG Count
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (Ids);
|
|
VF_ZW_CHECK_ADDRESS (Count);
|
|
}
|
|
|
|
Status = ZwQueryDriverEntryOrder (Ids,
|
|
Count);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryEaFile(
|
|
IN HANDLE FileHandle,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
OUT PVOID Buffer,
|
|
IN ULONG Length,
|
|
IN BOOLEAN ReturnSingleEntry,
|
|
IN PVOID EaList OPTIONAL,
|
|
IN ULONG EaListLength,
|
|
IN PULONG EaIndex OPTIONAL,
|
|
IN BOOLEAN RestartScan
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (Buffer);
|
|
VF_ZW_CHECK_ADDRESS (EaList);
|
|
VF_ZW_CHECK_ADDRESS (EaIndex);
|
|
}
|
|
|
|
Status = ZwQueryEaFile(FileHandle,
|
|
IoStatusBlock,
|
|
Buffer,
|
|
Length,
|
|
ReturnSingleEntry,
|
|
EaList OPTIONAL,
|
|
EaListLength,
|
|
EaIndex OPTIONAL,
|
|
RestartScan);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryFullAttributesFile(
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (ObjectAttributes);
|
|
VF_ZW_CHECK_ADDRESS (FileInformation);
|
|
}
|
|
|
|
Status = ZwQueryFullAttributesFile(ObjectAttributes,
|
|
FileInformation);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryInformationFile(
|
|
IN HANDLE FileHandle,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
OUT PVOID FileInformation,
|
|
IN ULONG Length,
|
|
IN FILE_INFORMATION_CLASS FileInformationClass
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (FileInformation);
|
|
}
|
|
|
|
Status = ZwQueryInformationFile(FileHandle,
|
|
IoStatusBlock,
|
|
FileInformation,
|
|
Length,
|
|
FileInformationClass);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryInformationJobObject(
|
|
IN HANDLE JobHandle,
|
|
IN JOBOBJECTINFOCLASS JobObjectInformationClass,
|
|
OUT PVOID JobObjectInformation,
|
|
IN ULONG JobObjectInformationLength,
|
|
OUT PULONG ReturnLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (JobHandle);
|
|
VF_ZW_CHECK_ADDRESS (JobObjectInformation);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwQueryInformationJobObject(JobHandle,
|
|
JobObjectInformationClass,
|
|
JobObjectInformation,
|
|
JobObjectInformationLength,
|
|
ReturnLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryInformationProcess(
|
|
IN HANDLE ProcessHandle,
|
|
IN PROCESSINFOCLASS ProcessInformationClass,
|
|
OUT PVOID ProcessInformation,
|
|
IN ULONG ProcessInformationLength,
|
|
OUT PULONG ReturnLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (ProcessInformation);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwQueryInformationProcess(ProcessHandle,
|
|
ProcessInformationClass,
|
|
ProcessInformation,
|
|
ProcessInformationLength,
|
|
ReturnLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryInformationThread(
|
|
IN HANDLE ThreadHandle,
|
|
IN THREADINFOCLASS ThreadInformationClass,
|
|
OUT PVOID ThreadInformation,
|
|
IN ULONG ThreadInformationLength,
|
|
OUT PULONG ReturnLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ThreadHandle);
|
|
VF_ZW_CHECK_ADDRESS (ThreadInformation);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwQueryInformationThread(ThreadHandle,
|
|
ThreadInformationClass,
|
|
ThreadInformation,
|
|
ThreadInformationLength,
|
|
ReturnLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryInformationToken (
|
|
IN HANDLE TokenHandle,
|
|
IN TOKEN_INFORMATION_CLASS TokenInformationClass,
|
|
OUT PVOID TokenInformation,
|
|
IN ULONG TokenInformationLength,
|
|
OUT PULONG ReturnLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (TokenHandle);
|
|
VF_ZW_CHECK_ADDRESS (TokenInformation);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwQueryInformationToken (TokenHandle,
|
|
TokenInformationClass,
|
|
TokenInformation,
|
|
TokenInformationLength,
|
|
ReturnLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryInstallUILanguage(
|
|
OUT LANGID *InstallUILanguageId
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (InstallUILanguageId);
|
|
}
|
|
|
|
Status = ZwQueryInstallUILanguage(InstallUILanguageId);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryKey(
|
|
IN HANDLE KeyHandle,
|
|
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
|
OUT PVOID KeyInformation,
|
|
IN ULONG Length,
|
|
OUT PULONG ResultLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_ADDRESS (KeyInformation);
|
|
VF_ZW_CHECK_ADDRESS (ResultLength);
|
|
}
|
|
|
|
Status = ZwQueryKey(KeyHandle,
|
|
KeyInformationClass,
|
|
KeyInformation,
|
|
Length,
|
|
ResultLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryObject(
|
|
IN HANDLE Handle,
|
|
IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
|
|
OUT PVOID ObjectInformation,
|
|
IN ULONG Length,
|
|
OUT PULONG ReturnLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (Handle);
|
|
VF_ZW_CHECK_ADDRESS (ObjectInformation);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwQueryObject(Handle,
|
|
ObjectInformationClass,
|
|
ObjectInformation,
|
|
Length,
|
|
ReturnLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQuerySection(
|
|
IN HANDLE SectionHandle,
|
|
IN SECTION_INFORMATION_CLASS SectionInformationClass,
|
|
OUT PVOID SectionInformation,
|
|
IN SIZE_T SectionInformationLength,
|
|
OUT PSIZE_T ReturnLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (SectionHandle);
|
|
VF_ZW_CHECK_ADDRESS (SectionInformation);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwQuerySection(SectionHandle,
|
|
SectionInformationClass,
|
|
SectionInformation,
|
|
SectionInformationLength,
|
|
ReturnLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQuerySecurityObject(
|
|
IN HANDLE Handle,
|
|
IN SECURITY_INFORMATION SecurityInformation,
|
|
OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
|
|
IN ULONG Length,
|
|
OUT PULONG LengthNeeded
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (Handle);
|
|
VF_ZW_CHECK_ADDRESS (SecurityDescriptor);
|
|
VF_ZW_CHECK_ADDRESS (LengthNeeded);
|
|
}
|
|
|
|
Status = ZwQuerySecurityObject(Handle,
|
|
SecurityInformation,
|
|
SecurityDescriptor,
|
|
Length,
|
|
LengthNeeded);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQuerySymbolicLinkObject(
|
|
IN HANDLE LinkHandle,
|
|
IN OUT PUNICODE_STRING LinkTarget,
|
|
OUT PULONG ReturnedLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (LinkHandle);
|
|
VF_ZW_CHECK_UNICODE_STRING (LinkTarget);
|
|
VF_ZW_CHECK_ADDRESS (ReturnedLength);
|
|
}
|
|
|
|
Status = ZwQuerySymbolicLinkObject(LinkHandle,
|
|
LinkTarget,
|
|
ReturnedLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQuerySystemInformation (
|
|
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
|
|
OUT PVOID SystemInformation,
|
|
IN ULONG SystemInformationLength,
|
|
OUT PULONG ReturnLength OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (SystemInformation);
|
|
VF_ZW_CHECK_ADDRESS (ReturnLength);
|
|
}
|
|
|
|
Status = ZwQuerySystemInformation (SystemInformationClass,
|
|
SystemInformation,
|
|
SystemInformationLength,
|
|
ReturnLength OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryValueKey(
|
|
IN HANDLE KeyHandle,
|
|
IN PUNICODE_STRING ValueName,
|
|
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
|
|
OUT PVOID KeyValueInformation,
|
|
IN ULONG Length,
|
|
OUT PULONG ResultLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_UNICODE_STRING (ValueName);
|
|
VF_ZW_CHECK_ADDRESS (KeyValueInformation);
|
|
VF_ZW_CHECK_ADDRESS (ResultLength);
|
|
}
|
|
|
|
Status = ZwQueryValueKey(KeyHandle,
|
|
ValueName,
|
|
KeyValueInformationClass,
|
|
KeyValueInformation,
|
|
Length,
|
|
ResultLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwQueryVolumeInformationFile(
|
|
IN HANDLE FileHandle,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
OUT PVOID FsInformation,
|
|
IN ULONG Length,
|
|
IN FS_INFORMATION_CLASS FsInformationClass
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (FsInformation);
|
|
}
|
|
|
|
Status = ZwQueryVolumeInformationFile(FileHandle,
|
|
IoStatusBlock,
|
|
FsInformation,
|
|
Length,
|
|
FsInformationClass);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwReadFile(
|
|
IN HANDLE FileHandle,
|
|
IN HANDLE Event OPTIONAL,
|
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
|
IN PVOID ApcContext OPTIONAL,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
OUT PVOID Buffer,
|
|
IN ULONG Length,
|
|
IN PLARGE_INTEGER ByteOffset OPTIONAL,
|
|
IN PULONG Key OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_HANDLE (Event);
|
|
VF_ZW_CHECK_ADDRESS ((PVOID)ApcRoutine);
|
|
VF_ZW_CHECK_ADDRESS (ApcContext);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (Buffer);
|
|
VF_ZW_CHECK_ADDRESS (ByteOffset);
|
|
VF_ZW_CHECK_ADDRESS (Key);
|
|
}
|
|
|
|
Status = ZwReadFile(FileHandle,
|
|
Event OPTIONAL,
|
|
ApcRoutine OPTIONAL,
|
|
ApcContext OPTIONAL,
|
|
IoStatusBlock,
|
|
Buffer,
|
|
Length,
|
|
ByteOffset OPTIONAL,
|
|
Key OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwReplaceKey(
|
|
IN POBJECT_ATTRIBUTES NewFile,
|
|
IN HANDLE TargetHandle,
|
|
IN POBJECT_ATTRIBUTES OldFile
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (NewFile);
|
|
VF_ZW_CHECK_HANDLE (TargetHandle);
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (OldFile);
|
|
}
|
|
|
|
Status = ZwReplaceKey(NewFile,
|
|
TargetHandle,
|
|
OldFile);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwRequestWaitReplyPort(
|
|
IN HANDLE PortHandle,
|
|
IN PPORT_MESSAGE RequestMessage,
|
|
OUT PPORT_MESSAGE ReplyMessage
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (PortHandle);
|
|
VF_ZW_CHECK_ADDRESS (RequestMessage);
|
|
VF_ZW_CHECK_ADDRESS (ReplyMessage);
|
|
}
|
|
|
|
Status = ZwRequestWaitReplyPort(PortHandle,
|
|
RequestMessage,
|
|
ReplyMessage);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwResetEvent (
|
|
IN HANDLE EventHandle,
|
|
OUT PLONG PreviousState OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (EventHandle);
|
|
VF_ZW_CHECK_ADDRESS (PreviousState);
|
|
}
|
|
|
|
Status = ZwResetEvent (EventHandle,
|
|
PreviousState OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwRestoreKey(
|
|
IN HANDLE KeyHandle,
|
|
IN HANDLE FileHandle,
|
|
IN ULONG Flags
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
}
|
|
|
|
Status = ZwRestoreKey(KeyHandle,
|
|
FileHandle,
|
|
Flags);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSaveKey(
|
|
IN HANDLE KeyHandle,
|
|
IN HANDLE FileHandle
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
}
|
|
|
|
Status = ZwSaveKey(KeyHandle,
|
|
FileHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSaveKeyEx(
|
|
IN HANDLE KeyHandle,
|
|
IN HANDLE FileHandle,
|
|
IN ULONG Format
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
}
|
|
|
|
Status = ZwSaveKeyEx(KeyHandle,
|
|
FileHandle,
|
|
Format);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetBootEntryOrder (
|
|
IN PULONG Ids,
|
|
IN ULONG Count
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (Ids);
|
|
}
|
|
|
|
Status = ZwSetBootEntryOrder (Ids,
|
|
Count);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetBootOptions (
|
|
IN PBOOT_OPTIONS BootOptions,
|
|
IN ULONG FieldsToChange
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (BootOptions);
|
|
}
|
|
|
|
Status = ZwSetBootOptions (BootOptions,
|
|
FieldsToChange);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetDefaultLocale(
|
|
IN BOOLEAN UserProfile,
|
|
IN LCID DefaultLocaleId
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
// no-op check to avoid warning for `Caller'.
|
|
VF_ZW_CHECK_ADDRESS (NULL);
|
|
}
|
|
|
|
Status = ZwSetDefaultLocale(UserProfile,
|
|
DefaultLocaleId);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetDefaultUILanguage(
|
|
IN LANGID DefaultUILanguageId
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
// no-op check to avoid warning for `Caller'.
|
|
VF_ZW_CHECK_ADDRESS (NULL);
|
|
}
|
|
|
|
Status = ZwSetDefaultUILanguage(DefaultUILanguageId);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetDriverEntryOrder (
|
|
IN PULONG Ids,
|
|
IN ULONG Count
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (Ids);
|
|
}
|
|
|
|
Status = ZwSetDriverEntryOrder (Ids,
|
|
Count);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetEaFile(
|
|
IN HANDLE FileHandle,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN PVOID Buffer,
|
|
IN ULONG Length
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (Buffer);
|
|
}
|
|
|
|
Status = ZwSetEaFile(FileHandle,
|
|
IoStatusBlock,
|
|
Buffer,
|
|
Length);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetEvent (
|
|
IN HANDLE EventHandle,
|
|
OUT PLONG PreviousState OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (EventHandle);
|
|
VF_ZW_CHECK_ADDRESS (PreviousState);
|
|
}
|
|
|
|
Status = ZwSetEvent (EventHandle,
|
|
PreviousState OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetInformationFile(
|
|
IN HANDLE FileHandle,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN PVOID FileInformation,
|
|
IN ULONG Length,
|
|
IN FILE_INFORMATION_CLASS FileInformationClass
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (FileInformation);
|
|
}
|
|
|
|
Status = ZwSetInformationFile(FileHandle,
|
|
IoStatusBlock,
|
|
FileInformation,
|
|
Length,
|
|
FileInformationClass);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetInformationJobObject(
|
|
IN HANDLE JobHandle,
|
|
IN JOBOBJECTINFOCLASS JobObjectInformationClass,
|
|
IN PVOID JobObjectInformation,
|
|
IN ULONG JobObjectInformationLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (JobHandle);
|
|
VF_ZW_CHECK_ADDRESS (JobObjectInformation);
|
|
}
|
|
|
|
Status = ZwSetInformationJobObject(JobHandle,
|
|
JobObjectInformationClass,
|
|
JobObjectInformation,
|
|
JobObjectInformationLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetInformationObject(
|
|
IN HANDLE Handle,
|
|
IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
|
|
IN PVOID ObjectInformation,
|
|
IN ULONG ObjectInformationLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (Handle);
|
|
VF_ZW_CHECK_ADDRESS (ObjectInformation);
|
|
}
|
|
|
|
Status = ZwSetInformationObject(Handle,
|
|
ObjectInformationClass,
|
|
ObjectInformation,
|
|
ObjectInformationLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetInformationProcess(
|
|
IN HANDLE ProcessHandle,
|
|
IN PROCESSINFOCLASS ProcessInformationClass,
|
|
IN PVOID ProcessInformation,
|
|
IN ULONG ProcessInformationLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (ProcessInformation);
|
|
}
|
|
|
|
Status = ZwSetInformationProcess(ProcessHandle,
|
|
ProcessInformationClass,
|
|
ProcessInformation,
|
|
ProcessInformationLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetInformationThread(
|
|
IN HANDLE ThreadHandle,
|
|
IN THREADINFOCLASS ThreadInformationClass,
|
|
IN PVOID ThreadInformation,
|
|
IN ULONG ThreadInformationLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ThreadHandle);
|
|
VF_ZW_CHECK_ADDRESS (ThreadInformation);
|
|
}
|
|
|
|
Status = ZwSetInformationThread(ThreadHandle,
|
|
ThreadInformationClass,
|
|
ThreadInformation,
|
|
ThreadInformationLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetSecurityObject(
|
|
IN HANDLE Handle,
|
|
IN SECURITY_INFORMATION SecurityInformation,
|
|
IN PSECURITY_DESCRIPTOR SecurityDescriptor
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (Handle);
|
|
VF_ZW_CHECK_ADDRESS (SecurityDescriptor);
|
|
}
|
|
|
|
Status = ZwSetSecurityObject(Handle,
|
|
SecurityInformation,
|
|
SecurityDescriptor);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetSystemInformation (
|
|
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
|
|
IN PVOID SystemInformation,
|
|
IN ULONG SystemInformationLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (SystemInformation);
|
|
}
|
|
|
|
Status = ZwSetSystemInformation (SystemInformationClass,
|
|
SystemInformation,
|
|
SystemInformationLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetSystemTime (
|
|
IN PLARGE_INTEGER SystemTime,
|
|
OUT PLARGE_INTEGER PreviousTime OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (SystemTime);
|
|
VF_ZW_CHECK_ADDRESS (PreviousTime);
|
|
}
|
|
|
|
Status = ZwSetSystemTime (SystemTime,
|
|
PreviousTime OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetTimer (
|
|
IN HANDLE TimerHandle,
|
|
IN PLARGE_INTEGER DueTime,
|
|
IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
|
|
IN PVOID TimerContext OPTIONAL,
|
|
IN BOOLEAN ResumeTimer,
|
|
IN LONG Period OPTIONAL,
|
|
OUT PBOOLEAN PreviousState OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (TimerHandle);
|
|
VF_ZW_CHECK_ADDRESS (DueTime);
|
|
VF_ZW_CHECK_ADDRESS ((PVOID)TimerApcRoutine);
|
|
VF_ZW_CHECK_ADDRESS (TimerContext);
|
|
VF_ZW_CHECK_ADDRESS (PreviousState);
|
|
}
|
|
|
|
Status = ZwSetTimer (TimerHandle,
|
|
DueTime,
|
|
TimerApcRoutine OPTIONAL,
|
|
TimerContext OPTIONAL,
|
|
ResumeTimer,
|
|
Period OPTIONAL,
|
|
PreviousState OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetValueKey(
|
|
IN HANDLE KeyHandle,
|
|
IN PUNICODE_STRING ValueName,
|
|
IN ULONG TitleIndex OPTIONAL,
|
|
IN ULONG Type,
|
|
IN PVOID Data,
|
|
IN ULONG DataSize
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (KeyHandle);
|
|
VF_ZW_CHECK_UNICODE_STRING (ValueName);
|
|
VF_ZW_CHECK_ADDRESS (Data);
|
|
}
|
|
|
|
Status = ZwSetValueKey(KeyHandle,
|
|
ValueName,
|
|
TitleIndex OPTIONAL,
|
|
Type,
|
|
Data,
|
|
DataSize);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwSetVolumeInformationFile(
|
|
IN HANDLE FileHandle,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN PVOID FsInformation,
|
|
IN ULONG Length,
|
|
IN FS_INFORMATION_CLASS FsInformationClass
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (FsInformation);
|
|
}
|
|
|
|
Status = ZwSetVolumeInformationFile(FileHandle,
|
|
IoStatusBlock,
|
|
FsInformation,
|
|
Length,
|
|
FsInformationClass);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwTerminateJobObject(
|
|
IN HANDLE JobHandle,
|
|
IN NTSTATUS ExitStatus
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (JobHandle);
|
|
}
|
|
|
|
Status = ZwTerminateJobObject(JobHandle,
|
|
ExitStatus);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwTerminateProcess(
|
|
IN HANDLE ProcessHandle OPTIONAL,
|
|
IN NTSTATUS ExitStatus
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
}
|
|
|
|
Status = ZwTerminateProcess(ProcessHandle OPTIONAL,
|
|
ExitStatus);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwTranslateFilePath (
|
|
IN PFILE_PATH InputFilePath,
|
|
IN ULONG OutputType,
|
|
OUT PFILE_PATH OutputFilePath,
|
|
IN OUT PULONG OutputFilePathLength
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (InputFilePath);
|
|
VF_ZW_CHECK_ADDRESS (OutputFilePath);
|
|
VF_ZW_CHECK_ADDRESS (OutputFilePathLength);
|
|
}
|
|
|
|
Status = ZwTranslateFilePath (InputFilePath,
|
|
OutputType,
|
|
OutputFilePath,
|
|
OutputFilePathLength);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwUnloadDriver(
|
|
IN PUNICODE_STRING DriverServiceName
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_UNICODE_STRING (DriverServiceName);
|
|
}
|
|
|
|
Status = ZwUnloadDriver(DriverServiceName);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwUnloadKey(
|
|
IN POBJECT_ATTRIBUTES TargetKey
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_OBJECT_ATTRIBUTES (TargetKey);
|
|
}
|
|
|
|
Status = ZwUnloadKey(TargetKey);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwUnmapViewOfSection(
|
|
IN HANDLE ProcessHandle,
|
|
IN PVOID BaseAddress
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (ProcessHandle);
|
|
VF_ZW_CHECK_ADDRESS (BaseAddress);
|
|
}
|
|
|
|
Status = ZwUnmapViewOfSection(ProcessHandle,
|
|
BaseAddress);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwWaitForMultipleObjects(
|
|
IN ULONG Count,
|
|
IN HANDLE Handles[],
|
|
IN WAIT_TYPE WaitType,
|
|
IN BOOLEAN Alertable,
|
|
IN PLARGE_INTEGER Timeout OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
ULONG Index;
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_ADDRESS (Handles);
|
|
VF_ZW_CHECK_ADDRESS (Timeout);
|
|
|
|
for (Index = 0; Index < Count; Index += 1) {
|
|
VF_ZW_CHECK_HANDLE (Handles[Index]);
|
|
}
|
|
}
|
|
|
|
Status = ZwWaitForMultipleObjects(Count,
|
|
Handles,
|
|
WaitType,
|
|
Alertable,
|
|
Timeout OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwWaitForSingleObject(
|
|
IN HANDLE Handle,
|
|
IN BOOLEAN Alertable,
|
|
IN PLARGE_INTEGER Timeout OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (Handle);
|
|
VF_ZW_CHECK_ADDRESS (Timeout);
|
|
}
|
|
|
|
Status = ZwWaitForSingleObject(Handle,
|
|
Alertable,
|
|
Timeout);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwWriteFile(
|
|
IN HANDLE FileHandle,
|
|
IN HANDLE Event OPTIONAL,
|
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
|
IN PVOID ApcContext OPTIONAL,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN PVOID Buffer,
|
|
IN ULONG Length,
|
|
IN PLARGE_INTEGER ByteOffset OPTIONAL,
|
|
IN PULONG Key OPTIONAL
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
VF_ZW_CHECK_HANDLE (FileHandle);
|
|
VF_ZW_CHECK_HANDLE (Event);
|
|
VF_ZW_CHECK_ADDRESS ((PVOID)ApcRoutine);
|
|
VF_ZW_CHECK_ADDRESS (ApcContext);
|
|
VF_ZW_CHECK_ADDRESS (IoStatusBlock);
|
|
VF_ZW_CHECK_ADDRESS (Buffer);
|
|
VF_ZW_CHECK_ADDRESS (ByteOffset);
|
|
VF_ZW_CHECK_ADDRESS (Key);
|
|
}
|
|
|
|
Status = ZwWriteFile(FileHandle,
|
|
Event OPTIONAL,
|
|
ApcRoutine OPTIONAL,
|
|
ApcContext OPTIONAL,
|
|
IoStatusBlock,
|
|
Buffer,
|
|
Length,
|
|
ByteOffset OPTIONAL,
|
|
Key OPTIONAL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
VfZwYieldExecution (
|
|
VOID
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
PVOID Caller = _ReturnAddress();
|
|
|
|
if (VfZwShouldCheck (Caller)) {
|
|
|
|
// no-op check to avoid warning for `Caller' local.
|
|
VF_ZW_CHECK_ADDRESS (NULL);
|
|
}
|
|
|
|
Status = ZwYieldExecution();
|
|
|
|
return Status;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Turns on and off the entire Zw verifier code.
|
|
//
|
|
|
|
LOGICAL VfZwVerifierEnabled = FALSE;
|
|
|
|
//
|
|
// If Zw verifier is on, controls if sessions space drivers are checked.
|
|
//
|
|
|
|
LOGICAL VfZwVerifierSessionEnabled = TRUE;
|
|
|
|
//
|
|
// Do we break for issues?
|
|
//
|
|
|
|
LOGICAL VfZwBreakForIssues = FALSE;
|
|
|
|
//
|
|
// Break for virtual space allocations (alloc/map)?
|
|
//
|
|
|
|
LOGICAL VfZwBreakForVspaceOps = FALSE;
|
|
|
|
//
|
|
// Enable decommitted memory attacks on ZwAlloc/ZwMap users.
|
|
//
|
|
|
|
LOGICAL VfZwEnableSimulatedAttacks = FALSE;
|
|
|
|
LOGICAL VfZwSystemSufficientlyBooted;
|
|
|
|
#define VF_ZW_TIME_ONE_SECOND ((LONGLONG)(1000 * 1000 * 10))
|
|
LONGLONG VfZwRequiredTimeSinceBoot = 5 * 60 * VF_ZW_TIME_ONE_SECOND;
|
|
|
|
PVOID VfZwLastCall;
|
|
|
|
#define MAX_NO_OF_ISSUES 256
|
|
ULONG VfZwReportedIssuesIndex;
|
|
PVOID VfZwReportedIssues[MAX_NO_OF_ISSUES];
|
|
|
|
#define VF_ZW_USER_MODE_ADDRESS_USED 1
|
|
#define VF_ZW_USER_MODE_HANDLE_USED 2
|
|
|
|
LOGICAL
|
|
VfZwShouldCheck (
|
|
PVOID Caller
|
|
)
|
|
{
|
|
PEPROCESS CurrentProcess;
|
|
|
|
if (VfZwVerifierEnabled == FALSE) {
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Skip system process.
|
|
//
|
|
|
|
CurrentProcess = PsGetCurrentProcess();
|
|
|
|
if (CurrentProcess == PsInitialSystemProcess) {
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Check if we want to skip session space drivers (e.g. win32k.sys).
|
|
//
|
|
|
|
if (MmIsSessionAddress(Caller)) {
|
|
if (VfZwVerifierSessionEnabled == FALSE) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Skip exempt (trusted) processes (e.g. lsass, csrss, etc.).
|
|
//
|
|
|
|
if (_stricmp ((PCHAR)CurrentProcess->ImageFileName, "lsass.exe") == 0) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (_stricmp ((PCHAR)CurrentProcess->ImageFileName, "csrss.exe") == 0) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (_stricmp ((PCHAR)CurrentProcess->ImageFileName, "smss.exe") == 0) {
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
VfZwReportIssue (
|
|
ULONG IssueType,
|
|
PVOID Information,
|
|
PVOID Caller
|
|
)
|
|
{
|
|
switch (IssueType) {
|
|
|
|
case VF_ZW_USER_MODE_HANDLE_USED:
|
|
DbgPrint ("DVRF:ZW: Using user mode handle %p in Zw call from %p \n",
|
|
Information, Caller);
|
|
break;
|
|
|
|
case VF_ZW_USER_MODE_ADDRESS_USED:
|
|
DbgPrint ("DVRF:ZW: Using user mode address %p in Zw call from %p \n",
|
|
Information, Caller);
|
|
break;
|
|
|
|
default:
|
|
return;
|
|
}
|
|
|
|
if (VfZwBreakForIssues) {
|
|
DbgBreakPoint ();
|
|
}
|
|
}
|
|
|
|
LOGICAL
|
|
VfZwShouldReportIssue (
|
|
PVOID Caller
|
|
)
|
|
{
|
|
ULONG Index;
|
|
|
|
for (Index = 0; Index < VfZwReportedIssuesIndex; Index += 1) {
|
|
|
|
if (VfZwReportedIssues[Index] == Caller) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
Index = (ULONG)InterlockedIncrement((PLONG)(&VfZwReportedIssuesIndex));
|
|
|
|
if (Index >= MAX_NO_OF_ISSUES) {
|
|
DbgPrint ("DVRF:ZW: reported issues buffer has been maxed out. \n");
|
|
return FALSE;
|
|
}
|
|
|
|
VfZwReportedIssues[Index] = Caller;
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
VfZwReportUserModeVirtualSpaceOperation (
|
|
PVOID Caller
|
|
)
|
|
{
|
|
if (VfZwBreakForVspaceOps) {
|
|
|
|
DbgPrint ("DVRF:ZW: user-mode virtual space allocation made by %p \n", Caller);
|
|
DbgBreakPoint();
|
|
}
|
|
}
|
|
|
|
LOGICAL
|
|
VfZwShouldSimulateDecommitAttack (
|
|
VOID
|
|
)
|
|
{
|
|
LARGE_INTEGER CurrentTime;
|
|
|
|
if (VfZwEnableSimulatedAttacks == FALSE) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (VfZwSystemSufficientlyBooted == FALSE) {
|
|
|
|
KeQuerySystemTime (&CurrentTime);
|
|
|
|
if (CurrentTime.QuadPart > KeBootTime.QuadPart + VfZwRequiredTimeSinceBoot) {
|
|
VfZwSystemSufficientlyBooted = TRUE;
|
|
}
|
|
}
|
|
else {
|
|
|
|
KeQueryTickCount(&CurrentTime);
|
|
|
|
if ((CurrentTime.LowPart & 0xF) == 0) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
ULONG
|
|
VfZwExceptionFilter (
|
|
PVOID ExceptionInfo
|
|
)
|
|
{
|
|
DbgPrint("DVRF:ZW: exception raised! (info: %X) \n", ExceptionInfo);
|
|
DbgBreakPoint();
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
}
|
|
|
|
VOID
|
|
VfZwCheckAddress (
|
|
PVOID Address,
|
|
PVOID Caller
|
|
)
|
|
{
|
|
if (Address == NULL) {
|
|
return;
|
|
}
|
|
|
|
VfZwLastCall = _ReturnAddress();
|
|
|
|
if ((ULONG_PTR)Address < (ULONG_PTR)(MM_HIGHEST_USER_ADDRESS)) {
|
|
|
|
if (VfZwShouldReportIssue (Caller)) {
|
|
|
|
VfZwReportIssue (VF_ZW_USER_MODE_ADDRESS_USED,
|
|
Address,
|
|
Caller);
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID
|
|
VfZwCheckHandle (
|
|
PVOID Handle,
|
|
PVOID Caller
|
|
)
|
|
{
|
|
if (Handle == NULL) {
|
|
return;
|
|
}
|
|
|
|
VfZwLastCall = _ReturnAddress();
|
|
|
|
//
|
|
// Macro inspired from ntos\ob\obp.h
|
|
// A kernel handle is just a regular handle with its sign
|
|
// bit set. But must exclude -1 and -2 values which are the current
|
|
// process and current thread constants.
|
|
//
|
|
|
|
#define KERNEL_HANDLE_MASK ((ULONG_PTR)((LONG)0x80000000))
|
|
|
|
if ((KERNEL_HANDLE_MASK & (ULONG_PTR)(Handle)) != KERNEL_HANDLE_MASK) {
|
|
|
|
if (Handle != NtCurrentThread() &&
|
|
Handle != NtCurrentProcess()) {
|
|
|
|
if (VfZwShouldReportIssue (Caller)) {
|
|
|
|
VfZwReportIssue (VF_ZW_USER_MODE_HANDLE_USED,
|
|
Handle,
|
|
Caller);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID
|
|
VfZwCheckObjectAttributes (
|
|
POBJECT_ATTRIBUTES ObjectAttributes,
|
|
PVOID Caller
|
|
)
|
|
{
|
|
if (ObjectAttributes == NULL) {
|
|
return;
|
|
}
|
|
|
|
VfZwLastCall = _ReturnAddress();
|
|
|
|
VfZwCheckAddress (ObjectAttributes, Caller);
|
|
VfZwCheckHandle (ObjectAttributes->RootDirectory, Caller);
|
|
VfZwCheckUnicodeString (ObjectAttributes->ObjectName, Caller);
|
|
VfZwCheckAddress (ObjectAttributes->SecurityDescriptor, Caller);
|
|
VfZwCheckAddress (ObjectAttributes->SecurityQualityOfService, Caller);
|
|
}
|
|
|
|
VOID
|
|
VfZwCheckUnicodeString (
|
|
PUNICODE_STRING String,
|
|
PVOID Caller
|
|
)
|
|
{
|
|
if (String == NULL) {
|
|
return;
|
|
}
|
|
|
|
VfZwLastCall = _ReturnAddress();
|
|
|
|
VfZwCheckAddress (String, Caller);
|
|
VfZwCheckAddress (String->Buffer, Caller);
|
|
}
|
|
|
|
#ifdef ALLOC_DATA_PRAGMA
|
|
#pragma data_seg("PAGEVRFD")
|
|
#endif
|
|
|
|
|
|
|