<div dir="ltr">This is extremely dangerous!, this can be working without any errors most of the time but in a rare cases this could<div>cause a crash - in case a non pageable function made pageable by this patch - which can be hard to troubleshoot!</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 28, 2016 at 4:55 PM, Frediano Ziglio <span dir="ltr"><<a href="mailto:fziglio@redhat.com" target="_blank">fziglio@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This make sure that these function goes into the non<br>
paged section.<br>
Also this change is much shorter than marking code if<br>
can be paged as almost code can be paged.<br>
It's also coherent with other source files.<br>
<br>
Signed-off-by: Frediano Ziglio <<a href="mailto:fziglio@redhat.com">fziglio@redhat.com</a>><br>
---<br>
qxldod/QxlDod.cpp | 39 ++++++++++++++++++++++++------<wbr>---------<br>
qxldod/QxlDod.h | 50 ++++++++++++++++++++++++++----<wbr>--------------------<br>
2 files changed, 50 insertions(+), 39 deletions(-)<br>
<br>
diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp<br>
index d7830e5..b890a9a 100755<br>
--- a/qxldod/QxlDod.cpp<br>
+++ b/qxldod/QxlDod.cpp<br>
@@ -2,8 +2,7 @@<br>
#include "qxldod.h"<br>
#include "qxl_windows.h"<br>
<br>
-#pragma code_seg(push)<br>
-#pragma code_seg()<br>
+#pragma code_seg("PAGE")<br>
<br>
#define WIN_QXL_INT_MASK ((QXL_INTERRUPT_DISPLAY) | \<br>
(QXL_INTERRUPT_CURSOR) | \<br>
@@ -47,8 +46,6 @@ BYTE PixelMask[BITS_PER_BYTE] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01<br>
((ULONG)LOWER_5_BITS((Pixel)) << SHIFT_LOWER_5_IN_565_BACK))<br>
<br>
<br>
-#pragma code_seg(pop)<br>
-<br>
struct QXLEscape {<br>
uint32_t ioctl;<br>
union {<br>
@@ -1645,9 +1642,7 @@ NTSTATUS QxlDod::<wbr>UpdateActiveVidPnPresentPath(_<wbr>In_ CONST DXGKARG_UPDATEACTIVEVID<br>
//<br>
// Non-Paged Code<br>
//<br>
-#pragma code_seg(push)<br>
-#pragma code_seg()<br>
-<br>
+QXL_NON_PAGED<br>
VOID QxlDod::DpcRoutine(VOID)<br>
{<br>
DbgPrint(TRACE_LEVEL_<wbr>INFORMATION, ("---> %s\n", __FUNCTION__));<br>
@@ -1656,6 +1651,7 @@ VOID QxlDod::DpcRoutine(VOID)<br>
DbgPrint(TRACE_LEVEL_<wbr>INFORMATION, ("<--- %s\n", __FUNCTION__));<br>
}<br>
<br>
+QXL_NON_PAGED<br>
BOOLEAN QxlDod::InterruptRoutine(_In_ ULONG MessageNumber)<br>
{<br>
DbgPrint(TRACE_LEVEL_<wbr>INFORMATION, ("<--> 0 %s\n", __FUNCTION__));<br>
@@ -1665,6 +1661,7 @@ BOOLEAN QxlDod::InterruptRoutine(_In_ ULONG MessageNumber)<br>
return FALSE;<br>
}<br>
<br>
+QXL_NON_PAGED<br>
VOID QxlDod::ResetDevice(VOID)<br>
{<br>
DbgPrint(TRACE_LEVEL_VERBOSE, ("<---> %s\n", __FUNCTION__));<br>
@@ -1672,6 +1669,7 @@ VOID QxlDod::ResetDevice(VOID)<br>
}<br>
<br>
// Must be Non-Paged, as it sets up the display for a bugcheck<br>
+QXL_NON_PAGED<br>
NTSTATUS QxlDod::SystemDisplayEnable(_<wbr>In_ D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,<br>
_In_ PDXGKARG_SYSTEM_DISPLAY_<wbr>ENABLE_FLAGS Flags,<br>
_Out_ UINT* pWidth,<br>
@@ -1728,6 +1726,7 @@ NTSTATUS QxlDod::SystemDisplayEnable(_<wbr>In_ D3DDDI_VIDEO_PRESENT_TARGET_ID Target<br>
}<br>
<br>
// Must be Non-Paged, as it is called to display the bugcheck screen<br>
+QXL_NON_PAGED<br>
VOID QxlDod::SystemDisplayWrite(_<wbr>In_reads_bytes_(SourceHeight * SourceStride) VOID* pSource,<br>
_In_ UINT SourceWidth,<br>
_In_ UINT SourceHeight,<br>
@@ -1774,7 +1773,7 @@ VOID QxlDod::SystemDisplayWrite(_<wbr>In_reads_bytes_(SourceHeight * SourceStride) VO<br>
<br>
}<br>
<br>
-#pragma code_seg(pop) // End Non-Paged Code<br>
+// End Non-Paged Code<br>
<br>
NTSTATUS QxlDod::WriteHWInfoStr(_In_ HANDLE DevInstRegKeyHandle, _In_ PCWSTR pszwValueName, _In_ PCSTR pszValue)<br>
{<br>
@@ -1949,11 +1948,7 @@ NTSTATUS QxlDod::ReadConfiguration()<br>
return Status;<br>
}<br>
<br>
-//<br>
-// Non-Paged Code<br>
-//<br>
-#pragma code_seg(push)<br>
-#pragma code_seg()<br>
+QXL_NON_PAGED<br>
D3DDDI_VIDEO_PRESENT_SOURCE_ID QxlDod::FindSourceForTarget(<wbr>D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId, BOOLEAN DefaultToZero)<br>
{<br>
UNREFERENCED_PARAMETER(<wbr>TargetId);<br>
@@ -1968,8 +1963,6 @@ D3DDDI_VIDEO_PRESENT_SOURCE_ID QxlDod::FindSourceForTarget(<wbr>D3DDDI_VIDEO_PRESENT_<br>
return DefaultToZero ? 0 : D3DDDI_ID_UNINITIALIZED;<br>
}<br>
<br>
-#pragma code_seg(pop) // End Non-Paged Code<br>
-<br>
//<br>
// Frame buffer map/unmap<br>
//<br>
@@ -2049,6 +2042,7 @@ UnmapFrameBuffer(<br>
<br>
// HW specific code<br>
<br>
+QXL_NON_PAGED<br>
VOID GetPitches(_In_ CONST BLT_INFO* pBltInfo, _Out_ LONG* pPixelPitch, _Out_ LONG* pRowPitch)<br>
{<br>
switch (pBltInfo->Rotation)<br>
@@ -2087,6 +2081,7 @@ VOID GetPitches(_In_ CONST BLT_INFO* pBltInfo, _Out_ LONG* pPixelPitch, _Out_ LO<br>
}<br>
}<br>
<br>
+QXL_NON_PAGED<br>
BYTE* GetRowStart(_In_ CONST BLT_INFO* pBltInfo, CONST RECT* pRect)<br>
{<br>
BYTE* pRet = NULL;<br>
@@ -2150,6 +2145,7 @@ BYTE* GetRowStart(_In_ CONST BLT_INFO* pBltInfo, CONST RECT* pRect)<br>
*<br>
\*****************************<wbr>******************************<wbr>***************/<br>
<br>
+QXL_NON_PAGED<br>
VOID CopyBitsGeneric(<br>
BLT_INFO* pDst,<br>
CONST BLT_INFO* pSrc,<br>
@@ -2244,6 +2240,7 @@ VOID CopyBitsGeneric(<br>
}<br>
<br>
<br>
+QXL_NON_PAGED<br>
VOID CopyBits32_32(<br>
BLT_INFO* pDst,<br>
CONST BLT_INFO* pSrc,<br>
@@ -2285,6 +2282,7 @@ VOID CopyBits32_32(<br>
}<br>
<br>
<br>
+QXL_NON_PAGED<br>
VOID BltBits (<br>
BLT_INFO* pDst,<br>
CONST BLT_INFO* pSrc,<br>
@@ -2913,6 +2911,7 @@ VOID VgaDevice::BlackOutScreen(<wbr>CURRENT_BDD_MODE* pCurrentBddMod)<br>
pCurrentBddMod->ZeroedOutEnd.<wbr>QuadPart = NewPhysAddrEnd.QuadPart;<br>
}<br>
<br>
+QXL_NON_PAGED<br>
BOOLEAN VgaDevice::InterruptRoutine(_<wbr>In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_ ULONG MessageNumber)<br>
{<br>
UNREFERENCED_PARAMETER(<wbr>pDxgkInterface);<br>
@@ -2920,10 +2919,12 @@ BOOLEAN VgaDevice::InterruptRoutine(_<wbr>In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_<br>
return FALSE;<br>
}<br>
<br>
+QXL_NON_PAGED<br>
VOID VgaDevice::DpcRoutine(PVOID)<br>
{<br>
}<br>
<br>
+QXL_NON_PAGED<br>
VOID VgaDevice::ResetDevice(VOID)<br>
{<br>
}<br>
@@ -3652,6 +3653,7 @@ void QxlDevice::InitMspace(UINT32 mspace_type, UINT8 *start, size_t capacity)<br>
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s _mspace = %p\n", __FUNCTION__, m_MSInfo[mspace_type]._mspace)<wbr>);<br>
}<br>
<br>
+QXL_NON_PAGED<br>
void QxlDevice::ResetDevice(void)<br>
{<br>
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));<br>
@@ -4717,6 +4719,7 @@ VOID QxlDevice::PushCursor(VOID)<br>
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s notify = %d\n", __FUNCTION__, notify));<br>
}<br>
<br>
+QXL_NON_PAGED<br>
BOOLEAN QxlDevice::InterruptRoutine(_<wbr>In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_ ULONG MessageNumber)<br>
{<br>
UNREFERENCED_PARAMETER(<wbr>MessageNumber);<br>
@@ -4737,6 +4740,7 @@ BOOLEAN QxlDevice::InterruptRoutine(_<wbr>In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_<br>
return TRUE;<br>
}<br>
<br>
+QXL_NON_PAGED<br>
VOID QxlDevice::DpcRoutine(PVOID ptr)<br>
{<br>
PDXGKRNL_INTERFACE pDxgkInterface = (PDXGKRNL_INTERFACE)ptr;<br>
@@ -4773,6 +4777,7 @@ VOID QxlDevice::DpcRoutine(PVOID ptr)<br>
<br>
VOID QxlDevice::UpdateArea(CONST RECT* area, UINT32 surface_id)<br>
{<br>
+ PAGED_CODE();<br>
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));<br>
CopyRect(&m_RamHdr->update_<wbr>area, area);<br>
m_RamHdr->update_surface = surface_id;<br>
@@ -4781,6 +4786,7 @@ VOID QxlDevice::UpdateArea(CONST RECT* area, UINT32 surface_id)<br>
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));<br>
}<br>
<br>
+QXL_NON_PAGED<br>
BOOLEAN QxlDevice:: DpcCallbackEx(PVOID ptr)<br>
{<br>
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--> %s\n", __FUNCTION__));<br>
@@ -4790,6 +4796,7 @@ BOOLEAN QxlDevice:: DpcCallbackEx(PVOID ptr)<br>
return TRUE;<br>
}<br>
<br>
+QXL_NON_PAGED<br>
VOID QxlDevice::DpcCallback(PDPC_<wbr>CB_CONTEXT ctx)<br>
{<br>
ctx->data = m_Pending;<br>
@@ -4797,6 +4804,7 @@ VOID QxlDevice::DpcCallback(PDPC_<wbr>CB_CONTEXT ctx)<br>
<br>
}<br>
<br>
+QXL_NON_PAGED<br>
UINT BPPFromPixelFormat(<wbr>D3DDDIFORMAT Format)<br>
{<br>
switch (Format)<br>
@@ -4812,6 +4820,7 @@ UINT BPPFromPixelFormat(<wbr>D3DDDIFORMAT Format)<br>
}<br>
<br>
// Given bits per pixel, return the pixel format at the same bpp<br>
+QXL_NON_PAGED<br>
D3DDDIFORMAT PixelFormatFromBPP(UINT BPP)<br>
{<br>
switch (BPP)<br>
diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h<br>
index bf16724..90d7937 100755<br>
--- a/qxldod/QxlDod.h<br>
+++ b/qxldod/QxlDod.h<br>
@@ -14,6 +14,8 @@<br>
#define QXL_BPP 32<br>
#define VGA_BPP 24<br>
<br>
+#define QXL_NON_PAGED __declspec(code_seg(".text"))<br>
+<br>
typedef struct _QXL_FLAGS<br>
{<br>
UINT DriverStarted : 1; // ( 1) 1 after StartDevice and 0 after StopDevice<br>
@@ -222,9 +224,9 @@ public:<br>
virtual NTSTATUS SetPowerState(DEVICE_POWER_<wbr>STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;<br>
virtual NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;<br>
virtual NTSTATUS HWClose(void) = 0;<br>
- virtual BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_ ULONG MessageNumber) = 0;<br>
- virtual VOID DpcRoutine(PVOID) = 0;<br>
- virtual VOID ResetDevice(void) = 0;<br>
+ QXL_NON_PAGED virtual BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_ ULONG MessageNumber) = 0;<br>
+ QXL_NON_PAGED virtual VOID DpcRoutine(PVOID) = 0;<br>
+ QXL_NON_PAGED virtual VOID ResetDevice(void) = 0;<br>
virtual NTSTATUS AcquireFrameBuffer(CURRENT_<wbr>BDD_MODE* pCurrentBddMode) { return STATUS_SUCCESS; }<br>
virtual NTSTATUS ReleaseFrameBuffer(CURRENT_<wbr>BDD_MODE* pCurrentBddMode) { return STATUS_SUCCESS; }<br>
<br>
@@ -289,9 +291,9 @@ public:<br>
_In_ D3DKMDT_VIDPN_PRESENT_PATH_<wbr>ROTATION Rotation,<br>
_In_ const CURRENT_BDD_MODE* pModeCur);<br>
VOID BlackOutScreen(CURRENT_BDD_<wbr>MODE* pCurrentBddMod);<br>
- BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_ ULONG MessageNumber);<br>
- VOID DpcRoutine(PVOID);<br>
- VOID ResetDevice(VOID);<br>
+ QXL_NON_PAGED BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_ ULONG MessageNumber);<br>
+ QXL_NON_PAGED VOID DpcRoutine(PVOID);<br>
+ QXL_NON_PAGED VOID ResetDevice(VOID);<br>
NTSTATUS AcquireFrameBuffer(CURRENT_<wbr>BDD_MODE* pCurrentBddMode);<br>
NTSTATUS ReleaseFrameBuffer(CURRENT_<wbr>BDD_MODE* pCurrentBddMode);<br>
NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape);<br>
@@ -464,9 +466,9 @@ public:<br>
_In_ D3DKMDT_VIDPN_PRESENT_PATH_<wbr>ROTATION Rotation,<br>
_In_ const CURRENT_BDD_MODE* pModeCur);<br>
VOID BlackOutScreen(CURRENT_BDD_<wbr>MODE* pCurrentBddMod);<br>
- BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_ ULONG MessageNumber);<br>
- VOID DpcRoutine(PVOID);<br>
- VOID ResetDevice(VOID);<br>
+ QXL_NON_PAGED BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_ ULONG MessageNumber);<br>
+ QXL_NON_PAGED VOID DpcRoutine(PVOID);<br>
+ QXL_NON_PAGED VOID ResetDevice(VOID);<br>
NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPointerShape);<br>
NTSTATUS SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pSetPointerPosition);<br>
NTSTATUS Escape(_In_ CONST DXGKARG_ESCAPE* pEscap);<br>
@@ -534,8 +536,8 @@ private:<br>
void PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr,<br>
UINT8 **end_ptr, UINT8 *src, int size,<br>
size_t alloc_size, uint32_t alignment);<br>
- BOOLEAN static DpcCallbackEx(PVOID);<br>
- void DpcCallback(PDPC_CB_CONTEXT);<br>
+ QXL_NON_PAGED BOOLEAN static DpcCallbackEx(PVOID);<br>
+ QXL_NON_PAGED void DpcCallback(PDPC_CB_CONTEXT);<br>
void AsyncIo(UCHAR Port, UCHAR Value);<br>
void SyncIo(UCHAR Port, UCHAR Value);<br>
NTSTATUS UpdateChildStatus(BOOLEAN connect);<br>
@@ -628,7 +630,7 @@ public:<br>
_Out_ ULONG* pNumberOfChildren);<br>
NTSTATUS StopDevice(VOID);<br>
// Must be Non-Paged<br>
- VOID ResetDevice(VOID);<br>
+ QXL_NON_PAGED VOID ResetDevice(VOID);<br>
<br>
NTSTATUS DispatchIoRequest(_In_ ULONG VidPnSourceId,<br>
_In_ VIDEO_REQUEST_PACKET* pVideoRequestPacket);<br>
@@ -648,9 +650,9 @@ public:<br>
<br>
// Must be Non-Paged<br>
// BDD doesn't have interrupts, so just returns false<br>
- BOOLEAN InterruptRoutine(_In_ ULONG MessageNumber);<br>
+ QXL_NON_PAGED BOOLEAN InterruptRoutine(_In_ ULONG MessageNumber);<br>
<br>
- VOID DpcRoutine(VOID);<br>
+ QXL_NON_PAGED VOID DpcRoutine(VOID);<br>
<br>
// Return DriverCaps, doesn't support other queries though<br>
NTSTATUS QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO* pQueryAdapterInfo);<br>
@@ -689,7 +691,7 @@ public:<br>
<br>
// Must be Non-Paged<br>
// Call to initialize as part of bugcheck<br>
- NTSTATUS SystemDisplayEnable(_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,<br>
+ QXL_NON_PAGED NTSTATUS SystemDisplayEnable(_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,<br>
_In_ PDXGKARG_SYSTEM_DISPLAY_<wbr>ENABLE_FLAGS Flags,<br>
_Out_ UINT* pWidth,<br>
_Out_ UINT* pHeight,<br>
@@ -697,7 +699,7 @@ public:<br>
<br>
// Must be Non-Paged<br>
// Write out pixels as part of bugcheck<br>
- VOID SystemDisplayWrite(_In_reads_<wbr>bytes_(SourceHeight * SourceStride) VOID* pSource,<br>
+ QXL_NON_PAGED VOID SystemDisplayWrite(_In_reads_<wbr>bytes_(SourceHeight * SourceStride) VOID* pSource,<br>
_In_ UINT SourceWidth,<br>
_In_ UINT SourceHeight,<br>
_In_ UINT SourceStride,<br>
@@ -725,7 +727,7 @@ private:<br>
D3DKMDT_HVIDPNTARGETMODESET hVidPnTargetModeSet,<br>
_In_opt_ CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnPinnedSourceModeInfo,<br>
D3DDDI_VIDEO_PRESENT_SOURCE_ID SourceId);<br>
- D3DDDI_VIDEO_PRESENT_SOURCE_ID FindSourceForTarget(D3DDDI_<wbr>VIDEO_PRESENT_TARGET_ID TargetId, BOOLEAN DefaultToZero);<br>
+ QXL_NON_PAGED D3DDDI_VIDEO_PRESENT_SOURCE_ID FindSourceForTarget(D3DDDI_<wbr>VIDEO_PRESENT_TARGET_ID TargetId, BOOLEAN DefaultToZero);<br>
NTSTATUS IsVidPnSourceModeFieldsValid(<wbr>CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode) const;<br>
NTSTATUS IsVidPnPathFieldsValid(CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath) const;<br>
NTSTATUS RegisterHWInfo(_In_ ULONG Id);<br>
@@ -743,26 +745,26 @@ UnmapFrameBuffer(<br>
_In_reads_bytes_(Length) VOID* VirtualAddress,<br>
_In_ ULONG Length);<br>
<br>
-UINT BPPFromPixelFormat(<wbr>D3DDDIFORMAT Format);<br>
-D3DDDIFORMAT PixelFormatFromBPP(UINT BPP);<br>
+QXL_NON_PAGED UINT BPPFromPixelFormat(<wbr>D3DDDIFORMAT Format);<br>
+QXL_NON_PAGED D3DDDIFORMAT PixelFormatFromBPP(UINT BPP);<br>
UINT SpiceFromPixelFormat(<wbr>D3DDDIFORMAT Format);<br>
<br>
-VOID CopyBitsGeneric(<br>
+QXL_NON_PAGED VOID CopyBitsGeneric(<br>
BLT_INFO* pDst,<br>
CONST BLT_INFO* pSrc,<br>
UINT NumRects,<br>
_In_reads_(NumRects) CONST RECT *pRects);<br>
<br>
-VOID CopyBits32_32(<br>
+QXL_NON_PAGED VOID CopyBits32_32(<br>
BLT_INFO* pDst,<br>
CONST BLT_INFO* pSrc,<br>
UINT NumRects,<br>
_In_reads_(NumRects) CONST RECT *pRects);<br>
-VOID BltBits (<br>
+QXL_NON_PAGED VOID BltBits (<br>
BLT_INFO* pDst,<br>
CONST BLT_INFO* pSrc,<br>
UINT NumRects,<br>
_In_reads_(NumRects) CONST RECT *pRects);<br>
<br>
-BYTE* GetRowStart(_In_ CONST BLT_INFO* pBltInfo, CONST RECT* pRect);<br>
-VOID GetPitches(_In_ CONST BLT_INFO* pBltInfo, _Out_ LONG* pPixelPitch, _Out_ LONG* pRowPitch);<br>
+QXL_NON_PAGED BYTE* GetRowStart(_In_ CONST BLT_INFO* pBltInfo, CONST RECT* pRect);<br>
+QXL_NON_PAGED VOID GetPitches(_In_ CONST BLT_INFO* pBltInfo, _Out_ LONG* pPixelPitch, _Out_ LONG* pRowPitch);<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.7.4<br>
<br>
______________________________<wbr>_________________<br>
Spice-devel mailing list<br>
<a href="mailto:Spice-devel@lists.freedesktop.org">Spice-devel@lists.freedesktop.<wbr>org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/spice-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/spice-devel</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><font size="4" color="#0b5394" face="times new roman, serif">Respectfully,<br></font><div style="font-size:12.8px;color:rgb(136,136,136)"><font size="4" color="#0b5394" face="times new roman, serif"><b><i>Sameeh Jubran</i></b></font></div><div style="font-size:12.8px;color:rgb(136,136,136)"><i style="color:rgb(7,55,99);font-family:"times new roman",serif;font-size:large"><span style="line-height:15px"><a href="https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a" title="View public profile" name="UNIQUE_ID_SafeHtmlFilter_UNIQUE_ID_SafeHtmlFilter_UNIQUE_ID_SafeHtmlFilter_UNIQUE_ID_SafeHtmlFilter_14e2c1de96f8c195_UNIQUE_ID_SafeHtmlFilter_SafeHtmlFilter_SafeHtmlFilter_webProfileURL" style="color:rgb(17,85,204);margin:0px;padding:0px;border-width:0px;outline:none;vertical-align:baseline;text-decoration:none" target="_blank">Linkedin</a></span></i><br></div><div style="font-size:12.8px;color:rgb(136,136,136)"><font size="4" face="times new roman, serif" color="#073763"><i>Junior Software Engineer @ <a href="http://www.daynix.com" target="_blank">Daynix</a>.</i></font></div></div></div></div></div></div></div>
</div>