- Create a VdmpInitialize function for NtVdmControl's initialize command.

- Remove NtEarlyVdmInitialize hack and csrss IVT/BDA copying hack, instead, copy the first page of physical memory to the beginning of process's virtual address space like NT does.

svn path=/trunk/; revision=36459
This commit is contained in:
Aleksey Bragin 2008-09-24 10:06:08 +00:00
parent 200665fb89
commit f05e50b409
5 changed files with 87 additions and 31 deletions

View file

@ -68,8 +68,6 @@ KiGetFeatureBits(VOID);
ULONG KeAllocateGdtSelector(ULONG Desc[2]);
VOID KeFreeGdtSelector(ULONG Entry);
VOID
NtEarlyInitVdm(VOID);
VOID
KeApplicationProcessorInitDispatcher(VOID);
VOID
KeCreateApplicationProcessorIdleThread(ULONG Id);

View file

@ -54,8 +54,6 @@ VOID
KiPPCSetProcessorFeatures(VOID);
ULONG KeAllocateGdtSelector(ULONG Desc[2]);
VOID KeFreeGdtSelector(ULONG Entry);
VOID
NtEarlyInitVdm(VOID);
#ifdef CONFIG_SMP
#define LOCK "isync ; "

View file

@ -1332,11 +1332,6 @@ KiRosPrepareForSystemStartup(IN ULONG Dummy,
LoaderBlock->MmapAddr = (ULONG)KeMemoryMap;
}
#if defined(_M_IX86)
/* Set up the VDM Data */
NtEarlyInitVdm();
#endif
/* Convert the loader block */
KiRosFrldrLpbToNtLpb(KeRosLoaderBlock, &NtLoaderBlock);

View file

@ -4,6 +4,7 @@
* FILE: ntoskrnl/vdm/vdmmain.c
* PURPOSE: VDM Support Services
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
* Aleksey Bragin (aleksey@reactos.org)
*/
/* INCLUDES ******************************************************************/
@ -14,21 +15,9 @@
/* GLOBALS *******************************************************************/
static UCHAR OrigIVT[1024];
static UCHAR OrigBDA[256];
/* PRIVATE FUNCTIONS *********************************************************/
VOID
INIT_FUNCTION
NtEarlyInitVdm(VOID)
{
PCHAR start = MmCreateHyperspaceMapping(0);
memcpy(OrigIVT, start, 1024);
memcpy(OrigBDA, start+0x400, 256);
MmDeleteHyperspaceMapping(start);
}
VOID
NTAPI
Ki386VdmEnablePentiumExtentions(VOID)
@ -82,6 +71,90 @@ KeI386VdmInitialize(VOID)
ZwClose(RegHandle);
}
NTSTATUS
NTAPI
VdmpInitialize(PVOID ControlData)
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING PhysMemName = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
NTSTATUS Status;
HANDLE PhysMemHandle;
PVOID BaseAddress;
PVOID NullAddress = NULL;
LARGE_INTEGER Offset;
ULONG ViewSize;
/* Open the physical memory section */
InitializeObjectAttributes(&ObjectAttributes,
&PhysMemName,
0,
NULL,
NULL);
Status = ZwOpenSection(&PhysMemHandle,
SECTION_ALL_ACCESS,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
DPRINT1("Couldn't open \\Device\\PhysicalMemory\n");
return Status;
}
/* Map the BIOS and device registers into the address space */
Offset.QuadPart = 0;
ViewSize = PAGE_SIZE;
BaseAddress = 0;
Status = ZwMapViewOfSection(PhysMemHandle,
NtCurrentProcess(),
&BaseAddress,
0,
ViewSize,
&Offset,
&ViewSize,
ViewUnmap,
0,
PAGE_READWRITE);
if (!NT_SUCCESS(Status))
{
DPRINT1("Couldn't map physical memory (%x)\n", Status);
ZwClose(PhysMemHandle);
return Status;
}
/* Now, copy the first physical pagee into the first virtual page */
_SEH_TRY
{
RtlMoveMemory(NullAddress, BaseAddress, ViewSize);
}
_SEH_HANDLE
{
/* Get the status */
Status = _SEH_GetExceptionCode();
}
_SEH_END;
if (!NT_SUCCESS(Status))
{
DPRINT1("Couldn't copy first page (%x)\n", Status);
ZwClose(PhysMemHandle);
ZwUnmapViewOfSection(NtCurrentProcess(), BaseAddress);
return Status;
}
/* Close physical memory section handle */
ZwClose(PhysMemHandle);
/* Unmap the section */
Status = ZwUnmapViewOfSection(NtCurrentProcess(), BaseAddress);
if (!NT_SUCCESS(Status))
{
DPRINT1("Couldn't unmap the section (%x)\n", Status);
return Status;
}
return STATUS_SUCCESS;
}
/* PUBLIC FUNCTIONS **********************************************************/
/*
@ -107,10 +180,8 @@ NtVdmControl(IN ULONG ControlCode,
case VdmInitialize:
/* Pretty much a hack, since a lot more needs to happen */
memcpy(ControlData, OrigIVT, 1024);
memcpy((PVOID)((ULONG_PTR)ControlData + 1024), OrigBDA, 256);
Status = STATUS_SUCCESS;
/* Call the init sub-function */
Status = VdmpInitialize(ControlData);
break;
default:

View file

@ -23,7 +23,6 @@ InitializeVideoAddressSpace(VOID)
NTSTATUS Status;
HANDLE PhysMemHandle;
PVOID BaseAddress;
PVOID NullAddress;
LARGE_INTEGER Offset;
ULONG ViewSize;
CHAR IVTAndBda[1024+256];
@ -105,11 +104,6 @@ InitializeVideoAddressSpace(VOID)
return 0;
}
/* Copy the IVT and BDA into the right place */
NullAddress = (PVOID)0x0; /* Workaround for GCC 3.4 */
memcpy(NullAddress, IVTAndBda, 1024);
memcpy((PVOID)0x400, &IVTAndBda[1024], 256);
/* Return success */
return 1;
}