Hi all,
I'm giving in to the idea of having two dc_attrs.
From, Windows Graphics Programming Win32 GDI and DirectDraw -> 3.8 GDI KERNEL MODE DATA
STRUCTURE ->
Device Context in the GDI Engine, second to the last paragraph:
Field pdcattr points to the DC_ATTR structure for that device context in user mode address
space,
which contains most device context settings. The DCOBJ structure has a duplication of it
in its
dcAttr field. It's possible the GDI designers want setting DC attributes to be
efficient, with as
little kernel mode code involvement as possible. This requires a DC_ATTR structure in user
mode. But
they also want to be able to access it easily in kernel mode, which requires a copy of
DC_ATTR in
kernel mode. Certain flags may be used to synchronize the two copies of DC_ATTR.
typedef struct
{
// ......snip......
void * pdcattr; // point to user mode DCATTR
DCLEVEL dcLevel; // 0x030 0x1B8(440) bytes
DC_ATTR dcAttr; // 0x1C8(456) bytes
// ......snip......
} DCOBJ;
I did set up Ros DC structure to have the dc_attr pointer stored. I guess it's time to
move the old
WIN_DC_INFO stuff over to the new kernel mode dc_attr and use the dirty flags for
synchronizing.
This will fix my memory access problems too. I did an experiment to test the idea of just
copy if it
was dirty and all my problems went away.
FYI,
James