Use MmMapIoSpaceEx instead of MmMapIoSpace
Disable execution bit on mapping improving security. MmMapIoSpaceEx is available only in Windows 10 so to provide binary compatibility detect the new function dynamically. Added a separate compatibility file. Based on a patch by Sandy Stutsman <sstutsma@redhat.com> Signed-off-by: Sameeh Jubran <sameeh@daynix.com> Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
parent
a86ef3acf8
commit
de8062e7b6
@ -1,6 +1,7 @@
|
||||
#include "driver.h"
|
||||
#include "qxldod.h"
|
||||
#include "qxl_windows.h"
|
||||
#include "compat.h"
|
||||
|
||||
#pragma code_seg("PAGE")
|
||||
|
||||
@ -1960,17 +1961,18 @@ MapFrameBuffer(
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*VirtualAddress = MmMapIoSpace(PhysicalAddress,
|
||||
Length,
|
||||
MmWriteCombined);
|
||||
*VirtualAddress = MapIoSpace(PhysicalAddress,
|
||||
Length,
|
||||
MmWriteCombined,
|
||||
PAGE_WRITECOMBINE | PAGE_READWRITE);
|
||||
if (*VirtualAddress == NULL)
|
||||
{
|
||||
// The underlying call to MmMapIoSpace failed. This may be because, MmWriteCombined
|
||||
// isn't supported, so try again with MmNonCached
|
||||
|
||||
*VirtualAddress = MmMapIoSpace(PhysicalAddress,
|
||||
Length,
|
||||
MmNonCached);
|
||||
*VirtualAddress = MapIoSpace(PhysicalAddress,
|
||||
Length,
|
||||
MmNonCached,
|
||||
PAGE_NOCACHE | PAGE_READWRITE);
|
||||
if (*VirtualAddress == NULL)
|
||||
{
|
||||
DbgPrint(TRACE_LEVEL_ERROR, ("MmMapIoSpace returned a NULL buffer when trying to allocate %lu bytes", Length));
|
||||
|
62
qxldod/compat.cpp
Normal file
62
qxldod/compat.cpp
Normal file
@ -0,0 +1,62 @@
|
||||
#include "driver.h"
|
||||
#include "compat.h"
|
||||
|
||||
static MapIoSpaceFunc DetectMapIoSpace;
|
||||
MapIoSpaceFunc *MapIoSpace = DetectMapIoSpace;
|
||||
|
||||
typedef NTKERNELAPI PVOID MmMapIoSpaceExFunc(
|
||||
_In_ PHYSICAL_ADDRESS PhysicalAddress,
|
||||
_In_ SIZE_T NumberOfBytes,
|
||||
_In_ ULONG Protect
|
||||
);
|
||||
static MmMapIoSpaceExFunc *pMmMapIoSpaceEx;
|
||||
|
||||
// all functions in this module are paged
|
||||
#pragma code_seg("PAGE")
|
||||
|
||||
// we call MmMapIoSpace only if MmMapIoSpaceEx is not present
|
||||
// so disable the warning
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:30029)
|
||||
static PVOID OldMapIoSpace(
|
||||
_In_ PHYSICAL_ADDRESS PhysicalAddress,
|
||||
_In_ SIZE_T NumberOfBytes,
|
||||
_In_ MEMORY_CACHING_TYPE CacheType,
|
||||
_In_ ULONG Protect
|
||||
)
|
||||
{
|
||||
PAGED_CODE();
|
||||
return MmMapIoSpace(PhysicalAddress, NumberOfBytes, CacheType);
|
||||
}
|
||||
#pragma warning(pop)
|
||||
|
||||
static PVOID NewMapIoSpace(
|
||||
_In_ PHYSICAL_ADDRESS PhysicalAddress,
|
||||
_In_ SIZE_T NumberOfBytes,
|
||||
_In_ MEMORY_CACHING_TYPE CacheType,
|
||||
_In_ ULONG Protect
|
||||
)
|
||||
{
|
||||
PAGED_CODE();
|
||||
return pMmMapIoSpaceEx(PhysicalAddress, NumberOfBytes, Protect);
|
||||
}
|
||||
|
||||
static PVOID DetectMapIoSpace(
|
||||
_In_ PHYSICAL_ADDRESS PhysicalAddress,
|
||||
_In_ SIZE_T NumberOfBytes,
|
||||
_In_ MEMORY_CACHING_TYPE CacheType,
|
||||
_In_ ULONG Protect
|
||||
)
|
||||
{
|
||||
PAGED_CODE();
|
||||
UNICODE_STRING name;
|
||||
RtlInitUnicodeString(&name, L"MmMapIoSpaceEx");
|
||||
|
||||
pMmMapIoSpaceEx = (MmMapIoSpaceExFunc*)MmGetSystemRoutineAddress(&name);
|
||||
if (pMmMapIoSpaceEx) {
|
||||
MapIoSpace = NewMapIoSpace;
|
||||
} else {
|
||||
MapIoSpace = OldMapIoSpace;
|
||||
}
|
||||
return MapIoSpace(PhysicalAddress, NumberOfBytes, CacheType, Protect);
|
||||
}
|
10
qxldod/compat.h
Normal file
10
qxldod/compat.h
Normal file
@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
#include "BaseObject.h"
|
||||
|
||||
typedef PVOID MapIoSpaceFunc(
|
||||
_In_ PHYSICAL_ADDRESS PhysicalAddress,
|
||||
_In_ SIZE_T NumberOfBytes,
|
||||
_In_ MEMORY_CACHING_TYPE CacheType,
|
||||
_In_ ULONG Protect
|
||||
);
|
||||
extern MapIoSpaceFunc *MapIoSpace;
|
@ -272,12 +272,14 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="BaseObject.h" />
|
||||
<ClInclude Include="compat.h" />
|
||||
<ClInclude Include="driver.h" />
|
||||
<ClInclude Include="QxlDod.h" />
|
||||
<ClInclude Include="resource.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="BaseObject.cpp" />
|
||||
<ClCompile Include="compat.cpp" />
|
||||
<ClCompile Include="driver.cpp" />
|
||||
<ClCompile Include="mspace.c" />
|
||||
<ClCompile Include="QxlDod.cpp" />
|
||||
|
@ -25,6 +25,9 @@
|
||||
<ClInclude Include="resource.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="compat.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="driver.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@ -36,6 +39,9 @@
|
||||
<ClCompile Include="BaseObject.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="compat.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="driver.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
Loading…
Reference in New Issue
Block a user