[Spice-devel] [PATCH qxl-wddm-dod v5 2/7] Code Analysis fix

Dmitry Fleytman dmitry at daynix.com
Tue Sep 27 10:01:22 UTC 2016


> On 27 Sep 2016, at 12:35 PM, Christophe Fergeau <cfergeau at redhat.com> wrote:
> 
> Hey,
> 
> A huge part of this patch is adding +__declspec(code_seg("PAGE"))  (and
> removing #pragma code_seg()), which are probably related to this macro,
> but which are added with no rationale.
> The shortlog should probably be something different than "code analysis
> fix", but more somethnig like "Use PAGED_CODE() at the beginning of each
> pageable method".
> Is it possible/desirable to prevent these methods from ending in
> pageable memory?

Hi Christophe,

#pragma code_seg() and __declspec(codes()) are interchangeable,
in this specific case __declspec is more convenient.

PAGED_CODE() is a run-time assertion to make sure that these functions are not used in high IRQL.

I think you’re right and commit message should be improved.

Ans answering your last question, it is desirable to have these functions in paged area to save non-pageable memory.

~Dmitry

> 
> Christophe
> 
> On Mon, Sep 26, 2016 at 04:00:06PM +0300, Sameeh Jubran wrote:
>> The PAGED_CODE macro ensures that the calling thread is running at an
>> IRQL that is low enough to permit paging. A call to this macro should
>> be made at the beginning of every driver routine that either contains
>> pageable code or accesses pageable code.
>> 
>> Based on a patch by Sandy Stutsman <sstutsma at redhat.com>
>> 
>> Signed-off-by: Sameeh Jubran <sameeh at daynix.com>
>> ---
>> qxldod/QxlDod.cpp | 224 ++++++++++++++++++++++++++++++++++++++++++++++++------
>> qxldod/QxlDod.h   | 149 ++++++++++++++++++++++++++++++++++--
>> 2 files changed, 344 insertions(+), 29 deletions(-)
>> 
>> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
>> index 798b2f0..136daf7 100755
>> --- a/qxldod/QxlDod.cpp
>> +++ b/qxldod/QxlDod.cpp
>> @@ -2,8 +2,6 @@
>> #include "qxldod.h"
>> #include "qxl_windows.h"
>> 
>> -#pragma code_seg(push)
>> -#pragma code_seg()
>> 
>> #define WIN_QXL_INT_MASK ((QXL_INTERRUPT_DISPLAY) | \
>>                           (QXL_INTERRUPT_CURSOR) | \
>> @@ -47,7 +45,6 @@ BYTE PixelMask[BITS_PER_BYTE]  = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
>>                                        ((ULONG)LOWER_5_BITS((Pixel)) << SHIFT_LOWER_5_IN_565_BACK))
>> 
>> 
>> -#pragma code_seg(pop)
>> 
>> struct QXLEscape {
>>     uint32_t ioctl;
>> @@ -57,10 +54,12 @@ struct QXLEscape {
>>     };
>> };
>> 
>> +__declspec(code_seg("PAGE"))
>> QxlDod::QxlDod(_In_ DEVICE_OBJECT* pPhysicalDeviceObject) : m_pPhysicalDevice(pPhysicalDeviceObject),
>>                                                             m_MonitorPowerState(PowerDeviceD0),
>>                                                             m_AdapterPowerState(PowerDeviceD0)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_INFORMATION, ("---> %s\n", __FUNCTION__));
>>     *((UINT*)&m_Flags) = 0;
>>     RtlZeroMemory(&m_DxgkInterface, sizeof(m_DxgkInterface));
>> @@ -71,7 +70,7 @@ QxlDod::QxlDod(_In_ DEVICE_OBJECT* pPhysicalDeviceObject) : m_pPhysicalDevice(pP
>>     DbgPrint(TRACE_LEVEL_INFORMATION, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> -
>> +__declspec(code_seg("PAGE"))
>> QxlDod::~QxlDod(void)
>> {
>>     PAGED_CODE();
>> @@ -80,6 +79,7 @@ QxlDod::~QxlDod(void)
>>     m_pHWDevice = NULL;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::CheckHardware()
>> {
>>     PAGED_CODE();
>> @@ -117,6 +117,7 @@ NTSTATUS QxlDod::CheckHardware()
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::StartDevice(_In_  DXGK_START_INFO*   pDxgkStartInfo,
>>                          _In_  DXGKRNL_INTERFACE* pDxgkInterface,
>>                          _Out_ ULONG*             pNumberOfViews,
>> @@ -207,6 +208,7 @@ NTSTATUS QxlDod::StartDevice(_In_  DXGK_START_INFO*   pDxgkStartInfo,
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::StopDevice(VOID)
>> {
>>     PAGED_CODE();
>> @@ -214,6 +216,7 @@ NTSTATUS QxlDod::StopDevice(VOID)
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID QxlDod::CleanUp(VOID)
>> {
>>     PAGED_CODE();
>> @@ -228,7 +231,7 @@ VOID QxlDod::CleanUp(VOID)
>>     }
>> }
>> 
>> -
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::DispatchIoRequest(_In_  ULONG VidPnSourceId,
>>                                    _In_  VIDEO_REQUEST_PACKET* pVideoRequestPacket)
>> {
>> @@ -240,11 +243,13 @@ NTSTATUS QxlDod::DispatchIoRequest(_In_  ULONG VidPnSourceId,
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> PCHAR
>> DbgDevicePowerString(
>>     __in DEVICE_POWER_STATE Type
>>     )
>> {
>> +    PAGED_CODE();
>>     switch (Type)
>>     {
>>     case PowerDeviceUnspecified:
>> @@ -264,11 +269,13 @@ DbgDevicePowerString(
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> PCHAR
>> DbgPowerActionString(
>>     __in POWER_ACTION Type
>>     )
>> {
>> +    PAGED_CODE();
>>     switch (Type)
>>     {
>>     case PowerActionNone:
>> @@ -292,6 +299,7 @@ DbgPowerActionString(
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::SetPowerState(_In_  ULONG HardwareUid,
>>                                _In_  DEVICE_POWER_STATE DevicePowerState,
>>                                _In_  POWER_ACTION       ActionType)
>> @@ -325,6 +333,7 @@ NTSTATUS QxlDod::SetPowerState(_In_  ULONG HardwareUid,
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::QueryChildRelations(_Out_writes_bytes_(ChildRelationsSize) DXGK_CHILD_DESCRIPTOR* pChildRelations,
>>                                      _In_  ULONG  ChildRelationsSize)
>> {
>> @@ -354,6 +363,7 @@ NTSTATUS QxlDod::QueryChildRelations(_Out_writes_bytes_(ChildRelationsSize) DXGK
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::QueryChildStatus(_Inout_ DXGK_CHILD_STATUS* pChildStatus,
>>                                                 _In_    BOOLEAN            NonDestructiveOnly)
>> {
>> @@ -389,6 +399,7 @@ NTSTATUS QxlDod::QueryChildStatus(_Inout_ DXGK_CHILD_STATUS* pChildStatus,
>> }
>> 
>> // EDID retrieval
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::QueryDeviceDescriptor(_In_    ULONG                   ChildUid,
>>                                        _Inout_ DXGK_DEVICE_DESCRIPTOR* pDeviceDescriptor)
>> {
>> @@ -401,6 +412,7 @@ NTSTATUS QxlDod::QueryDeviceDescriptor(_In_    ULONG                   ChildUid,
>>     return STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO* pQueryAdapterInfo)
>> {
>>     PAGED_CODE();
>> @@ -445,6 +457,7 @@ NTSTATUS QxlDod::QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO* pQueryAda
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition)
>> {
>>     PAGED_CODE();
>> @@ -463,6 +476,7 @@ NTSTATUS QxlDod::SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetP
>> 
>> // Basic Sample Display Driver does not support hardware cursors, and reports such
>> // in QueryAdapterInfo. Therefore this function should never be called.
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape)
>> {
>>     PAGED_CODE();
>> @@ -473,6 +487,7 @@ NTSTATUS QxlDod::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointer
>>     return m_pHWDevice->SetPointerShape(pSetPointerShape);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::Escape(_In_ CONST DXGKARG_ESCAPE* pEscape)
>> {
>>     PAGED_CODE();
>> @@ -486,7 +501,7 @@ NTSTATUS QxlDod::Escape(_In_ CONST DXGKARG_ESCAPE* pEscape)
>>     return Status;
>> }
>> 
>> -
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::PresentDisplayOnly(_In_ CONST DXGKARG_PRESENT_DISPLAYONLY* pPresentDisplayOnly)
>> {
>>     PAGED_CODE();
>> @@ -548,6 +563,7 @@ NTSTATUS QxlDod::PresentDisplayOnly(_In_ CONST DXGKARG_PRESENT_DISPLAYONLY* pPre
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::QueryInterface(_In_ CONST PQUERY_INTERFACE pQueryInterface)
>> {
>>     PAGED_CODE();
>> @@ -558,6 +574,7 @@ NTSTATUS QxlDod::QueryInterface(_In_ CONST PQUERY_INTERFACE pQueryInterface)
>>     return STATUS_NOT_SUPPORTED;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::StopDeviceAndReleasePostDisplayOwnership(_In_  D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
>>                                                           _Out_ DXGK_DISPLAY_INFORMATION*      pDisplayInfo)
>> {
>> @@ -582,7 +599,7 @@ NTSTATUS QxlDod::StopDeviceAndReleasePostDisplayOwnership(_In_  D3DDDI_VIDEO_PRE
>>     return StopDevice();
>> }
>> 
>> -
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::QueryVidPnHWCapability(_Inout_ DXGKARG_QUERYVIDPNHWCAPABILITY* pVidPnHWCaps)
>> {
>>     PAGED_CODE();
>> @@ -606,6 +623,7 @@ NTSTATUS QxlDod::QueryVidPnHWCapability(_Inout_ DXGKARG_QUERYVIDPNHWCAPABILITY*
>> 
>> 
>> // TODO: Need to also check pinned modes and the path parameters, not just topology
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::IsSupportedVidPn(_Inout_ DXGKARG_ISSUPPORTEDVIDPN* pIsSupportedVidPn)
>> {
>>     PAGED_CODE();
>> @@ -668,6 +686,7 @@ NTSTATUS QxlDod::IsSupportedVidPn(_Inout_ DXGKARG_ISSUPPORTEDVIDPN* pIsSupported
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::RecommendFunctionalVidPn(_In_ CONST DXGKARG_RECOMMENDFUNCTIONALVIDPN* CONST pRecommendFunctionalVidPn)
>> {
>>     PAGED_CODE();
>> @@ -678,6 +697,7 @@ NTSTATUS QxlDod::RecommendFunctionalVidPn(_In_ CONST DXGKARG_RECOMMENDFUNCTIONAL
>>     return STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::RecommendVidPnTopology(_In_ CONST DXGKARG_RECOMMENDVIDPNTOPOLOGY* CONST pRecommendVidPnTopology)
>> {
>>     PAGED_CODE();
>> @@ -688,6 +708,7 @@ NTSTATUS QxlDod::RecommendVidPnTopology(_In_ CONST DXGKARG_RECOMMENDVIDPNTOPOLOG
>>     return STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::RecommendMonitorModes(_In_ CONST DXGKARG_RECOMMENDMONITORMODES* CONST pRecommendMonitorModes)
>> {
>>     PAGED_CODE();
>> @@ -696,7 +717,7 @@ NTSTATUS QxlDod::RecommendMonitorModes(_In_ CONST DXGKARG_RECOMMENDMONITORMODES*
>>     return AddSingleMonitorMode(pRecommendMonitorModes);
>> }
>> 
>> -
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::AddSingleSourceMode(_In_ CONST DXGK_VIDPNSOURCEMODESET_INTERFACE* pVidPnSourceModeSetInterface,
>>                                                    D3DKMDT_HVIDPNSOURCEMODESET hVidPnSourceModeSet,
>>                                                    D3DDDI_VIDEO_PRESENT_SOURCE_ID SourceId)
>> @@ -753,6 +774,7 @@ NTSTATUS QxlDod::AddSingleSourceMode(_In_ CONST DXGK_VIDPNSOURCEMODESET_INTERFAC
>> }
>> 
>> // Add the current mode information (acquired from the POST frame buffer) as the target mode.
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::AddSingleTargetMode(_In_ CONST DXGK_VIDPNTARGETMODESET_INTERFACE* pVidPnTargetModeSetInterface,
>>                                                    D3DKMDT_HVIDPNTARGETMODESET hVidPnTargetModeSet,
>>                                                    _In_opt_ CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnPinnedSourceModeInfo,
>> @@ -805,7 +827,7 @@ NTSTATUS QxlDod::AddSingleTargetMode(_In_ CONST DXGK_VIDPNTARGETMODESET_INTERFAC
>>     return STATUS_SUCCESS;
>> }
>> 
>> -
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::AddSingleMonitorMode(_In_ CONST DXGKARG_RECOMMENDMONITORMODES* CONST pRecommendMonitorModes)
>> {
>>     PAGED_CODE();
>> @@ -925,6 +947,7 @@ NTSTATUS QxlDod::AddSingleMonitorMode(_In_ CONST DXGKARG_RECOMMENDMONITORMODES*
>> }
>> 
>> // Tell DMM about all the modes, etc. that are supported
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::EnumVidPnCofuncModality(_In_ CONST DXGKARG_ENUMVIDPNCOFUNCMODALITY* CONST pEnumCofuncModality)
>> {
>>     PAGED_CODE();
>> @@ -1283,6 +1306,7 @@ NTSTATUS QxlDod::EnumVidPnCofuncModality(_In_ CONST DXGKARG_ENUMVIDPNCOFUNCMODAL
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::SetVidPnSourceVisibility(_In_ CONST DXGKARG_SETVIDPNSOURCEVISIBILITY* pSetVidPnSourceVisibility)
>> {
>>     PAGED_CODE();
>> @@ -1315,6 +1339,7 @@ NTSTATUS QxlDod::SetVidPnSourceVisibility(_In_ CONST DXGKARG_SETVIDPNSOURCEVISIB
>> 
>> // NOTE: The value of pCommitVidPn->MonitorConnectivityChecks is ignored, since BDD is unable to recognize whether a monitor is connected or not
>> // The value of pCommitVidPn->hPrimaryAllocation is also ignored, since BDD is a display only driver and does not deal with allocations
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::CommitVidPn(_In_ CONST DXGKARG_COMMITVIDPN* CONST pCommitVidPn)
>> {
>>     PAGED_CODE();
>> @@ -1473,7 +1498,7 @@ NTSTATUS QxlDod::CommitVidPn(_In_ CONST DXGKARG_COMMITVIDPN* CONST pCommitVidPn)
>> 
>> CommitVidPnExit:
>> 
>> -    NTSTATUS TempStatus;
>> +    NTSTATUS TempStatus(STATUS_SUCCESS);
>>     UNREFERENCED_PARAMETER(TempStatus);
>> 
>>     if ((pVidPnSourceModeSetInterface != NULL) &&
>> @@ -1504,6 +1529,7 @@ CommitVidPnExit:
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::SetSourceModeAndPath(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode,
>>                                                     CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath)
>> {
>> @@ -1559,6 +1585,7 @@ NTSTATUS QxlDod::SetSourceModeAndPath(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMo
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::IsVidPnPathFieldsValid(CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath) const
>> {
>>     PAGED_CODE();
>> @@ -1607,6 +1634,7 @@ NTSTATUS QxlDod::IsVidPnPathFieldsValid(CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath)
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::IsVidPnSourceModeFieldsValid(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode) const
>> {
>>     PAGED_CODE();
>> @@ -1638,6 +1666,7 @@ NTSTATUS QxlDod::IsVidPnSourceModeFieldsValid(CONST D3DKMDT_VIDPN_SOURCE_MODE* p
>>     return STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::UpdateActiveVidPnPresentPath(_In_ CONST DXGKARG_UPDATEACTIVEVIDPNPRESENTPATH* CONST pUpdateActiveVidPnPresentPath)
>> {
>>     PAGED_CODE();
>> @@ -1663,8 +1692,6 @@ NTSTATUS QxlDod::UpdateActiveVidPnPresentPath(_In_ CONST DXGKARG_UPDATEACTIVEVID
>> //
>> // Non-Paged Code
>> //
>> -#pragma code_seg(push)
>> -#pragma code_seg()
>> 
>> VOID QxlDod::DpcRoutine(VOID)
>> {
>> @@ -1789,8 +1816,8 @@ VOID QxlDod::SystemDisplayWrite(_In_reads_bytes_(SourceHeight * SourceStride) VO
>> 
>> }
>> 
>> -#pragma code_seg(pop) // End Non-Paged Code
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::WriteHWInfoStr(_In_ HANDLE DevInstRegKeyHandle, _In_ PCWSTR pszwValueName, _In_ PCSTR pszValue)
>> {
>>     PAGED_CODE();
>> @@ -1834,7 +1861,8 @@ NTSTATUS QxlDod::WriteHWInfoStr(_In_ HANDLE DevInstRegKeyHandle, _In_ PCWSTR psz
>>     return Status;
>> }
>> 
>> -NTSTATUS QxlDod::RegisterHWInfo(ULONG Id)
>> +__declspec(code_seg("PAGE"))
>> +NTSTATUS QxlDod::RegisterHWInfo(_In_ ULONG Id)
>> {
>>     PAGED_CODE();
>> 
>> @@ -1913,6 +1941,7 @@ NTSTATUS QxlDod::RegisterHWInfo(ULONG Id)
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDod::ReadConfiguration()
>> {
>>     PAGED_CODE();
>> @@ -1967,8 +1996,6 @@ NTSTATUS QxlDod::ReadConfiguration()
>> //
>> // Non-Paged Code
>> //
>> -#pragma code_seg(push)
>> -#pragma code_seg()
>> D3DDDI_VIDEO_PRESENT_SOURCE_ID QxlDod::FindSourceForTarget(D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId, BOOLEAN DefaultToZero)
>> {
>>     UNREFERENCED_PARAMETER(TargetId);
>> @@ -1983,12 +2010,10 @@ D3DDDI_VIDEO_PRESENT_SOURCE_ID QxlDod::FindSourceForTarget(D3DDDI_VIDEO_PRESENT_
>>     return DefaultToZero ? 0 : D3DDDI_ID_UNINITIALIZED;
>> }
>> 
>> -#pragma code_seg(pop) // End Non-Paged Code
>> -
>> //
>> // Frame buffer map/unmap
>> //
>> -
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS
>> MapFrameBuffer(
>>     _In_                       PHYSICAL_ADDRESS    PhysicalAddress,
>> @@ -2041,6 +2066,7 @@ MapFrameBuffer(
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS
>> UnmapFrameBuffer(
>>     _In_reads_bytes_(Length) VOID* VirtualAddress,
>> @@ -2343,8 +2369,10 @@ VOID BltBits (
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VgaDevice::VgaDevice(_In_ QxlDod* pQxlDod)
>> {
>> +    PAGED_CODE();
>>     m_pQxlDod = pQxlDod;
>>     m_ModeInfo = NULL;
>>     m_ModeCount = 0;
>> @@ -2353,8 +2381,10 @@ VgaDevice::VgaDevice(_In_ QxlDod* pQxlDod)
>>     m_Id = 0;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VgaDevice::~VgaDevice(void)
>> {
>> +    PAGED_CODE();
>>     HWClose();
>>     delete [] reinterpret_cast<BYTE*>(m_ModeInfo);
>>     delete [] reinterpret_cast<BYTE*>(m_ModeNumbers);
>> @@ -2365,6 +2395,7 @@ VgaDevice::~VgaDevice(void)
>>     m_Id = 0;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> BOOL VgaDevice::SetVideoModeInfo(UINT Idx, PVBE_MODEINFO pModeInfo)
>> {
>>     PVIDEO_MODE_INFORMATION pMode = NULL;
>> @@ -2402,6 +2433,7 @@ BOOL VgaDevice::SetVideoModeInfo(UINT Idx, PVBE_MODEINFO pModeInfo)
>>     return TRUE;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
>> {
>>     PAGED_CODE();
>> @@ -2593,8 +2625,10 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS VgaDevice::QueryCurrentMode(PVIDEO_MODE RequestedMode)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>>     NTSTATUS Status = STATUS_SUCCESS;
>>     UNREFERENCED_PARAMETER(RequestedMode);
>> @@ -2602,8 +2636,11 @@ NTSTATUS VgaDevice::QueryCurrentMode(PVIDEO_MODE RequestedMode)
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS VgaDevice::SetCurrentMode(ULONG Mode)
>> {
>> +    PAGED_CODE();
>> +
>>     NTSTATUS Status = STATUS_SUCCESS;
>>     DbgPrint(TRACE_LEVEL_INFORMATION, ("---> %s Mode = %x\n", __FUNCTION__, Mode));
>>     X86BIOS_REGISTERS regs = {0};
>> @@ -2618,8 +2655,11 @@ NTSTATUS VgaDevice::SetCurrentMode(ULONG Mode)
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS VgaDevice::GetCurrentMode(ULONG* pMode)
>> {
>> +    PAGED_CODE();
>> +
>>     NTSTATUS Status = STATUS_SUCCESS;
>>     DbgPrint(TRACE_LEVEL_INFORMATION, ("---> %s\n", __FUNCTION__));
>>     X86BIOS_REGISTERS regs = {0};
>> @@ -2634,8 +2674,11 @@ NTSTATUS VgaDevice::GetCurrentMode(ULONG* pMode)
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS VgaDevice::HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo)
>> {
>> +    PAGED_CODE();
>> +
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     UNREFERENCED_PARAMETER(pResList);
>>     UNREFERENCED_PARAMETER(pDispInfo);
>> @@ -2643,15 +2686,21 @@ NTSTATUS VgaDevice::HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION*
>>     return GetModeList(pDispInfo);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS VgaDevice::HWClose(void)
>> {
>> +    PAGED_CODE();
>> +
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>>     return STATUS_SUCCESS;
>> }
>> 
>> -NTSTATUS VgaDevice::SetPowerState(_In_  DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo)
>> +__declspec(code_seg("PAGE"))
>> +NTSTATUS VgaDevice::SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo)
>> {
>> +    PAGED_CODE();
>> +
>>     DbgPrint(TRACE_LEVEL_INFORMATION, ("---> %s\n", __FUNCTION__));
>> 
>>     X86BIOS_REGISTERS regs = {0};
>> @@ -2674,7 +2723,7 @@ NTSTATUS VgaDevice::SetPowerState(_In_  DEVICE_POWER_STATE DevicePowerState, DXG
>>     return STATUS_SUCCESS;
>> }
>> 
>> -
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS
>> VgaDevice::ExecutePresentDisplayOnly(
>>     _In_ BYTE*             DstAddr,
>> @@ -2876,6 +2925,7 @@ VgaDevice::ExecutePresentDisplayOnly(
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID VgaDevice::BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod)
>> {
>>     PAGED_CODE();
>> @@ -2941,27 +2991,35 @@ VOID VgaDevice::ResetDevice(VOID)
>> {
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS  VgaDevice::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape)
>> {
>> +    PAGED_CODE();
>>     UNREFERENCED_PARAMETER(pSetPointerShape);
>>     return STATUS_NOT_SUPPORTED;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS VgaDevice::SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition)
>> {
>> +    PAGED_CODE();
>>     UNREFERENCED_PARAMETER(pSetPointerPosition);
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS VgaDevice::Escape(_In_ CONST DXGKARG_ESCAPE* pEscap)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>>     return STATUS_NOT_IMPLEMENTED;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> QxlDevice::QxlDevice(_In_ QxlDod* pQxlDod)
>> {
>> +    PAGED_CODE();
>>     m_pQxlDod = pQxlDod;
>>     m_ModeInfo = NULL;
>>     m_ModeCount = 0;
>> @@ -2972,8 +3030,10 @@ QxlDevice::QxlDevice(_In_ QxlDod* pQxlDod)
>>     m_Pending = 0;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> QxlDevice::~QxlDevice(void)
>> {
>> +    PAGED_CODE();
>>     HWClose();
>>     delete [] reinterpret_cast<BYTE*>(m_ModeInfo);
>>     delete [] reinterpret_cast<BYTE*>(m_ModeNumbers);
>> @@ -2983,6 +3043,7 @@ QxlDevice::~QxlDevice(void)
>>     m_ModeCount = 0;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> BOOL QxlDevice::SetVideoModeInfo(UINT Idx, QXLMode* pModeInfo)
>> {
>>     PVIDEO_MODE_INFORMATION pMode = NULL;
>> @@ -3016,6 +3077,7 @@ BOOL QxlDevice::SetVideoModeInfo(UINT Idx, QXLMode* pModeInfo)
>>     return TRUE;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::UpdateVideoModeInfo(UINT Idx, UINT xres, UINT yres, UINT bpp)
>> {
>>     PVIDEO_MODE_INFORMATION pMode = NULL;
>> @@ -3038,6 +3100,7 @@ void QxlDevice::UpdateVideoModeInfo(UINT Idx, UINT xres, UINT yres, UINT bpp)
>>     pMode->RedMask = pMode->GreenMask << color_bits;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
>> {
>>     PAGED_CODE();
>> @@ -3145,14 +3208,17 @@ NTSTATUS QxlDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::QueryCurrentMode(PVIDEO_MODE RequestedMode)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>>     NTSTATUS Status = STATUS_SUCCESS;
>>     UNREFERENCED_PARAMETER(RequestedMode);
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::SetCurrentMode(ULONG Mode)
>> {
>>     PAGED_CODE();
>> @@ -3173,6 +3239,7 @@ NTSTATUS QxlDevice::SetCurrentMode(ULONG Mode)
>>     return STATUS_UNSUCCESSFUL;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::GetCurrentMode(ULONG* pMode)
>> {
>>     PAGED_CODE();
>> @@ -3183,8 +3250,10 @@ NTSTATUS QxlDevice::GetCurrentMode(ULONG* pMode)
>>     return Status;
>> }
>> 
>> -NTSTATUS QxlDevice::SetPowerState(_In_ DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo)
>> +__declspec(code_seg("PAGE"))
>> +NTSTATUS QxlDevice::SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     switch (DevicePowerState)
>>     {
>> @@ -3198,8 +3267,10 @@ NTSTATUS QxlDevice::SetPowerState(_In_ DEVICE_POWER_STATE DevicePowerState, DXGK
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     PDXGKRNL_INTERFACE pDxgkInterface = m_pQxlDod->GetDxgkInterface();
>>     UINT pci_range = QXL_RAM_RANGE_INDEX;
>> @@ -3345,8 +3416,10 @@ NTSTATUS QxlDevice::HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION*
>>     return QxlInit(pDispInfo);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::QxlInit(DXGK_DISPLAY_INFORMATION* pDispInfo)
>> {
>> +    PAGED_CODE();
>>     NTSTATUS Status = STATUS_SUCCESS;
>> 
>>     if (!InitMemSlots()) {
>> @@ -3372,13 +3445,17 @@ NTSTATUS QxlDevice::QxlInit(DXGK_DISPLAY_INFORMATION* pDispInfo)
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::QxlClose()
>> {
>> +    PAGED_CODE();
>>     DestroyMemSlots();
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::UnmapMemory(void)
>> {
>> +    PAGED_CODE();
>>     PDXGKRNL_INTERFACE pDxgkInterface = m_pQxlDod->GetDxgkInterface();
>>     if (m_IoMapped && m_IoBase)
>>     {
>> @@ -3404,8 +3481,10 @@ void QxlDevice::UnmapMemory(void)
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> BOOL QxlDevice::InitMemSlots(void)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     m_NumMemSlots = m_RomHdr->slots_end;
>>     m_SlotGenBits = m_RomHdr->slot_gen_bits;
>> @@ -3423,14 +3502,17 @@ BOOL QxlDevice::InitMemSlots(void)
>>     return FALSE;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::DestroyMemSlots(void)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     delete [] reinterpret_cast<BYTE*>(m_MemSlots);
>>     m_MemSlots = NULL;
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::CreatePrimarySurface(PVIDEO_MODE_INFORMATION pModeInfo)
>> {
>>     PAGED_CODE();
>> @@ -3454,23 +3536,29 @@ void QxlDevice::CreatePrimarySurface(PVIDEO_MODE_INFORMATION pModeInfo)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::DestroyPrimarySurface(void)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> //    AsyncIo(QXL_IO_DESTROY_PRIMARY_ASYNC, 0);
>>     SyncIo(QXL_IO_DESTROY_PRIMARY, 0);
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> _inline QXLPHYSICAL QxlDevice::PA(PVOID virt, UINT8 slot_id)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--> %s\n", __FUNCTION__));
>>     MemSlot *pSlot = &m_MemSlots[slot_id];
>>     return pSlot->high_bits | ((UINT64)virt - pSlot->start_virt_addr);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> _inline UINT64 QxlDevice::VA(QXLPHYSICAL paddr, UINT8 slot_id)
>> {
>> +    PAGED_CODE();
>>     UINT64 virt;
>>     MemSlot *pSlot = &m_MemSlots[slot_id];
>> 
>> @@ -3481,8 +3569,10 @@ _inline UINT64 QxlDevice::VA(QXLPHYSICAL paddr, UINT8 slot_id)
>>     return virt;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::SetupHWSlot(UINT8 Idx, MemSlot *pSlot)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     m_RamHdr->mem_slot.mem_start = pSlot->start_phys_addr;
>>     m_RamHdr->mem_slot.mem_end = pSlot->end_phys_addr;
>> @@ -3490,8 +3580,10 @@ void QxlDevice::SetupHWSlot(UINT8 Idx, MemSlot *pSlot)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<---> %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> BOOL QxlDevice::CreateEvents()
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     KeInitializeEvent(&m_DisplayEvent,
>>                       SynchronizationEvent,
>> @@ -3511,8 +3603,10 @@ BOOL QxlDevice::CreateEvents()
>>     return TRUE;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> BOOL QxlDevice::CreateRings()
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     m_CommandRing = &(m_RamHdr->cmd_ring);
>>     m_CursorRing = &(m_RamHdr->cursor_ring);
>> @@ -3521,8 +3615,10 @@ BOOL QxlDevice::CreateRings()
>>     return TRUE;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::AsyncIo(UCHAR  Port, UCHAR Value)
>> {
>> +    PAGED_CODE();
>>     LARGE_INTEGER timeout;
>>     BOOLEAN locked = FALSE;
>>     locked = WaitForObject(&m_IoLock, NULL);
>> @@ -3532,16 +3628,20 @@ void QxlDevice::AsyncIo(UCHAR  Port, UCHAR Value)
>>     ReleaseMutex(&m_IoLock, locked);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::SyncIo(UCHAR  Port, UCHAR Value)
>> {
>> +    PAGED_CODE();
>>     BOOLEAN locked = FALSE;
>>     locked = WaitForObject(&m_IoLock, NULL);
>>     WRITE_PORT_UCHAR(m_IoBase + Port, Value);
>>     ReleaseMutex(&m_IoLock, locked);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> UINT8 QxlDevice::SetupMemSlot(UINT8 Idx, UINT64 pastart, UINT64 paend, UINT64 vastart, UINT64 vaend)
>> {
>> +    PAGED_CODE();
>>     UINT64 high_bits;
>>     MemSlot *pSlot;
>>     UINT8 slot_index;
>> @@ -3565,8 +3665,10 @@ UINT8 QxlDevice::SetupMemSlot(UINT8 Idx, UINT64 pastart, UINT64 paend, UINT64 va
>>     return slot_index;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> BOOL QxlDevice::CreateMemSlots(void)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s 3\n", __FUNCTION__));
>>     UINT64 len = m_RomHdr->surface0_area_size + m_RomHdr->num_pages * PAGE_SIZE;
>>     m_MainMemSlot = SetupMemSlot(0,
>> @@ -3584,6 +3686,7 @@ BOOL QxlDevice::CreateMemSlots(void)
>>     return TRUE;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::InitDeviceMemoryResources(void)
>> {
>>     PAGED_CODE();
>> @@ -3593,6 +3696,7 @@ void QxlDevice::InitDeviceMemoryResources(void)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::InitMonitorConfig(void)
>> {
>>     PAGED_CODE();
>> @@ -3604,8 +3708,10 @@ void QxlDevice::InitMonitorConfig(void)
>>     *m_monitor_config_pa = PA(m_monitor_config, m_MainMemSlot);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::InitMspace(UINT32 mspace_type, UINT8 *start, size_t capacity)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s type = %d, start = %p, capacity = %d\n", __FUNCTION__, mspace_type, start, capacity));
>>     m_MSInfo[mspace_type]._mspace = create_mspace_with_base(start, capacity, 0, this);
>>     m_MSInfo[mspace_type].mspace_start = start;
>> @@ -3621,6 +3727,7 @@ void QxlDevice::ResetDevice(void)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS
>> QxlDevice::ExecutePresentDisplayOnly(
>>     _In_ BYTE*             DstAddr,
>> @@ -3809,8 +3916,10 @@ QxlDevice::ExecutePresentDisplayOnly(
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::WaitForReleaseRing(void)
>> {
>> +    PAGED_CODE();
>>     int wait;
>> 
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("--->%s\n", __FUNCTION__));
>> @@ -3841,8 +3950,10 @@ void QxlDevice::WaitForReleaseRing(void)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("%s: <---\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::FlushReleaseRing()
>> {
>> +    PAGED_CODE();
>>     UINT64 output;
>>     int notify;
>>     int num_to_release = 50;
>> @@ -3872,8 +3983,10 @@ void QxlDevice::FlushReleaseRing()
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::EmptyReleaseRing()
>> {
>> +    PAGED_CODE();
>>     BOOLEAN locked = FALSE;
>>     locked = WaitForObject(&m_MemLock, NULL);
>>     while (m_FreeOutputs || !SPICE_RING_IS_EMPTY(m_ReleaseRing)) {
>> @@ -3882,8 +3995,10 @@ void QxlDevice::EmptyReleaseRing()
>>     ReleaseMutex(&m_MemLock, locked);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> UINT64 QxlDevice::ReleaseOutput(UINT64 output_id)
>> {
>> +    PAGED_CODE();
>>     QXLOutput *output = (QXLOutput *)output_id;
>>     Resource **now;
>>     Resource **end;
>> @@ -3901,8 +4016,10 @@ UINT64 QxlDevice::ReleaseOutput(UINT64 output_id)
>>     return next;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void *QxlDevice::AllocMem(UINT32 mspace_type, size_t size, BOOL force)
>> {
>> +    PAGED_CODE();
>>     PVOID ptr;
>>     BOOLEAN locked = FALSE;
>> 
>> @@ -3949,8 +4066,10 @@ void *QxlDevice::AllocMem(UINT32 mspace_type, size_t size, BOOL force)
>>     return ptr;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::FreeMem(UINT32 mspace_type, void *ptr)
>> {
>> +    PAGED_CODE();
>>     ASSERT(m_MSInfo[mspace_type]._mspace);
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> 
>> @@ -3969,8 +4088,10 @@ void QxlDevice::FreeMem(UINT32 mspace_type, void *ptr)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> QXLDrawable *QxlDevice::GetDrawable()
>> {
>> +    PAGED_CODE();
>>     QXLOutput *output;
>> 
>>     output = (QXLOutput *)AllocMem(MSPACE_TYPE_VRAM, sizeof(QXLOutput) + sizeof(QXLDrawable), TRUE);
>> @@ -3981,8 +4102,10 @@ QXLDrawable *QxlDevice::GetDrawable()
>>     return(QXLDrawable *)output->data;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> QXLCursorCmd *QxlDevice::CursorCmd()
>> {
>> +    PAGED_CODE();
>>     QXLCursorCmd *cursor_cmd;
>>     QXLOutput *output;
>> 
>> @@ -3996,8 +4119,10 @@ QXLCursorCmd *QxlDevice::CursorCmd()
>>     return cursor_cmd;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> BOOL QxlDevice::SetClip(const RECT *clip, QXLDrawable *drawable)
>> {
>> +    PAGED_CODE();
>>     Resource *rects_res;
>> 
>>     if (clip == NULL) {
>> @@ -4025,37 +4150,47 @@ BOOL QxlDevice::SetClip(const RECT *clip, QXLDrawable *drawable)
>>     return TRUE;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::AddRes(QXLOutput *output, Resource *res)
>> {
>> +    PAGED_CODE();
>>     res->refs++;
>>     output->resources[output->num_res++] = res;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::DrawableAddRes(QXLDrawable *drawable, Resource *res)
>> {
>> +    PAGED_CODE();
>>     QXLOutput *output;
>> 
>>     output = (QXLOutput *)((UINT8 *)drawable - sizeof(QXLOutput));
>>     AddRes(output, res);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::CursorCmdAddRes(QXLCursorCmd *cmd, Resource *res)
>> {
>> +    PAGED_CODE();
>>     QXLOutput *output;
>> 
>>     output = (QXLOutput *)((UINT8 *)cmd - sizeof(QXLOutput));
>>     AddRes(output, res);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::FreeClipRectsEx(Resource *res)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--> %s\n", __FUNCTION__));
>>     QxlDevice* pqxl = (QxlDevice*)res->ptr;
>>     pqxl->FreeClipRects(res);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::FreeClipRects(Resource *res)
>> {
>> +    PAGED_CODE();
>>     QXLPHYSICAL chunk_phys;
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> 
>> @@ -4069,15 +4204,19 @@ void QxlDevice::FreeClipRects(Resource *res)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::FreeBitmapImageEx(Resource *res)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--> %s\n", __FUNCTION__));
>>     QxlDevice* pqxl = (QxlDevice*)res->ptr;
>>     pqxl->FreeBitmapImage(res);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::FreeBitmapImage(Resource *res)
>> {
>> +    PAGED_CODE();
>>     InternalImage *internal;
>>     QXLPHYSICAL chunk_phys;
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> @@ -4095,15 +4234,19 @@ void QxlDevice::FreeBitmapImage(Resource *res)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::FreeCursorEx(Resource *res)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--> %s\n", __FUNCTION__));
>>     QxlDevice* pqxl = (QxlDevice*)res->ptr;
>>     pqxl->FreeCursor(res);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::FreeCursor(Resource *res)
>> {
>> +    PAGED_CODE();
>>     QXLPHYSICAL chunk_phys;
>> 
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> @@ -4118,8 +4261,10 @@ void QxlDevice::FreeCursor(Resource *res)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> QXLDrawable *QxlDevice::Drawable(UINT8 type, CONST RECT *area, CONST RECT *clip, UINT32 surface_id)
>> {
>> +    PAGED_CODE();
>>     QXLDrawable *drawable;
>> 
>>     ASSERT(area);
>> @@ -4145,7 +4290,10 @@ QXLDrawable *QxlDevice::Drawable(UINT8 type, CONST RECT *area, CONST RECT *clip,
>>     return drawable;
>> }
>> 
>> -void QxlDevice::PushDrawable(QXLDrawable *drawable) {
>> +__declspec(code_seg("PAGE"))
>> +void QxlDevice::PushDrawable(QXLDrawable *drawable)
>> +{
>> +    PAGED_CODE();
>>     QXLCommand *cmd;
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> 
>> @@ -4160,8 +4308,10 @@ void QxlDevice::PushDrawable(QXLDrawable *drawable) {
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::PushCursorCmd(QXLCursorCmd *cursor_cmd)
>> {
>> +    PAGED_CODE();
>>     QXLCommand *cmd;
>> 
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> @@ -4177,12 +4327,14 @@ void QxlDevice::PushCursorCmd(QXLCursorCmd *cursor_cmd)
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID QxlDevice::SetImageId(InternalImage *internal,
>>     BOOL cache_me,
>>     LONG width,
>>     LONG height,
>>     UINT8 format, UINT32 key)
>> {
>> +    PAGED_CODE();
>>     UINT32 image_info = IMAGE_HASH_INIT_VAL(width, height, format);
>> 
>>     if (cache_me) {
>> @@ -4196,6 +4348,7 @@ VOID QxlDevice::SetImageId(InternalImage *internal,
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID QxlDevice::BltBits (
>>     BLT_INFO* pDst,
>>     CONST BLT_INFO* pSrc,
>> @@ -4203,6 +4356,7 @@ VOID QxlDevice::BltBits (
>>     _In_reads_(NumRects) CONST RECT *pRects,
>>     POINT*   pSourcePoint)
>> {
>> +    PAGED_CODE();
>>     QXLDrawable *drawable;
>>     Resource *image_res;
>>     InternalImage *internal;
>> @@ -4296,10 +4450,12 @@ VOID QxlDevice::BltBits (
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +    __declspec(code_seg("PAGE"))
>> VOID QxlDevice::PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr,
>>                             UINT8 **end_ptr, UINT8 *src, int size,
>>                             size_t alloc_size, uint32_t alignment)
>> {
>> +    PAGED_CODE();
>>     QXLDataChunk *chunk = *chunk_ptr;
>>     UINT8 *now = *now_ptr;
>>     UINT8 *end = *end_ptr;
>> @@ -4335,6 +4491,7 @@ VOID QxlDevice::PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr,
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID QxlDevice::BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod)
>> {
>>     QXLDrawable *drawable;
>> @@ -4362,15 +4519,19 @@ VOID QxlDevice::BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod)
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::HWClose(void)
>> {
>> +    PAGED_CODE();
>>     QxlClose();
>>     UnmapMemory();
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS  QxlDevice::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s flag = %x\n", __FUNCTION__, pSetPointerShape->Flags.Value));
>>     DbgPrint(TRACE_LEVEL_INFORMATION, ("<--> %s flag = %d pitch = %d, pixels = %p, id = %d, w = %d, h = %d, x = %d, y = %d\n", __FUNCTION__,
>>                                  pSetPointerShape->Flags.Value,
>> @@ -4452,8 +4613,10 @@ NTSTATUS  QxlDevice::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPoi
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition)
>> {
>> +    PAGED_CODE();
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     DbgPrint(TRACE_LEVEL_INFORMATION, ("<--> %s flag = %d id = %d, x = %d, y = %d\n", __FUNCTION__,
>>                                  pSetPointerPosition->Flags.Value,
>> @@ -4475,6 +4638,7 @@ NTSTATUS QxlDevice::SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pS
>>     return STATUS_SUCCESS;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::UpdateChildStatus(BOOLEAN connect)
>> {
>>     PAGED_CODE();
>> @@ -4489,6 +4653,7 @@ NTSTATUS QxlDevice::UpdateChildStatus(BOOLEAN connect)
>>     return Status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::SetCustomDisplay(QXLEscapeSetCustomDisplay* custom_display)
>> {
>>     PAGED_CODE();
>> @@ -4513,6 +4678,7 @@ NTSTATUS QxlDevice::SetCustomDisplay(QXLEscapeSetCustomDisplay* custom_display)
>>     return status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> void QxlDevice::SetMonitorConfig(QXLHead * monitor_config)
>> {
>>     PAGED_CODE();
>> @@ -4529,8 +4695,10 @@ void QxlDevice::SetMonitorConfig(QXLHead * monitor_config)
>>     AsyncIo(QXL_IO_MONITORS_CONFIG_ASYNC, 0);
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS QxlDevice::Escape(_In_ CONST DXGKARG_ESCAPE* pEscape)
>> {
>> +    PAGED_CODE();
>>     size_t          data_size(sizeof(uint32_t));
>>     QXLEscape*     pQXLEscape((QXLEscape*) pEscape->pPrivateDriverData);
>>     NTSTATUS        status(STATUS_SUCCESS);
>> @@ -4569,8 +4737,10 @@ NTSTATUS QxlDevice::Escape(_In_ CONST DXGKARG_ESCAPE* pEscape)
>>     return status;
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID QxlDevice::WaitForCmdRing()
>> {
>> +    PAGED_CODE();
>>     int wait;
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> 
>> @@ -4585,8 +4755,10 @@ VOID QxlDevice::WaitForCmdRing()
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID QxlDevice::PushCmd()
>> {
>> +    PAGED_CODE();
>>     int notify;
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     SPICE_RING_PUSH(m_CommandRing, notify);
>> @@ -4596,8 +4768,10 @@ VOID QxlDevice::PushCmd()
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s notify = %d\n", __FUNCTION__, notify));
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID QxlDevice::WaitForCursorRing(VOID)
>> {
>> +    PAGED_CODE();
>>     int wait;
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>> 
>> @@ -4618,8 +4792,10 @@ VOID QxlDevice::WaitForCursorRing(VOID)
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> VOID QxlDevice::PushCursor(VOID)
>> {
>> +    PAGED_CODE();
>>     int notify;
>>     DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>>     SPICE_RING_PUSH(m_CursorRing, notify);
>> @@ -4736,8 +4912,10 @@ D3DDDIFORMAT PixelFormatFromBPP(UINT BPP)
>>     }
>> }
>> 
>> +__declspec(code_seg("PAGE"))
>> UINT SpiceFromPixelFormat(D3DDDIFORMAT Format)
>> {
>> +    PAGED_CODE();
>>     switch (Format)
>>     {
>>         case D3DDDIFMT_UNKNOWN:
>> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
>> index 24e0f64..8b90616 100755
>> --- a/qxldod/QxlDod.h
>> +++ b/qxldod/QxlDod.h
>> @@ -215,23 +215,37 @@ class QxlDod;
>> 
>> class HwDeviceInterface {
>> public:
>> +    __declspec(code_seg("PAGE"))
>>     virtual ~HwDeviceInterface() {;}
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS SetCurrentMode(ULONG Mode) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS GetCurrentMode(ULONG* Mode) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS HWClose(void) = 0;
>>     virtual BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_  ULONG MessageNumber) = 0;
>>     virtual VOID DpcRoutine(PVOID) = 0;
>>     virtual VOID ResetDevice(void) = 0;
>> 
>> +    __declspec(code_seg("PAGE"))
>>     virtual ULONG GetModeCount(void) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     PVIDEO_MODE_INFORMATION GetModeInfo(UINT idx) {return &m_ModeInfo[idx];}
>> +    __declspec(code_seg("PAGE"))
>>     USHORT GetModeNumber(USHORT idx) {return m_ModeNumbers[idx];}
>> +    __declspec(code_seg("PAGE"))
>>     USHORT GetCurrentModeIndex(void) {return m_CurrentMode;}
>> +    __declspec(code_seg("PAGE"))
>>     VOID SetCurrentModeIndex(USHORT idx) {m_CurrentMode = idx;}
>> +    __declspec(code_seg("PAGE"))
>>     virtual BOOLEAN EnablePointer(void) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS ExecutePresentDisplayOnly(_In_ BYTE*             DstAddr,
>>                                  _In_ UINT              DstBitPerPixel,
>>                                  _In_ BYTE*             SrcAddr,
>> @@ -243,13 +257,17 @@ public:
>>                                  _In_ RECT*             pDirtyRect,
>>                                  _In_ D3DKMDT_VIDPN_PRESENT_PATH_ROTATION Rotation,
>>                                  _In_ const CURRENT_BDD_MODE* pModeCur) = 0;
>> -
>> +    __declspec(code_seg("PAGE"))
>>     virtual VOID BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition) = 0;
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS Escape(_In_ CONST DXGKARG_ESCAPE* pEscap) = 0;
>>     ULONG GetId(void) { return m_Id; }
>> protected:
>> +    __declspec(code_seg("PAGE"))
>>     virtual NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
>> protected:
>>     QxlDod* m_pQxlDod;
>> @@ -265,16 +283,27 @@ class VgaDevice  :
>>     public HwDeviceInterface
>> {
>> public:
>> +    __declspec(code_seg("PAGE"))
>>     VgaDevice(_In_ QxlDod* pQxlDod);
>> +    __declspec(code_seg("PAGE"))
>>     ~VgaDevice(void);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetCurrentMode(ULONG Mode);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS GetCurrentMode(ULONG* Mode);
>> +    __declspec(code_seg("PAGE"))
>>     ULONG GetModeCount(void) {return m_ModeCount;}
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS HWClose(void);
>> +    __declspec(code_seg("PAGE"))
>>     BOOLEAN EnablePointer(void) { return TRUE; }
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS ExecutePresentDisplayOnly(_In_ BYTE*             DstAddr,
>>                                  _In_ UINT              DstBitPerPixel,
>>                                  _In_ BYTE*             SrcAddr,
>> @@ -286,16 +315,22 @@ public:
>>                                  _In_ RECT*             pDirtyRect,
>>                                  _In_ D3DKMDT_VIDPN_PRESENT_PATH_ROTATION Rotation,
>>                                  _In_ const CURRENT_BDD_MODE* pModeCur);
>> +    __declspec(code_seg("PAGE"))
>>     VOID BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod);
>>     BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_  ULONG MessageNumber);
>>     VOID DpcRoutine(PVOID);
>>     VOID ResetDevice(VOID);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS Escape(_In_ CONST DXGKARG_ESCAPE* pEscap);
>> protected:
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo);
>> private:
>> +    __declspec(code_seg("PAGE"))
>>     BOOL SetVideoModeInfo(UINT Idx, PVBE_MODEINFO pModeInfo);
>> };
>> 
>> @@ -438,16 +473,27 @@ class QxlDevice  :
>>     public HwDeviceInterface
>> {
>> public:
>> +    __declspec(code_seg("PAGE"))
>>     QxlDevice(_In_ QxlDod* pQxlDod);
>> +    __declspec(code_seg("PAGE"))
>>     ~QxlDevice(void);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QueryCurrentMode(PVIDEO_MODE RequestedMode);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetCurrentMode(ULONG Mode);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS GetCurrentMode(ULONG* Mode);
>> +    __declspec(code_seg("PAGE"))
>>     ULONG GetModeCount(void) {return m_ModeCount;}
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS HWClose(void);
>> +    __declspec(code_seg("PAGE"))
>>     BOOLEAN EnablePointer(void) { return FALSE; }
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS ExecutePresentDisplayOnly(_In_ BYTE*             DstAddr,
>>                     _In_ UINT              DstBitPerPixel,
>>                     _In_ BYTE*             SrcAddr,
>> @@ -459,83 +505,140 @@ public:
>>                     _In_ RECT*             pDirtyRect,
>>                     _In_ D3DKMDT_VIDPN_PRESENT_PATH_ROTATION Rotation,
>>                     _In_ const CURRENT_BDD_MODE* pModeCur);
>> +    __declspec(code_seg("PAGE"))
>>     VOID BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod);
>>     BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_  ULONG MessageNumber);
>>     VOID DpcRoutine(PVOID);
>>     VOID ResetDevice(VOID);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS Escape(_In_ CONST DXGKARG_ESCAPE* pEscap);
>> protected:
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo);
>> +    __declspec(code_seg("PAGE"))
>>     VOID BltBits (BLT_INFO* pDst,
>>                     CONST BLT_INFO* pSrc,
>>                     UINT  NumRects,
>>                     _In_reads_(NumRects) CONST RECT *pRects,
>>                     POINT*   pSourcePoint);
>> +    __declspec(code_seg("PAGE"))
>>     QXLDrawable *Drawable(UINT8 type,
>>                     CONST RECT *area,
>>                     CONST RECT *clip,
>>                     UINT32 surface_id);
>> +    __declspec(code_seg("PAGE"))
>>     void PushDrawable(QXLDrawable *drawable);
>> +    __declspec(code_seg("PAGE"))
>>     void PushCursorCmd(QXLCursorCmd *cursor_cmd);
>> +    __declspec(code_seg("PAGE"))
>>     QXLDrawable *GetDrawable();
>> +    __declspec(code_seg("PAGE"))
>>     QXLCursorCmd *CursorCmd();
>> +    __declspec(code_seg("PAGE"))
>>     void *AllocMem(UINT32 mspace_type, size_t size, BOOL force);
>>     VOID UpdateArea(CONST RECT* area, UINT32 surface_id);
>> +    __declspec(code_seg("PAGE"))
>>     VOID SetImageId(InternalImage *internal,
>>                     BOOL cache_me,
>>                     LONG width,
>>                     LONG height,
>>                     UINT8 format, UINT32 key);
>> private:
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QxlInit(DXGK_DISPLAY_INFORMATION* pDispInfo);
>> +    __declspec(code_seg("PAGE"))
>>     void QxlClose(void);
>> +    __declspec(code_seg("PAGE"))
>>     void UnmapMemory(void);
>> +    __declspec(code_seg("PAGE"))
>>     BOOL SetVideoModeInfo(UINT Idx, QXLMode* pModeInfo);
>> +    __declspec(code_seg("PAGE"))
>>     void UpdateVideoModeInfo(UINT Idx, UINT xres, UINT yres, UINT bpp);
>> +    __declspec(code_seg("PAGE"))
>>     BOOL InitMemSlots(void);
>> +    __declspec(code_seg("PAGE"))
>>     BOOL CreateMemSlots(void);
>> +    __declspec(code_seg("PAGE"))
>>     void DestroyMemSlots(void);
>> +    __declspec(code_seg("PAGE"))
>>     void CreatePrimarySurface(PVIDEO_MODE_INFORMATION pModeInfo);
>> +    __declspec(code_seg("PAGE"))
>>     void DestroyPrimarySurface(void);
>> +    __declspec(code_seg("PAGE"))
>>     void SetupHWSlot(UINT8 Idx, MemSlot *pSlot);
>> +    __declspec(code_seg("PAGE"))
>>     UINT8 SetupMemSlot(UINT8 Idx, UINT64 pastart, UINT64 paend, UINT64 vastart, UINT64 vaend);
>> +    __declspec(code_seg("PAGE"))
>>     BOOL CreateEvents(void);
>> +    __declspec(code_seg("PAGE"))
>>     BOOL CreateRings(void);
>> +    __declspec(code_seg("PAGE"))
>>     UINT64 VA(QXLPHYSICAL paddr, UINT8 slot_id);
>> +    __declspec(code_seg("PAGE"))
>>     QXLPHYSICAL PA(PVOID virt, UINT8 slot_id);
>> +    __declspec(code_seg("PAGE"))
>>     void InitDeviceMemoryResources(void);
>> +    __declspec(code_seg("PAGE"))
>>     void InitMonitorConfig();
>> +    __declspec(code_seg("PAGE"))
>>     void InitMspace(UINT32 mspace_type, UINT8 *start, size_t capacity);
>> +    __declspec(code_seg("PAGE"))
>>     void FlushReleaseRing();
>> +    __declspec(code_seg("PAGE"))
>>     void FreeMem(UINT32 mspace_type, void *ptr);
>> +    __declspec(code_seg("PAGE"))
>>     UINT64 ReleaseOutput(UINT64 output_id);
>> +    __declspec(code_seg("PAGE"))
>>     void WaitForReleaseRing(void);
>> +    __declspec(code_seg("PAGE"))
>>     void EmptyReleaseRing(void);
>> +    __declspec(code_seg("PAGE"))
>>     BOOL SetClip(const RECT *clip, QXLDrawable *drawable);
>> +    __declspec(code_seg("PAGE"))
>>     void AddRes(QXLOutput *output, Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void DrawableAddRes(QXLDrawable *drawable, Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void CursorCmdAddRes(QXLCursorCmd *cmd, Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void FreeClipRects(Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void static FreeClipRectsEx(Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void FreeBitmapImage(Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void static FreeBitmapImageEx(Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void static FreeCursorEx(Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void FreeCursor(Resource *res);
>> +    __declspec(code_seg("PAGE"))
>>     void WaitForCmdRing(void);
>> +    __declspec(code_seg("PAGE"))
>>     void PushCmd(void);
>> +    __declspec(code_seg("PAGE"))
>>     void WaitForCursorRing(void);
>> +    __declspec(code_seg("PAGE"))
>>     void PushCursor(void);
>> +    __declspec(code_seg("PAGE"))
>>     void PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr,
>>                             UINT8 **end_ptr, UINT8 *src, int size,
>>                             size_t alloc_size, uint32_t alignment);
>>     BOOLEAN static DpcCallbackEx(PVOID);
>>     void DpcCallback(PDPC_CB_CONTEXT);
>> +    __declspec(code_seg("PAGE"))
>>     void AsyncIo(UCHAR  Port, UCHAR Value);
>> +    __declspec(code_seg("PAGE"))
>>     void SyncIo(UCHAR  Port, UCHAR Value);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS UpdateChildStatus(BOOLEAN connect);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetCustomDisplay(QXLEscapeSetCustomDisplay* custom_display);
>> +    __declspec(code_seg("PAGE"))
>>     void SetMonitorConfig(QXLHead* monitor_config);
>> 
>> private:
>> @@ -606,37 +709,41 @@ private:
>>     DWORD m_VgaCompatible;
>>     DWORD m_PointerCaps;
>> public:
>> +    __declspec(code_seg("PAGE"))
>>     QxlDod(_In_ DEVICE_OBJECT* pPhysicalDeviceObject);
>> +    __declspec(code_seg("PAGE"))
>>     ~QxlDod(void);
>> -#pragma code_seg(push)
>> -#pragma code_seg()
>>     BOOLEAN IsDriverActive() const
>>     {
>>         return m_Flags.DriverStarted;
>>     }
>> -#pragma code_seg(pop)
>> -
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS StartDevice(_In_  DXGK_START_INFO*   pDxgkStartInfo,
>>                          _In_  DXGKRNL_INTERFACE* pDxgkInterface,
>>                          _Out_ ULONG*             pNumberOfViews,
>>                          _Out_ ULONG*             pNumberOfChildren);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS StopDevice(VOID);
>>     // Must be Non-Paged
>>     VOID ResetDevice(VOID);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS DispatchIoRequest(_In_  ULONG VidPnSourceId,
>>                                _In_  VIDEO_REQUEST_PACKET* pVideoRequestPacket);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPowerState(_In_  ULONG HardwareUid,
>>                                _In_  DEVICE_POWER_STATE DevicePowerState,
>>                                _In_  POWER_ACTION       ActionType);
>>     // Report back child capabilities
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QueryChildRelations(_Out_writes_bytes_(ChildRelationsSize) DXGK_CHILD_DESCRIPTOR* pChildRelations,
>>                                  _In_                             ULONG                  ChildRelationsSize);
>> -
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QueryChildStatus(_Inout_ DXGK_CHILD_STATUS* pChildStatus,
>>                               _In_    BOOLEAN            NonDestructiveOnly);
>> 
>>     // Return EDID if previously retrieved
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QueryDeviceDescriptor(_In_    ULONG                   ChildUid,
>>                                    _Inout_ DXGK_DEVICE_DESCRIPTOR* pDeviceDescriptor);
>> 
>> @@ -647,37 +754,53 @@ public:
>>     VOID DpcRoutine(VOID);
>> 
>>     // Return DriverCaps, doesn't support other queries though
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO* pQueryAdapterInfo);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS Escape(_In_ CONST DXGKARG_ESCAPE* pEscape);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS PresentDisplayOnly(_In_ CONST DXGKARG_PRESENT_DISPLAYONLY* pPresentDisplayOnly);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QueryInterface(_In_ CONST PQUERY_INTERFACE     QueryInterface);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS IsSupportedVidPn(_Inout_ DXGKARG_ISSUPPORTEDVIDPN* pIsSupportedVidPn);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS RecommendFunctionalVidPn(_In_ CONST DXGKARG_RECOMMENDFUNCTIONALVIDPN* CONST pRecommendFunctionalVidPn);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS RecommendVidPnTopology(_In_ CONST DXGKARG_RECOMMENDVIDPNTOPOLOGY* CONST pRecommendVidPnTopology);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS RecommendMonitorModes(_In_ CONST DXGKARG_RECOMMENDMONITORMODES* CONST pRecommendMonitorModes);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS EnumVidPnCofuncModality(_In_ CONST DXGKARG_ENUMVIDPNCOFUNCMODALITY* CONST pEnumCofuncModality);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetVidPnSourceVisibility(_In_ CONST DXGKARG_SETVIDPNSOURCEVISIBILITY* pSetVidPnSourceVisibility);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS CommitVidPn(_In_ CONST DXGKARG_COMMITVIDPN* CONST pCommitVidPn);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS UpdateActiveVidPnPresentPath(_In_ CONST DXGKARG_UPDATEACTIVEVIDPNPRESENTPATH* CONST pUpdateActiveVidPnPresentPath);
>> 
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS QueryVidPnHWCapability(_Inout_ DXGKARG_QUERYVIDPNHWCAPABILITY* pVidPnHWCaps);
>> 
>>     // Part of PnPStop (PnP instance only), returns current mode information (which will be passed to fallback instance by dxgkrnl)
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS StopDeviceAndReleasePostDisplayOwnership(_In_  D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
>>                                                       _Out_ DXGK_DISPLAY_INFORMATION*      pDisplayInfo);
>> 
>> @@ -699,39 +822,52 @@ public:
>>                                  _In_                                     INT   PositionY);
>>     PDXGKRNL_INTERFACE GetDxgkInterface(void) { return &m_DxgkInterface;}
>> private:
>> +    __declspec(code_seg("PAGE"))
>>     VOID CleanUp(VOID);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS CheckHardware();
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS WriteHWInfoStr(_In_ HANDLE DevInstRegKeyHandle, _In_ PCWSTR pszwValueName, _In_ PCSTR pszValue);
>>     // Set the given source mode on the given path
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS SetSourceModeAndPath(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode,
>>                                   CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath);
>> 
>>     // Add the current mode to the given monitor source mode set
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS AddSingleMonitorMode(_In_ CONST DXGKARG_RECOMMENDMONITORMODES* CONST pRecommendMonitorModes);
>> 
>>     // Add the current mode to the given VidPn source mode set
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS AddSingleSourceMode(_In_ CONST DXGK_VIDPNSOURCEMODESET_INTERFACE* pVidPnSourceModeSetInterface,
>>                                  D3DKMDT_HVIDPNSOURCEMODESET hVidPnSourceModeSet,
>>                                  D3DDDI_VIDEO_PRESENT_SOURCE_ID SourceId);
>> 
>>     // Add the current mode (or the matching to pinned source mode) to the give VidPn target mode set
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS AddSingleTargetMode(_In_ CONST DXGK_VIDPNTARGETMODESET_INTERFACE* pVidPnTargetModeSetInterface,
>>                                  D3DKMDT_HVIDPNTARGETMODESET hVidPnTargetModeSet,
>>                                  _In_opt_ CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnPinnedSourceModeInfo,
>>                                  D3DDDI_VIDEO_PRESENT_SOURCE_ID SourceId);
>>     D3DDDI_VIDEO_PRESENT_SOURCE_ID FindSourceForTarget(D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId, BOOLEAN DefaultToZero);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS IsVidPnSourceModeFieldsValid(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode) const;
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS IsVidPnPathFieldsValid(CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath) const;
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS RegisterHWInfo(_In_ ULONG Id);
>> +    __declspec(code_seg("PAGE"))
>>     NTSTATUS ReadConfiguration();
>> };
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS
>> MapFrameBuffer(
>>     _In_                PHYSICAL_ADDRESS    PhysicalAddress,
>>     _In_                ULONG               Length,
>>     _Outptr_result_bytebuffer_(Length) VOID**              VirtualAddress);
>> 
>> +__declspec(code_seg("PAGE"))
>> NTSTATUS
>> UnmapFrameBuffer(
>>     _In_reads_bytes_(Length) VOID* VirtualAddress,
>> @@ -739,6 +875,7 @@ UnmapFrameBuffer(
>> 
>> UINT BPPFromPixelFormat(D3DDDIFORMAT Format);
>> D3DDDIFORMAT PixelFormatFromBPP(UINT BPP);
>> +__declspec(code_seg("PAGE"))
>> UINT SpiceFromPixelFormat(D3DDDIFORMAT Format);
>> 
>> VOID CopyBitsGeneric(
>> -- 
>> 2.7.4
>> 
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/spice-devel



More information about the Spice-devel mailing list