437 lines
10 KiB
C
437 lines
10 KiB
C
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
vspace.c
|
|
|
|
Abstract:
|
|
|
|
This module implements verification functions for
|
|
virtual address space management interfaces.
|
|
|
|
Author:
|
|
|
|
Silviu Calinoiu (SilviuC) 22-Feb-2001
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
|
|
#include "verifier.h"
|
|
#include "support.h"
|
|
|
|
|
|
//NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
AVrfpNtAllocateVirtualMemory(
|
|
IN HANDLE ProcessHandle,
|
|
IN OUT PVOID *BaseAddress,
|
|
IN ULONG_PTR ZeroBits,
|
|
IN OUT PSIZE_T RegionSize,
|
|
IN ULONG AllocationType,
|
|
IN ULONG Protect
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
SYSTEM_BASIC_INFORMATION SystemInfo;
|
|
|
|
//
|
|
// Allocate top-down for 64 bit systems or 3Gb systems.
|
|
//
|
|
|
|
try {
|
|
|
|
if (*BaseAddress == NULL) {
|
|
|
|
Status = NtQuerySystemInformation (SystemBasicInformation,
|
|
&SystemInfo,
|
|
sizeof SystemInfo,
|
|
NULL);
|
|
|
|
if (NT_SUCCESS(Status)) {
|
|
if (SystemInfo.MaximumUserModeAddress - SystemInfo.MinimumUserModeAddress > (ULONG_PTR)0x80000000) {
|
|
AllocationType |= MEM_TOP_DOWN;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER) {
|
|
}
|
|
|
|
Status = NtAllocateVirtualMemory (ProcessHandle,
|
|
BaseAddress,
|
|
ZeroBits,
|
|
RegionSize,
|
|
AllocationType,
|
|
Protect);
|
|
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
VsLogCall (VsVirtualAlloc,
|
|
*BaseAddress,
|
|
*RegionSize,
|
|
AllocationType,
|
|
Protect);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
AVrfpNtFreeVirtualMemory(
|
|
IN HANDLE ProcessHandle,
|
|
IN OUT PVOID *BaseAddress,
|
|
IN OUT PSIZE_T RegionSize,
|
|
IN ULONG FreeType
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = NtFreeVirtualMemory (ProcessHandle,
|
|
BaseAddress,
|
|
RegionSize,
|
|
FreeType);
|
|
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
VsLogCall (VsVirtualFree,
|
|
*BaseAddress,
|
|
*RegionSize,
|
|
FreeType,
|
|
0);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
AVrfpNtMapViewOfSection(
|
|
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;
|
|
SYSTEM_BASIC_INFORMATION SystemInfo;
|
|
|
|
//
|
|
// Allocate top-down for 64 bit systems or 3Gb systems.
|
|
//
|
|
|
|
try {
|
|
|
|
if (*BaseAddress == NULL) {
|
|
|
|
Status = NtQuerySystemInformation (SystemBasicInformation,
|
|
&SystemInfo,
|
|
sizeof SystemInfo,
|
|
NULL);
|
|
|
|
if (NT_SUCCESS(Status)) {
|
|
if (SystemInfo.MaximumUserModeAddress - SystemInfo.MinimumUserModeAddress > (ULONG_PTR)0x80000000) {
|
|
AllocationType |= MEM_TOP_DOWN;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER) {
|
|
}
|
|
|
|
Status = NtMapViewOfSection (SectionHandle,
|
|
ProcessHandle,
|
|
BaseAddress,
|
|
ZeroBits,
|
|
CommitSize,
|
|
SectionOffset,
|
|
ViewSize,
|
|
InheritDisposition,
|
|
AllocationType,
|
|
Protect);
|
|
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
VsLogCall (VsMapView,
|
|
*BaseAddress,
|
|
*ViewSize,
|
|
AllocationType,
|
|
Protect);
|
|
}
|
|
|
|
#if 0 // silviuc:temp
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
PAVRF_HANDLE Section;
|
|
|
|
//
|
|
// Check out the section handle used.
|
|
//
|
|
|
|
Section = HandleFind (SectionHandle);
|
|
|
|
if (Section == NULL) {
|
|
|
|
Section = HandleAdd (SectionHandle,
|
|
HANDLE_TYPE_SECTION,
|
|
TRUE,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
|
|
DbgPrint ("AVRF: MapView (hndl: %X, size: %p) => addr: %p\n",
|
|
HandleToUlong(SectionHandle),
|
|
*ViewSize,
|
|
*BaseAddress);
|
|
}
|
|
#endif
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
AVrfpNtUnmapViewOfSection(
|
|
IN HANDLE ProcessHandle,
|
|
IN PVOID BaseAddress
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = NtUnmapViewOfSection (ProcessHandle,
|
|
BaseAddress);
|
|
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
VsLogCall (VsUnmapView,
|
|
BaseAddress,
|
|
0,
|
|
0,
|
|
0);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
AVrfpNtCreateSection (
|
|
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;
|
|
|
|
Status = NtCreateSection (SectionHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
MaximumSize,
|
|
SectionPageProtection,
|
|
AllocationAttributes,
|
|
FileHandle);
|
|
|
|
#if 0 // silviuc:temp
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
PAVRF_HANDLE Section;
|
|
PAVRF_HANDLE File;
|
|
PWSTR Name;
|
|
|
|
CheckObjectAttributes (ObjectAttributes);
|
|
|
|
Name = (ObjectAttributes && ObjectAttributes->ObjectName) ?
|
|
(ObjectAttributes->ObjectName->Buffer) : NULL;
|
|
|
|
Section = HandleAdd (*SectionHandle,
|
|
HANDLE_TYPE_SECTION,
|
|
FALSE,
|
|
Name,
|
|
NULL);
|
|
|
|
if (FileHandle) {
|
|
|
|
File = HandleFind (FileHandle);
|
|
|
|
if (File == NULL) {
|
|
|
|
HandleAdd (FileHandle,
|
|
HANDLE_TYPE_FILE,
|
|
TRUE,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
}
|
|
|
|
DbgPrint ("AVRF: CreateSection (file: %X) => hndl: %X \n\tname: %ws\n",
|
|
HandleToUlong(FileHandle),
|
|
HandleToUlong(*SectionHandle),
|
|
HandleName(Section));
|
|
}
|
|
#endif
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
AVrfpNtOpenSection(
|
|
OUT PHANDLE SectionHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = NtOpenSection (SectionHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes);
|
|
|
|
#if 0 // silviuc:temp
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
PAVRF_HANDLE Section;
|
|
PWSTR Name;
|
|
|
|
Name = (ObjectAttributes && ObjectAttributes->ObjectName) ?
|
|
(ObjectAttributes->ObjectName->Buffer) : NULL;
|
|
|
|
Section = HandleAdd (*SectionHandle,
|
|
HANDLE_TYPE_SECTION,
|
|
FALSE,
|
|
Name,
|
|
NULL);
|
|
|
|
DbgPrint ("AVRF: OpenSection () => hndl: %X\n\tname: %ws\n",
|
|
HandleToUlong (*SectionHandle),
|
|
HandleName (Section));
|
|
}
|
|
#endif
|
|
|
|
return Status;
|
|
}
|
|
|
|
//NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
AVrfpNtCreateFile(
|
|
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;
|
|
|
|
Status = NtCreateFile (FileHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
IoStatusBlock,
|
|
AllocationSize,
|
|
FileAttributes,
|
|
ShareAccess,
|
|
CreateDisposition,
|
|
CreateOptions,
|
|
EaBuffer,
|
|
EaLength);
|
|
|
|
#if 0 // silviuc:temp
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
PAVRF_HANDLE File;
|
|
PWSTR Name;
|
|
|
|
Name = (ObjectAttributes && ObjectAttributes->ObjectName) ?
|
|
(ObjectAttributes->ObjectName->Buffer) : NULL;
|
|
|
|
File = HandleAdd (*FileHandle,
|
|
HANDLE_TYPE_FILE,
|
|
FALSE,
|
|
Name,
|
|
NULL);
|
|
|
|
DbgPrint ("AVRF: CreateFile () => hndl: %X\n\tname: %ws\n",
|
|
HandleToUlong (*FileHandle),
|
|
HandleName (File));
|
|
}
|
|
#endif
|
|
|
|
return Status;
|
|
}
|
|
|
|
|
|
//NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
AVrfpNtOpenFile(
|
|
OUT PHANDLE FileHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN ULONG ShareAccess,
|
|
IN ULONG OpenOptions
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
Status = NtOpenFile (FileHandle,
|
|
DesiredAccess,
|
|
ObjectAttributes,
|
|
IoStatusBlock,
|
|
ShareAccess,
|
|
OpenOptions);
|
|
|
|
#if 0 // silviuc:temp
|
|
if (NT_SUCCESS(Status)) {
|
|
|
|
PAVRF_HANDLE File;
|
|
PWSTR Name;
|
|
|
|
Name = (ObjectAttributes && ObjectAttributes->ObjectName) ?
|
|
(ObjectAttributes->ObjectName->Buffer) : NULL;
|
|
|
|
File = HandleAdd (*FileHandle,
|
|
HANDLE_TYPE_FILE,
|
|
FALSE,
|
|
Name,
|
|
NULL);
|
|
|
|
DbgPrint ("AVRF: OpenFile () => hndl: %X\n\tname: %ws\n",
|
|
HandleToUlong(*FileHandle),
|
|
HandleName (File));
|
|
}
|
|
#endif
|
|
|
|
return Status;
|
|
}
|
|
|
|
|